| 1 | #ifndef OPENGL_H |
| 2 | #define OPENGL_H |
| 3 | |
| 4 | #include <GLES2/gl2.h> |
| 5 | #include <GLES2/gl2ext.h> |
| 6 | #include "gSP.h" |
| 7 | |
| 8 | #ifdef USE_SDL |
| 9 | // #include <EGL/egl.h> // Android 2.3 only |
| 10 | // #include <GLES2/gl2extimg.h> |
| 11 | #include <SDL.h> |
| 12 | #endif |
| 13 | |
| 14 | #ifndef min |
| 15 | #define min(a,b) ((a) < (b) ? (a) : (b)) |
| 16 | #endif |
| 17 | #ifndef max |
| 18 | #define max(a,b) ((a) > (b) ? (a) : (b)) |
| 19 | #endif |
| 20 | |
| 21 | #define RS_NONE 0 |
| 22 | #define RS_TRIANGLE 1 |
| 23 | #define RS_RECT 2 |
| 24 | #define RS_TEXTUREDRECT 3 |
| 25 | #define RS_LINE 4 |
| 26 | |
| 27 | |
| 28 | #define SCREEN_UPDATE_AT_VI_UPDATE 1 |
| 29 | #define SCREEN_UPDATE_AT_VI_CHANGE 2 |
| 30 | #define SCREEN_UPDATE_AT_CI_CHANGE 3 |
| 31 | #define SCREEN_UPDATE_AT_1ST_CI_CHANGE 4 |
| 32 | #define SCREEN_UPDATE_AT_1ST_PRIMITIVE 5 |
| 33 | #define SCREEN_UPDATE_BEFORE_SCREEN_CLEAR 6 |
| 34 | #define SCREEN_UPDATE_AT_VI_UPDATE_AND_DRAWN 7 |
| 35 | |
| 36 | |
| 37 | #define BLEND_NOOP 0x0000 |
| 38 | #define BLEND_NOOP5 0xcc48 // Fog * 0 + Mem * 1 |
| 39 | #define BLEND_NOOP4 0xcc08 // Fog * 0 + In * 1 |
| 40 | #define BLEND_FOG_ASHADE 0xc800 |
| 41 | #define BLEND_FOG_3 0xc000 // Fog * AIn + In * 1-A |
| 42 | #define BLEND_FOG_MEM 0xc440 // Fog * AFog + Mem * 1-A |
| 43 | #define BLEND_FOG_APRIM 0xc400 // Fog * AFog + In * 1-A |
| 44 | #define BLEND_BLENDCOLOR 0x8c88 |
| 45 | #define BLEND_BI_AFOG 0x8400 // Bl * AFog + In * 1-A |
| 46 | #define BLEND_BI_AIN 0x8040 // Bl * AIn + Mem * 1-A |
| 47 | #define BLEND_MEM 0x4c40 // Mem*0 + Mem*(1-0)?! |
| 48 | #define BLEND_FOG_MEM_3 0x44c0 // Mem * AFog + Fog * 1-A |
| 49 | #define BLEND_NOOP3 0x0c48 // In * 0 + Mem * 1 |
| 50 | #define BLEND_PASS 0x0c08 // In * 0 + In * 1 |
| 51 | #define BLEND_FOG_MEM_IN_MEM 0x0440 // In * AFog + Mem * 1-A |
| 52 | #define BLEND_FOG_MEM_FOG_MEM 0x04c0 // In * AFog + Fog * 1-A |
| 53 | #define BLEND_OPA 0x0044 // In * AIn + Mem * AMem |
| 54 | #define BLEND_XLU 0x0040 |
| 55 | #define BLEND_MEM_ALPHA_IN 0x4044 // Mem * AIn + Mem * AMem |
| 56 | |
| 57 | |
| 58 | #define OGL_FRAMETIME_NUM 8 |
| 59 | |
| 60 | struct GLVertex |
| 61 | { |
| 62 | float x, y, z, w; |
| 63 | struct |
| 64 | { |
| 65 | float r, g, b, a; |
| 66 | } color, secondaryColor; |
| 67 | float s0, t0, s1, t1; |
| 68 | }; |
| 69 | |
| 70 | struct GLcolor |
| 71 | { |
| 72 | float r, g, b, a; |
| 73 | }; |
| 74 | |
| 75 | struct GLInfo |
| 76 | { |
| 77 | #ifdef USE_SDL |
| 78 | // TODO: More EGL stuff, need to do this in Java |
| 79 | SDL_Surface *hScreen; // TODO: Do we really need this? Only using it in one place AFAICT.. |
| 80 | /* |
| 81 | struct |
| 82 | { |
| 83 | EGLint version_major, version_minor; |
| 84 | EGLDisplay display; |
| 85 | EGLContext context; |
| 86 | EGLConfig config; |
| 87 | EGLSurface surface; |
| 88 | EGLNativeDisplayType device; |
| 89 | EGLNativeWindowType handle; |
| 90 | } EGL; |
| 91 | */ |
| 92 | #endif |
| 93 | |
| 94 | bool screenUpdate; |
| 95 | |
| 96 | struct |
| 97 | { |
| 98 | GLuint fb,depth_buffer, color_buffer; |
| 99 | } framebuffer; |
| 100 | |
| 101 | |
| 102 | int frameSkipped; |
| 103 | unsigned consecutiveSkips; |
| 104 | unsigned frameTime[OGL_FRAMETIME_NUM]; |
| 105 | |
| 106 | int frame_vsync, frame_actual, frame_dl; |
| 107 | int frame_prevdl; |
| 108 | int mustRenderDlist; |
| 109 | int renderingToTexture; |
| 110 | |
| 111 | |
| 112 | GLint defaultProgram; |
| 113 | GLint defaultVertShader; |
| 114 | GLint defaultFragShader; |
| 115 | |
| 116 | float scaleX, scaleY; |
| 117 | |
| 118 | #define INDEXMAP_SIZE 64 |
| 119 | #define VERTBUFF_SIZE 256 |
| 120 | #define ELEMBUFF_SIZE 1024 |
| 121 | |
| 122 | struct { |
| 123 | SPVertex vertices[VERTBUFF_SIZE]; |
| 124 | GLubyte elements[ELEMBUFF_SIZE]; |
| 125 | int num; |
| 126 | |
| 127 | //#ifdef __TRIBUFFER_OPT |
| 128 | |
| 129 | u32 indexmap[INDEXMAP_SIZE]; |
| 130 | u32 indexmapinv[VERTBUFF_SIZE]; |
| 131 | u32 indexmap_prev; |
| 132 | u32 indexmap_nomap; |
| 133 | //#endif |
| 134 | |
| 135 | } triangles; |
| 136 | |
| 137 | |
| 138 | unsigned int renderState; |
| 139 | |
| 140 | GLVertex rect[4]; |
| 141 | }; |
| 142 | |
| 143 | extern GLInfo OGL; |
| 144 | |
| 145 | bool OGL_Start(); |
| 146 | void OGL_Stop(); |
| 147 | |
| 148 | void OGL_AddTriangle(int v0, int v1, int v2); |
| 149 | void OGL_DrawTriangles(); |
| 150 | void OGL_DrawTriangle(SPVertex *vertices, int v0, int v1, int v2); |
| 151 | void OGL_DrawLine(int v0, int v1, float width); |
| 152 | void OGL_DrawRect(int ulx, int uly, int lrx, int lry, float *color); |
| 153 | void OGL_DrawTexturedRect(float ulx, float uly, float lrx, float lry, float uls, float ult, float lrs, float lrt, bool flip ); |
| 154 | |
| 155 | void OGL_UpdateFrameTime(); |
| 156 | void OGL_UpdateScale(); |
| 157 | void OGL_UpdateStates(); |
| 158 | void OGL_UpdateViewport(); |
| 159 | void OGL_UpdateScissor(); |
| 160 | void OGL_UpdateCullFace(); |
| 161 | |
| 162 | void OGL_ClearDepthBuffer(); |
| 163 | void OGL_ClearColorBuffer(float *color); |
| 164 | void OGL_ResizeWindow(int x, int y, int width, int height); |
| 165 | void OGL_SwapBuffers(); |
| 166 | void OGL_ReadScreen( void *dest, int *width, int *height ); |
| 167 | |
| 168 | int OGL_CheckError(); |
| 169 | int OGL_IsExtSupported( const char *extension ); |
| 170 | #endif |
| 171 | |