GLRenderDevice.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. #include "GLRenderDevice.h"
  2. #include "SdlBFApp.h"
  3. #include "BFWindow.h"
  4. #include "img/ImageData.h"
  5. #include "util/PerfTimer.h"
  6. #include <SDL2/SDL_video.h>
  7. USING_NS_BF;
  8. #define NOT_IMPL throw "Not implemented"
  9. #pragma comment(lib, "SDL2.lib")
  10. #ifdef _WIN32
  11. #ifdef BF_PLATFORM_OPENGL_ES2
  12. #pragma comment(lib, "libEGL.lib")
  13. #pragma comment(lib, "libGLESv2.lib")
  14. #else
  15. #pragma comment(lib, "opengl32.lib")
  16. #endif
  17. #endif
  18. /*#if SDL_VIDEO_DRIVER_WINDOWS
  19. #define APIENTRYP __stdcall *
  20. #elif defined BF_PLATFORM_OPENGL_ES2
  21. #define APIENTRYP *
  22. #endif*/
  23. #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
  24. #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
  25. #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
  26. #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
  27. #if defined BF_PLATFORM_OPENGL_ES2
  28. #define APIENTRYP BF_CALLTYPE *
  29. #endif
  30. typedef void (APIENTRYP GL_DEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
  31. static void (APIENTRYP bf_glDebugMessageCallback)(GL_DEBUGPROC callback, const void* userParam);
  32. static void (APIENTRYP bf_glActiveTexture)(GLenum texture);
  33. static void (APIENTRYP bf_glGenVertexArrays)(GLsizei n, GLuint* buffers);
  34. static void (APIENTRYP bf_glBindVertexArray)(GLenum target);
  35. static void (APIENTRYP bf_glGenBuffers)(GLsizei n, GLuint *buffers);
  36. static void (APIENTRYP bf_glBindBuffer)(GLenum target, GLuint buffer);
  37. static void (APIENTRYP bf_glBufferData)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
  38. static void (APIENTRYP bf_glDeleteBuffers)(GLsizei n, const GLuint *buffers);
  39. static GLvoid* (APIENTRYP bf_glMapBuffer)(GLenum target, GLenum access);
  40. static GLboolean (APIENTRYP bf_glUnmapBuffer)(GLenum target);
  41. static void (APIENTRYP bf_glGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params);
  42. static void (APIENTRYP bf_glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
  43. static void (APIENTRYP bf_glDrawArrays)(GLenum mode, GLint first, GLsizei count);
  44. static void (APIENTRYP bf_glEdgeFlagPointer)(GLsizei stride, const GLboolean *pointer);
  45. static void (APIENTRYP bf_glGetPointerv)(GLenum pname, GLvoid* *params);
  46. static void (APIENTRYP bf_glIndexPointer)(GLenum type, GLsizei stride, const GLvoid *pointer);
  47. static void (APIENTRYP bf_glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer);
  48. static void (APIENTRYP bf_glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
  49. static void (APIENTRYP bf_glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
  50. static void (APIENTRYP bf_glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
  51. static void (APIENTRYP bf_glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
  52. static void (APIENTRYP bf_glAttachShader)(GLuint program, GLuint shader);
  53. static void (APIENTRYP bf_glBindAttribLocation)(GLuint program, GLuint index, const GLchar *name);
  54. static void (APIENTRYP bf_glCompileShader)(GLuint shader);
  55. static GLuint (APIENTRYP bf_glCreateProgram)(void);
  56. static GLuint (APIENTRYP bf_glCreateShader)(GLenum type);
  57. static void (APIENTRYP bf_glDeleteProgram)(GLuint program);
  58. static void (APIENTRYP bf_glDeleteShader)(GLuint shader);
  59. static void (APIENTRYP bf_glDetachShader)(GLuint program, GLuint shader);
  60. static void (APIENTRYP bf_glDisableVertexAttribArray)(GLuint index);
  61. static void (APIENTRYP bf_glEnableVertexAttribArray)(GLuint index);
  62. static void (APIENTRYP bf_glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
  63. static void (APIENTRYP bf_glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
  64. static void (APIENTRYP bf_glGetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
  65. static GLint (APIENTRYP bf_glGetAttribLocation)(GLuint program, const GLchar *name);
  66. static void (APIENTRYP bf_glGetProgramiv)(GLuint program, GLenum pname, GLint *params);
  67. static void (APIENTRYP bf_glGetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  68. static void (APIENTRYP bf_glGetShaderiv)(GLuint shader, GLenum pname, GLint *params);
  69. static void (APIENTRYP bf_glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  70. static void (APIENTRYP bf_glGetShaderSource)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
  71. static GLint (APIENTRYP bf_glGetUniformLocation)(GLuint program, const GLchar *name);
  72. static void (APIENTRYP bf_glGetUniformfv)(GLuint program, GLint location, GLfloat *params);
  73. static void (APIENTRYP bf_glGetUniformiv)(GLuint program, GLint location, GLint *params);
  74. static void (APIENTRYP bf_glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params);
  75. static void (APIENTRYP bf_glGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params);
  76. static void (APIENTRYP bf_glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid* *pointer);
  77. static GLboolean (APIENTRYP bf_glIsProgram)(GLuint program);
  78. static GLboolean (APIENTRYP bf_glIsShader)(GLuint shader);
  79. static void (APIENTRYP bf_glLinkProgram)(GLuint program);
  80. static void (APIENTRYP bf_glShaderSource)(GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);
  81. static void (APIENTRYP bf_glUseProgram)(GLuint program);
  82. static void (APIENTRYP bf_glUniform1f)(GLint location, GLfloat v0);
  83. static void (APIENTRYP bf_glUniform2f)(GLint location, GLfloat v0, GLfloat v1);
  84. static void (APIENTRYP bf_glUniform3f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
  85. static void (APIENTRYP bf_glUniform4f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
  86. static void (APIENTRYP bf_glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  87. static void (APIENTRYP bf_glGetObjectParameterivARB)(GLint obj, GLenum pname, GLint *params);
  88. static void (APIENTRYP bf_glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
  89. static void (APIENTRYP bf_glClientActiveTexture)(GLenum texture);
  90. #if !defined BF_PLATFORM_OPENGL_ES2
  91. static void (APIENTRYP bf_glGetVertexAttribdv)(GLuint index, GLenum pname, GLdouble *params);
  92. #endif
  93. ///
  94. static int GetPowerOfTwo(int input)
  95. {
  96. int value = 1;
  97. while (value < input)
  98. value <<= 1;
  99. return value;
  100. }
  101. #define GLFAILED(check) ((hr = (check)) != 0)
  102. #define GLCHECK(check) if ((check) != 0) BF_FATAL("GL call failed")
  103. static void CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNear, float zFar, float matrix[4][4])
  104. {
  105. memset(matrix, 0, sizeof(float) * 4 * 4);
  106. float invRL = 1.0f / (right - left);
  107. float invTB = 1.0f / (top - bottom);
  108. float invFN = 1.0f / (zFar - zNear);
  109. matrix[0][0] = 2.0f * invRL;
  110. matrix[1][1] = 2.0f * invTB;
  111. matrix[2][2] = -2.0f * invFN;
  112. matrix[3][3] = 1.0f;
  113. matrix[3][0] = -(right + left) * invRL;
  114. matrix[3][1] = -(top + bottom) * invTB;
  115. matrix[3][2] = -(zFar + zNear) * invFN;
  116. }
  117. GLShaderParam::GLShaderParam()
  118. {
  119. mGLVariable = NULL;
  120. }
  121. GLShaderParam::~GLShaderParam()
  122. {
  123. }
  124. void GLShaderParam::SetTexture(Texture* texture)
  125. {
  126. NOT_IMPL;
  127. //GLTexture* dXTexture = (GLTexture*) texture;
  128. //GLCHECK(mGLVariable->AsShaderResource()->SetResource(dXTexture->mGLTexture));
  129. }
  130. void GLShaderParam::SetFloat4(float x, float y, float z, float w)
  131. {
  132. NOT_IMPL;
  133. //float v[4] = {x, y, z, w};
  134. //GLCHECK(mGLVariable->AsVector()->SetFloatVector(v));
  135. }
  136. ///
  137. GLShader::GLShader()
  138. {
  139. }
  140. GLShader::~GLShader()
  141. {
  142. for (auto paramKV : mParamsMap)
  143. {
  144. delete paramKV.mValue;
  145. }
  146. }
  147. ShaderParam* GLShader::GetShaderParam(const StringImpl& name)
  148. {
  149. NOT_IMPL;
  150. return NULL;
  151. }
  152. ///
  153. GLTexture::GLTexture()
  154. {
  155. mGLTexture = 0;
  156. mGLTexture2 = 0;
  157. //mGLRenderTargetView = NULL;
  158. mRenderDevice = NULL;
  159. mImageData = NULL;
  160. }
  161. GLTexture::~GLTexture()
  162. {
  163. if (mImageData != NULL)
  164. mImageData->Deref();
  165. //if (mGLTexture != NULL)
  166. //mGLTexture->Release();
  167. }
  168. void GLTexture::PhysSetAsTarget()
  169. {
  170. NOT_IMPL;
  171. }
  172. void GLTexture::Blt(ImageData* imageData, int x, int y)
  173. {
  174. if (mImageData != NULL)
  175. {
  176. for (int row = 0; row < imageData->mHeight; row++)
  177. {
  178. memcpy(mImageData->mBits + (y + row) * mImageData->mWidth + x,
  179. imageData->mBits + row * imageData->mWidth, imageData->mWidth * 4);
  180. }
  181. }
  182. else
  183. {
  184. glBindTexture(GL_TEXTURE_2D, mGLTexture);
  185. glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, imageData->mWidth, imageData->mHeight, GL_RGBA, GL_UNSIGNED_BYTE, imageData->mBits);
  186. }
  187. }
  188. ///
  189. GLDrawBatch::GLDrawBatch() : DrawBatch()
  190. {
  191. }
  192. GLDrawBatch::~GLDrawBatch()
  193. {
  194. delete mVertices;
  195. delete mIndices;
  196. //mGLBuffer->Release();
  197. }
  198. extern int gBFDrawBatchCount;
  199. struct GLVertex3D
  200. {
  201. float x, y, z;
  202. float u, v;
  203. uint32 color;
  204. };
  205. void GLDrawBatch::Render(RenderDevice* renderDevice, RenderWindow* renderWindow)
  206. {
  207. if (mIdxIdx == 0)
  208. return;
  209. gBFDrawBatchCount++;
  210. GLRenderDevice* glRenderDevice = (GLRenderDevice*) gBFApp->mRenderDevice;
  211. GLShader* curShader = (GLShader*)mRenderState->mShader;
  212. if (glRenderDevice->mGLVAO == 0)
  213. {
  214. bf_glGenVertexArrays(1, &glRenderDevice->mGLVAO);
  215. bf_glBindVertexArray(glRenderDevice->mGLVAO);
  216. bf_glGenBuffers(1, &glRenderDevice->mGLVertexBuffer);
  217. bf_glGenBuffers(1, &glRenderDevice->mGLIndexBuffer);
  218. }
  219. auto glVertices = (GLVertex3D*)mVertices;
  220. bf_glBindBuffer(GL_ARRAY_BUFFER, glRenderDevice->mGLVertexBuffer);
  221. bf_glBufferData(GL_ARRAY_BUFFER, mVtxIdx * sizeof(GLVertex3D), mVertices, GL_STREAM_DRAW);
  222. bf_glEnableVertexAttribArray(curShader->mAttribPosition);
  223. bf_glVertexAttribPointer(curShader->mAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLVertex3D), (void*)offsetof(GLVertex3D, x));
  224. bf_glEnableVertexAttribArray(curShader->mAttribTexCoord0);
  225. bf_glVertexAttribPointer(curShader->mAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLVertex3D), (void*)offsetof(GLVertex3D, u));
  226. bf_glEnableVertexAttribArray(curShader->mAttribColor);
  227. bf_glVertexAttribPointer(curShader->mAttribColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(GLVertex3D), (void*)offsetof(GLVertex3D, color));
  228. if (mRenderState != renderDevice->mPhysRenderState)
  229. renderDevice->PhysSetRenderState(mRenderState);
  230. bf_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glRenderDevice->mGLIndexBuffer);
  231. bf_glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIdxIdx * sizeof(int16), mIndices, GL_STREAM_DRAW);
  232. bf_glDrawElements(GL_TRIANGLES, mIdxIdx, GL_UNSIGNED_SHORT, NULL);
  233. bf_glBufferData(GL_ELEMENT_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
  234. bf_glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
  235. }
  236. GLDrawLayer::GLDrawLayer()
  237. {
  238. }
  239. GLDrawLayer::~GLDrawLayer()
  240. {
  241. }
  242. DrawBatch* GLDrawLayer::CreateDrawBatch()
  243. {
  244. return new GLDrawBatch();
  245. }
  246. RenderCmd* GLDrawLayer::CreateSetTextureCmd(int textureIdx, Texture* texture)
  247. {
  248. GLSetTextureCmd* setTextureCmd = AllocRenderCmd<GLSetTextureCmd>();
  249. setTextureCmd->mTextureIdx = textureIdx;
  250. setTextureCmd->mTexture = texture;
  251. return setTextureCmd;
  252. }
  253. void GLDrawLayer::SetShaderConstantData(int usageIdx, int slotIdx, void* constData, int size)
  254. {
  255. }
  256. /*void GLDrawLayer::FreeBatch(DrawBatch* drawBatch)
  257. {
  258. //delete drawBatch;
  259. GLDrawBatch* batch = (GLDrawBatch*) drawBatch;
  260. batch->Clear();
  261. //GLDrawBatchVector* pool = &((GLRenderDevice*) gBFApp->mRenderDevice)->mDrawBatchPool;
  262. //pool->push_back(batch);
  263. GLRenderDevice* glRenderDevice = (GLRenderDevice*)gBFApp->mRenderDevice;
  264. drawBatch->mNext = glRenderDevice->mFreeBatchHead;
  265. glRenderDevice->mFreeBatchHead = batch;
  266. }*/
  267. //void GLRenderDevice::PhysSetShader(Shader* shader)
  268. //{
  269. // GLRenderDevice* aRenderDevice = (GLRenderDevice*) gBFApp->mRenderDevice;
  270. //
  271. // //TODO: Cache more
  272. //
  273. // GLShader* glShader = (GLShader*)shader;
  274. //
  275. // GLfloat matrix[4][4];
  276. // CreateOrthographicOffCenter(0.0f, (float)mPhysRenderWindow->mWidth, (float)mPhysRenderWindow->mHeight, 0.0f, -100.0f, 100.0f, matrix);
  277. // GLint matrixLoc = bf_glGetUniformLocation(glShader->mGLProgram, "screenMatrix");
  278. // //BF_ASSERT(matrixLoc >= 0);
  279. // if (matrixLoc >= 0)
  280. // bf_glUniformMatrix4fv(matrixLoc, 1, false, (float*)matrix);
  281. //
  282. // /*mPhysShaderPass = shaderPass;
  283. // GLShaderPass* dXShaderPass = (GLShaderPass*) mPhysShaderPass;
  284. // mGLDevice->IASetInputLayout(dXShaderPass->mGLLayout);
  285. //
  286. // if (mCurShader->mLastResizeCount != mCurRenderTarget->mResizeNum)
  287. // {
  288. // ShaderParam* shaderParam = mCurShader->GetShaderParam(L"WindowSize");
  289. // if (shaderParam != NULL)
  290. // {
  291. // shaderParam->SetFloat2((float) mCurRenderTarget->mWidth, (float) mCurRenderTarget->mHeight);
  292. // }
  293. //
  294. // mCurShader->mLastResizeCount = mCurRenderTarget->mResizeNum;
  295. // }
  296. //
  297. // GLCHECK(dXShaderPass->mGLEffectPass->Apply(0));*/
  298. //
  299. // /*GLfloat matrix[4][4];
  300. // CreateOrthographicOffCenter(0.0f, (float)mPhysRenderWindow->mWidth, (float)mPhysRenderWindow->mHeight, 0.0f, -100.0f, 100.0f, matrix);
  301. // GLint uniformLocation = bf_glGetUniformLocation(((GLShader*)shaderPass->mTechnique->mShader)->mGLProgram, "screenMatrix");
  302. // if (uniformLocation != -1)
  303. // bf_glUniformMatrix4fv(uniformLocation, 1, false, (GLfloat*)matrix);*/
  304. //}
  305. void GLRenderDevice::PhysSetRenderWindow(RenderWindow* renderWindow)
  306. {
  307. mCurRenderTarget = renderWindow;
  308. mPhysRenderWindow = renderWindow;
  309. ((GLRenderWindow*)renderWindow)->PhysSetAsTarget();
  310. }
  311. void GLRenderDevice::PhysSetRenderTarget(Texture* renderTarget)
  312. {
  313. mCurRenderTarget = renderTarget;
  314. renderTarget->PhysSetAsTarget();
  315. }
  316. ///
  317. template <typename T>
  318. static void BFGetGLProc(T& proc, const char* name)
  319. {
  320. proc = (T)SDL_GL_GetProcAddress(name);
  321. }
  322. #define BF_GET_GLPROC(name) BFGetGLProc(bf_##name, #name)
  323. void GL_DebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
  324. {
  325. NOP;
  326. }
  327. GLRenderWindow::GLRenderWindow(GLRenderDevice* renderDevice, SDL_Window* sdlWindow)
  328. {
  329. if (bf_glGenBuffers == NULL)
  330. {
  331. BF_GET_GLPROC(glDebugMessageCallback);
  332. BF_GET_GLPROC(glActiveTexture);
  333. BF_GET_GLPROC(glGenVertexArrays);
  334. BF_GET_GLPROC(glBindVertexArray);
  335. BF_GET_GLPROC(glGenBuffers);
  336. BF_GET_GLPROC(glBindBuffer);
  337. BF_GET_GLPROC(glBufferData);
  338. BF_GET_GLPROC(glDeleteBuffers);
  339. BF_GET_GLPROC(glMapBuffer);
  340. BF_GET_GLPROC(glUnmapBuffer);
  341. BF_GET_GLPROC(glGetBufferParameteriv);
  342. BF_GET_GLPROC(glColorPointer);
  343. BF_GET_GLPROC(glDrawArrays);
  344. BF_GET_GLPROC(glEdgeFlagPointer);
  345. BF_GET_GLPROC(glGetPointerv);
  346. BF_GET_GLPROC(glIndexPointer);
  347. BF_GET_GLPROC(glNormalPointer);
  348. BF_GET_GLPROC(glTexCoordPointer);
  349. BF_GET_GLPROC(glVertexPointer);
  350. BF_GET_GLPROC(glDrawElements);
  351. BF_GET_GLPROC(glVertexAttribPointer);
  352. BF_GET_GLPROC(glAttachShader);
  353. BF_GET_GLPROC(glBindAttribLocation);
  354. BF_GET_GLPROC(glCompileShader);
  355. BF_GET_GLPROC(glCreateProgram);
  356. BF_GET_GLPROC(glCreateShader);
  357. BF_GET_GLPROC(glDeleteProgram);
  358. BF_GET_GLPROC(glDeleteShader);
  359. BF_GET_GLPROC(glDetachShader);
  360. BF_GET_GLPROC(glDisableVertexAttribArray);
  361. BF_GET_GLPROC(glEnableVertexAttribArray);
  362. BF_GET_GLPROC(glGetActiveAttrib);
  363. BF_GET_GLPROC(glGetActiveUniform);
  364. BF_GET_GLPROC(glGetAttachedShaders);
  365. BF_GET_GLPROC(glGetAttribLocation);
  366. BF_GET_GLPROC(glGetProgramiv);
  367. BF_GET_GLPROC(glGetProgramInfoLog);
  368. BF_GET_GLPROC(glGetShaderiv);
  369. BF_GET_GLPROC(glGetShaderInfoLog);
  370. BF_GET_GLPROC(glGetShaderSource);
  371. BF_GET_GLPROC(glGetUniformLocation);
  372. BF_GET_GLPROC(glGetUniformfv);
  373. BF_GET_GLPROC(glGetUniformiv);
  374. BF_GET_GLPROC(glGetVertexAttribfv);
  375. BF_GET_GLPROC(glGetVertexAttribiv);
  376. BF_GET_GLPROC(glGetVertexAttribPointerv);
  377. BF_GET_GLPROC(glIsProgram);
  378. BF_GET_GLPROC(glIsShader);
  379. BF_GET_GLPROC(glLinkProgram);
  380. BF_GET_GLPROC(glShaderSource);
  381. BF_GET_GLPROC(glUseProgram);
  382. BF_GET_GLPROC(glUniform1f);
  383. BF_GET_GLPROC(glUniform2f);
  384. BF_GET_GLPROC(glUniform3f);
  385. BF_GET_GLPROC(glUniform4f);
  386. BF_GET_GLPROC(glUniformMatrix4fv);
  387. BF_GET_GLPROC(glGetObjectParameterivARB);
  388. BF_GET_GLPROC(glCompressedTexImage2D);
  389. BF_GET_GLPROC(glClientActiveTexture);
  390. #if !defined BF_PLATFORM_OPENGL_ES2
  391. BF_GET_GLPROC(glGetVertexAttribdv);
  392. #endif
  393. }
  394. mSDLWindow = sdlWindow;
  395. mRenderDevice = renderDevice;
  396. Resized();
  397. //bf_glDebugMessageCallback(GL_DebugCallback, NULL);
  398. }
  399. GLRenderWindow::~GLRenderWindow()
  400. {
  401. }
  402. void GLRenderWindow::PhysSetAsTarget()
  403. {
  404. GLfloat matrix[4][4];
  405. CreateOrthographicOffCenter(0.0f, (float)mWidth, (float)mHeight, 0.0f, -100.0f, 100.0f, matrix);
  406. glViewport(0, 0, (GLsizei)mWidth, (GLsizei)mHeight);
  407. mHasBeenDrawnTo = true;
  408. }
  409. void GLRenderWindow::SetAsTarget()
  410. {
  411. //TODO: Handle this more elegantly when we actually handle draw layers properly...
  412. //if (mRenderDevice->mCurRenderTarget != NULL)
  413. //mRenderDevice->mCurDrawLayer->Flush();
  414. mHasBeenTargeted = true;
  415. mRenderDevice->mCurRenderTarget = this;
  416. }
  417. void GLRenderWindow::Resized()
  418. {
  419. mRenderDevice->mResizeCount++;
  420. mResizeNum = mRenderDevice->mResizeCount;
  421. SDL_GetWindowSize(mSDLWindow, &mWidth, &mHeight);
  422. //NOT_IMPL;
  423. /*if (mGLSwapChain != NULL)
  424. {
  425. mGLRenderTargetView->Release();
  426. mGLBackBuffer->Release();
  427. GLCHECK(mGLSwapChain->ResizeBuffers(1, mWidth, mHeight, GLGI_FORMAT_R8G8B8A8_UNORM, 0));
  428. GLCHECK(mGLSwapChain->GetBuffer(0, __uuidof(IGL10Texture2D), (LPVOID*)&mGLBackBuffer));
  429. GLCHECK(mRenderDevice->mGLDevice->CreateRenderTargetView(mGLBackBuffer, NULL, &mGLRenderTargetView));
  430. }*/
  431. }
  432. void GLRenderWindow::Present()
  433. {
  434. SDL_GL_SwapWindow(mSDLWindow);
  435. //GLCHECK(mGLSwapChain->Present((mWindow->mFlags & BFWINDOW_VSYNC) ? 1 : 0, 0));
  436. }
  437. void GLRenderWindow::CopyBitsTo(uint32* dest, int width, int height)
  438. {
  439. mCurDrawLayer->Flush();
  440. NOT_IMPL;
  441. /*GL10_TEXTURE2D_DESC texDesc;
  442. texDesc.ArraySize = 1;
  443. texDesc.BindFlags = 0;
  444. texDesc.CPUAccessFlags = 0;
  445. texDesc.Format = GLGI_FORMAT_R8G8B8A8_UNORM;
  446. texDesc.Width = width;
  447. texDesc.Height = height;
  448. texDesc.MipLevels = 1;
  449. texDesc.MiscFlags = 0;
  450. texDesc.SampleDesc.Count = 1;
  451. texDesc.SampleDesc.Quality = 0;
  452. texDesc.Usage = GL10_USAGE_STAGING;
  453. texDesc.CPUAccessFlags = GL10_CPU_ACCESS_READ;
  454. IGL10Texture2D *texture;
  455. GLCHECK(mRenderDevice->mGLDevice->CreateTexture2D(&texDesc, 0, &texture));
  456. mRenderDevice->mGLDevice->CopyResource(texture, mGLBackBuffer);
  457. GL10_MAPPED_TEXTURE2D mapTex;
  458. GLCHECK(texture->Map(GL10CalcSubresource(0, 0, 1), GL10_MAP_READ, 0, &mapTex));
  459. uint8* srcPtr = (uint8*) mapTex.pData;
  460. uint8* destPtr = (uint8*) dest;
  461. for (int y = 0; y < height; y++)
  462. {
  463. memcpy(destPtr, srcPtr, width*sizeof(uint32));
  464. srcPtr += mapTex.RowPitch;
  465. destPtr += width * 4;
  466. }
  467. texture->Unmap(0);
  468. texture->Release();*/
  469. }
  470. ///
  471. GLRenderDevice::GLRenderDevice()
  472. {
  473. //mGLDevice = NULL;
  474. mCurShader = NULL;
  475. mGLVAO = 0;
  476. mGLVertexBuffer = 0;
  477. mGLIndexBuffer = 0;
  478. mBlankTexture = 0;
  479. mFreeBatchHead = NULL;
  480. }
  481. GLRenderDevice::~GLRenderDevice()
  482. {
  483. }
  484. bool GLRenderDevice::Init(BFApp* app)
  485. {
  486. SdlBFApp* winApp = (SdlBFApp*) app;
  487. //RenderState* glRenderState;
  488. if (mDefaultRenderState == NULL)
  489. {
  490. auto dxRenderState = (RenderState*)CreateRenderState(NULL);
  491. mDefaultRenderState = dxRenderState;
  492. mDefaultRenderState->mDepthFunc = DepthFunc_Less;
  493. mDefaultRenderState->mWriteDepthBuffer = true;
  494. mPhysRenderState = mDefaultRenderState;
  495. }
  496. else
  497. {
  498. //glRenderState = (DXRenderState*)mDefaultRenderState;
  499. //glRenderState->ReinitNative();
  500. }
  501. ///
  502. ////Use GL10_CREATE_DEVICE_DEBUG for PIX
  503. //GLCHECK(GL10CreateDevice(NULL, GL10_DRIVER_TYPE_HARDWARE, NULL, GL10_CREATE_DEVICE_DEBUG, GL10_SDK_VERSION, &mGLDevice));
  504. ////GLCHECK(GL10CreateDevice(NULL, GL10_DRIVER_TYPE_HARDWARE, NULL, 0, GL10_SDK_VERSION, &mGLDevice));
  505. //IGLGIDevice* pGLGIDevice = NULL;
  506. //GLCHECK(mGLDevice->QueryInterface(__uuidof(IGLGIDevice), reinterpret_cast<void**>(&pGLGIDevice)));
  507. //IGLGIAdapter* pGLGIAdapter = NULL;
  508. //GLCHECK(pGLGIDevice->GetParent(__uuidof(IGLGIAdapter), reinterpret_cast<void**>(&pGLGIAdapter)));
  509. //IGLGIFactory* pGLGIFactory = NULL;
  510. //GLCHECK(pGLGIAdapter->GetParent(__uuidof(IGLGIFactory), reinterpret_cast<void**>(&mGLGIFactory)));
  511. ////set rasterizer
  512. //GL10_RASTERIZER_DESC rasterizerState;
  513. //rasterizerState.CullMode = GL10_CULL_NONE;
  514. //rasterizerState.FillMode = GL10_FILL_SOLID;
  515. //rasterizerState.FrontCounterClockwise = true;
  516. // rasterizerState.DepthBias = false;
  517. // rasterizerState.DepthBiasClamp = 0;
  518. // rasterizerState.SlopeScaledDepthBias = 0;
  519. // rasterizerState.DepthClipEnable = false;
  520. // rasterizerState.ScissorEnable = true;
  521. // //TODO:rasterizerState.MultisampleEnable = false;
  522. //rasterizerState.MultisampleEnable = true;
  523. // rasterizerState.AntialiasedLineEnable = true;
  524. //
  525. //mGLDevice->CreateRasterizerState( &rasterizerState, &mGLRasterizerStateClipped);
  526. //
  527. //rasterizerState.ScissorEnable = false;
  528. //mGLDevice->CreateRasterizerState( &rasterizerState, &mGLRasterizerStateUnclipped);
  529. //mGLDevice->RSSetState(mGLRasterizerStateUnclipped);
  530. //
  531. //IGL10BlendState* g_pBlendState = NULL;
  532. //GL10_BLEND_DESC BlendState;
  533. //ZeroMemory(&BlendState, sizeof(GL10_BLEND_DESC));
  534. //BlendState.BlendEnable[0] = TRUE;
  535. ////BlendState.SrcBlend = GL10_BLEND_SRC_ALPHA;
  536. //BlendState.SrcBlend = GL10_BLEND_ONE;
  537. //BlendState.DestBlend = GL10_BLEND_INV_SRC_ALPHA;
  538. //BlendState.BlendOp = GL10_BLEND_OP_ADD;
  539. //BlendState.SrcBlendAlpha = GL10_BLEND_ONE;
  540. //BlendState.DestBlendAlpha = GL10_BLEND_ONE;
  541. //BlendState.BlendOpAlpha = GL10_BLEND_OP_ADD;
  542. //BlendState.RenderTargetWriteMask[0] = GL10_COLOR_WRITE_ENABLE_ALL;
  543. //mGLDevice->CreateBlendState(&BlendState, &mGLNormalBlendState);
  544. //BlendState.DestBlend = GL10_BLEND_ONE;
  545. //mGLDevice->CreateBlendState(&BlendState, &mGLAdditiveBlendState);
  546. //PhysSetAdditive(false);
  547. return true;
  548. }
  549. void GLRenderDevice::FrameStart()
  550. {
  551. mCurRenderTarget = NULL;
  552. mPhysRenderWindow = NULL;
  553. for (auto aRenderWindow : mRenderWindowList)
  554. {
  555. aRenderWindow->mHasBeenDrawnTo = false;
  556. aRenderWindow->mHasBeenTargeted = false;
  557. }
  558. }
  559. void GLRenderDevice::FrameEnd()
  560. {
  561. for (auto aRenderWindow : mRenderWindowList)
  562. {
  563. if (aRenderWindow->mHasBeenTargeted)
  564. {
  565. PhysSetRenderWindow(aRenderWindow);
  566. PhysSetRenderState(mDefaultRenderState);
  567. for (auto drawLayer : aRenderWindow->mDrawLayerList)
  568. {
  569. drawLayer->Flush();
  570. }
  571. aRenderWindow->Present();
  572. }
  573. }
  574. }
  575. Texture* GLRenderDevice::LoadTexture(ImageData* imageData, int flags)
  576. {
  577. imageData->mIsAdditive = (flags & TextureFlag_Additive) != 0;
  578. imageData->PremultiplyAlpha();
  579. //int w = power_of_two(imageData->mWidth);
  580. //int h = power_of_two(imageData->mHeight);
  581. GLTexture* glTexture = new GLTexture();
  582. glTexture->mRenderDevice = this;
  583. glTexture->mWidth = imageData->mWidth;
  584. glTexture->mHeight = imageData->mHeight;
  585. glTexture->mImageData = imageData;
  586. imageData->AddRef();
  587. return glTexture;
  588. }
  589. Shader* GLRenderDevice::LoadShader(const StringImpl& fileName, VertexDefinition* vertexDefinition)
  590. {
  591. GLShader* glShader = new GLShader();
  592. glShader->mVertexSize = sizeof(GLVertex3D);
  593. glShader->mGLVertexShader = bf_glCreateShader(GL_VERTEX_SHADER);
  594. glShader->mGLFragmentShader = bf_glCreateShader(GL_FRAGMENT_SHADER);
  595. GLint vertProgramLen = 0;
  596. GLint fragProgramLen = 0;
  597. #ifdef BF_PLATFORM_OPENGL_ES2
  598. GLchar* vertProgram = (GLchar*)LoadBinaryData(fileName + "_es.vert", &vertProgramLen);
  599. GLchar* fragProgram = (GLchar*)LoadBinaryData(fileName + "_es.frag", &fragProgramLen);
  600. #else
  601. GLchar* vertProgram = (GLchar*)LoadBinaryData(fileName + ".vert", &vertProgramLen);
  602. GLchar* fragProgram = (GLchar*)LoadBinaryData(fileName + ".frag", &fragProgramLen);
  603. #endif
  604. if ((vertProgram == NULL) || (fragProgram == NULL))
  605. {
  606. delete vertProgram;
  607. delete fragProgram;
  608. return NULL;
  609. }
  610. int infoLogLen = 0;
  611. char infoLog[2048];
  612. bf_glShaderSource(glShader->mGLVertexShader, 1, (const GLchar**)&vertProgram, &vertProgramLen);
  613. bf_glCompileShader(glShader->mGLVertexShader);
  614. bf_glGetShaderInfoLog(glShader->mGLVertexShader, 2048, &infoLogLen, infoLog);
  615. GLint compiled = 0;
  616. //bf_glGetObjectParameterivARB(glShader->mGLVertexShader, GL_COMPILE_STATUS, &compiled);
  617. bf_glGetShaderiv(glShader->mGLVertexShader, GL_COMPILE_STATUS, &compiled);
  618. if (!compiled)
  619. BF_FATAL(StrFormat("Shader error: %s", infoLog).c_str());
  620. bf_glShaderSource(glShader->mGLFragmentShader, 1, (const GLchar**)&fragProgram, &fragProgramLen);
  621. bf_glCompileShader(glShader->mGLFragmentShader);
  622. bf_glGetShaderInfoLog(glShader->mGLFragmentShader, 2048, &infoLogLen, infoLog);
  623. compiled = 0;
  624. //bf_glGetObjectParameterivARB(glShader->mGLFragmentShader, GL_COMPILE_STATUS, &compiled);
  625. bf_glGetShaderiv(glShader->mGLFragmentShader, GL_COMPILE_STATUS, &compiled);
  626. if (!compiled)
  627. BF_FATAL(StrFormat("Shader error: %s", infoLog).c_str());
  628. glShader->mGLProgram = bf_glCreateProgram();
  629. bf_glAttachShader(glShader->mGLProgram, glShader->mGLVertexShader);
  630. bf_glAttachShader(glShader->mGLProgram, glShader->mGLFragmentShader);
  631. bf_glLinkProgram(glShader->mGLProgram);
  632. glShader->mAttribPosition = bf_glGetAttribLocation(glShader->mGLProgram, "position");
  633. glShader->mAttribTexCoord0 = bf_glGetAttribLocation(glShader->mGLProgram, "texCoord0");
  634. glShader->mAttribColor = bf_glGetAttribLocation(glShader->mGLProgram, "color");
  635. glShader->mAttribTex0 = bf_glGetUniformLocation(glShader->mGLProgram, "tex");
  636. glShader->mAttribTex1 = bf_glGetUniformLocation(glShader->mGLProgram, "tex2");
  637. return glShader;
  638. }
  639. void GLRenderDevice::PhysSetRenderState(RenderState* renderState)
  640. {
  641. mCurShader = (GLShader*)renderState->mShader;
  642. if (mCurShader != NULL)
  643. {
  644. bf_glUseProgram(mCurShader->mGLProgram);
  645. GLRenderDevice* aRenderDevice = (GLRenderDevice*)gBFApp->mRenderDevice;
  646. //TODO: Cache more
  647. GLfloat matrix[4][4];
  648. CreateOrthographicOffCenter(0.0f, (float)mPhysRenderWindow->mWidth, (float)mPhysRenderWindow->mHeight, 0.0f, -100.0f, 100.0f, matrix);
  649. GLint matrixLoc = bf_glGetUniformLocation(mCurShader->mGLProgram, "screenMatrix");
  650. //BF_ASSERT(matrixLoc >= 0);
  651. if (matrixLoc >= 0)
  652. bf_glUniformMatrix4fv(matrixLoc, 1, false, (float*)matrix);
  653. }
  654. if (renderState->mClipped)
  655. {
  656. glEnable(GL_SCISSOR_TEST);
  657. glScissor((GLsizei)renderState->mClipRect.mX,
  658. mPhysRenderWindow->mHeight - (GLsizei)renderState->mClipRect.mY - (GLsizei)renderState->mClipRect.mHeight,
  659. (GLsizei)renderState->mClipRect.mWidth, (GLsizei)renderState->mClipRect.mHeight);
  660. }
  661. else
  662. {
  663. glDisable(GL_SCISSOR_TEST);
  664. }
  665. mPhysRenderState = renderState;
  666. }
  667. Texture* GLRenderDevice::CreateRenderTarget(int width, int height, bool destAlpha)
  668. {
  669. NOT_IMPL;
  670. }
  671. void GLRenderDevice::SetRenderState(RenderState* renderState)
  672. {
  673. mCurRenderState = renderState;
  674. }
  675. void GLSetTextureCmd::Render(RenderDevice* renderDevice, RenderWindow* renderWindow)
  676. {
  677. /*#ifdef BF_PLATFORM_OPENGL_ES2
  678. //bf_glClientActiveTexture(GL_TEXTURE0);
  679. glActiveTexture(GL_TEXTURE0);
  680. glBindTexture(GL_TEXTURE_2D, ((GLTexture*)mTexture)->mGLTexture);
  681. glUniform1i(curShader->mAttribTex0, 0);
  682. //bf_glClientActiveTexture(GL_TEXTURE1);
  683. glActiveTexture(GL_TEXTURE1);
  684. glBindTexture(GL_TEXTURE_2D, ((GLTexture*)mTexture)->mGLTexture2);
  685. glUniform1i(curShader->mAttribTex1, 1);
  686. //glEnable(GL_TEXTURE_2D);
  687. #else
  688. glActiveTexture(GL_TEXTURE0 + mTextureIdx);
  689. glBindTexture(GL_TEXTURE_2D, ((GLTexture*)mTexture)->mGLTexture);
  690. #endif*/
  691. auto glTexture = (GLTexture*)mTexture;
  692. auto glRenderDevice = (GLRenderDevice*)renderDevice;
  693. if (glRenderDevice->mBlankTexture == 0)
  694. {
  695. glGenTextures(1, &glRenderDevice->mBlankTexture);
  696. glBindTexture(GL_TEXTURE_2D, glRenderDevice->mBlankTexture);
  697. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  698. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  699. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  700. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  701. /*if (bf_glCompressedTexImage2D != NULL)
  702. {
  703. uint64 hwData = 0;
  704. bf_glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 4, 4, 0,
  705. sizeof(hwData), (uint8*)&hwData);
  706. }
  707. else*/
  708. {
  709. uint16 color = 0;
  710. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0,
  711. GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &color);
  712. }
  713. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  714. }
  715. if (glTexture->mImageData != NULL)
  716. {
  717. glTexture->mGLTexture2 = glRenderDevice->mBlankTexture;
  718. int texCount = 1;
  719. //texCount = (imageData->mHWBitsType == HWBITS_PVRTC_2X4BPPV1) ? 2 : 1;
  720. for (int texNum = 0; texNum < 2/*texCount*/; texNum++)
  721. {
  722. GLuint glTextureID;
  723. glGenTextures(1, &glTextureID);
  724. glBindTexture(GL_TEXTURE_2D, glTextureID);
  725. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  726. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  727. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  728. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  729. //if (imageData->mHWBits != NULL)
  730. //{
  731. // int internalFormat = (imageData->mHWBitsType == HWBITS_PVRTC_2BPPV1) ?
  732. // GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG :
  733. // GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
  734. // int texSize = imageData->mHWBitsLength / texCount;
  735. // bf_glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFormat, imageData->mWidth, imageData->mHeight, 0,
  736. // texSize, (uint8*)imageData->mHWBits /*+ (texNum * texSize)*/);
  737. //}
  738. //else
  739. {
  740. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glTexture->mImageData->mWidth, glTexture->mImageData->mHeight, 0,
  741. GL_RGBA, GL_UNSIGNED_BYTE, glTexture->mImageData->mBits);
  742. }
  743. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  744. if (texNum == 0)
  745. glTexture->mGLTexture = glTextureID;
  746. else
  747. glTexture->mGLTexture2 = glTextureID;
  748. }
  749. glTexture->mImageData->Deref();
  750. glTexture->mImageData = NULL;
  751. }
  752. bf_glActiveTexture(GL_TEXTURE0 + mTextureIdx);
  753. //glUniform1i(curShader->mAttribTex0, 0);
  754. glBindTexture(GL_TEXTURE_2D, glTexture->mGLTexture);
  755. }