this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Added checks for redundant texture and framebuffer binds.

+89 -48
+28 -9
SDL_gpu/OpenGL_common/SDL_gpuShapes_OpenGL.c
··· 23 23 static void Circle(GPU_ShapeRenderer* renderer, GPU_Target* target, float x, float y, float radius, SDL_Color color); 24 24 25 25 26 + static inline void bindTexture(GPU_Renderer* renderer, GLuint handle) 27 + { 28 + // Bind the texture to which subsequent calls refer 29 + if(handle != ((RendererData_OpenGL*)renderer->data)->last_texture) 30 + { 31 + glBindTexture( GL_TEXTURE_2D, handle ); 32 + ((RendererData_OpenGL*)renderer->data)->last_texture = handle; 33 + } 34 + } 35 + 36 + static inline void bindFramebuffer(GPU_Renderer* renderer, GLuint handle) 37 + { 38 + // Bind the FBO 39 + if(handle != ((RendererData_OpenGL*)renderer->data)->last_framebuffer) 40 + { 41 + glBindFramebuffer(GL_FRAMEBUFFER, handle); 42 + ((RendererData_OpenGL*)renderer->data)->last_framebuffer = handle; 43 + } 44 + } 45 + 26 46 27 47 #ifdef SDL_GPU_USE_SDL2 28 48 #define GET_WINDOW(shape_renderer) ((GPU_RendererData_OpenGL*)shape_renderer->renderer->data)->window ··· 38 58 return; \ 39 59 float z = ((RendererData_OpenGL*)renderer->renderer->data)->z; \ 40 60 \ 41 - /* Bind the FBO */ \ 42 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)target->data)->handle); \ 61 + bindFramebuffer(renderer->renderer, ((TargetData_OpenGL*)target->data)->handle); \ 43 62 /*glPushAttrib(GL_COLOR_BUFFER_BIT);*/ \ 44 63 if(target->useClip) \ 45 64 { \ ··· 85 104 } \ 86 105 /*glPopAttrib();*/ \ 87 106 glColor4ub(255, 255, 255, 255); \ 88 - glBindFramebuffer(GL_FRAMEBUFFER, 0); \ 89 107 glEnable( GL_TEXTURE_2D ); 90 108 91 109 ··· 670 688 static void PolygonBlit(GPU_ShapeRenderer* renderer, GPU_Image* src, SDL_Rect* srcrect, GPU_Target* target, Uint16 n, float* vertices, float textureX, float textureY, float angle, float scaleX, float scaleY) 671 689 { 672 690 BEGIN; 673 - 691 + 692 + (void)z; 693 + /* 674 694 glEnable( GL_TEXTURE_2D ); 675 695 676 - // Bind the texture to which subsequent calls refer 677 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)src->data)->handle ); 696 + bindTexture( renderer->renderer, ((ImageData_OpenGL*)src->data)->handle ); 678 697 679 698 // Set repeat mode 680 699 // FIXME: Save old mode and reset it later ··· 685 704 // TODO: Use 'srcrect' 686 705 687 706 int i; 688 - /*glBegin(GL_TRIANGLE_FAN); 707 + glBegin(GL_TRIANGLE_FAN); 689 708 for(i = 0; i < 2*n; i+=2) 690 709 { 691 710 float x = vertices[i]; ··· 695 714 696 715 glVertex3f(x, y, z); 697 716 } 698 - glEnd();*/ 717 + glEnd(); 699 718 700 719 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); 701 720 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); 702 - 721 + */ 703 722 END; 704 723 } 705 724
+51 -39
SDL_gpu/OpenGL_common/SDL_gpu_OpenGL.c
··· 51 51 return x; 52 52 } 53 53 54 + static inline void bindTexture(GPU_Renderer* renderer, GLuint handle) 55 + { 56 + // Bind the texture to which subsequent calls refer 57 + if(handle != ((RendererData_OpenGL*)renderer->data)->last_texture) 58 + { 59 + glBindTexture( GL_TEXTURE_2D, handle ); 60 + ((RendererData_OpenGL*)renderer->data)->last_texture = handle; 61 + } 62 + } 63 + 64 + static inline void bindFramebuffer(GPU_Renderer* renderer, GLuint handle) 65 + { 66 + // Bind the FBO 67 + if(handle != ((RendererData_OpenGL*)renderer->data)->last_framebuffer) 68 + { 69 + glBindFramebuffer(GL_FRAMEBUFFER, handle); 70 + ((RendererData_OpenGL*)renderer->data)->last_framebuffer = handle; 71 + } 72 + } 73 + 54 74 55 75 56 76 static GPU_Target* Init(GPU_Renderer* renderer, Uint16 w, Uint16 h, Uint32 flags) ··· 168 188 renderer->display->clipRect.y = 0; 169 189 renderer->display->clipRect.w = renderer->display->w; 170 190 renderer->display->clipRect.h = renderer->display->h; 191 + 192 + /*RendererData_OpenGL* rdata = (RendererData_OpenGL*)renderer->data; 193 + rdata->blit_buffer_max_size = 4000; 194 + rdata->blit_buffer_size = 0; 195 + rdata->blit_buffer = (float*)malloc(sizeof(float)*blit_buffer_max_size);*/ 171 196 172 197 return renderer->display; 173 198 } ··· 360 385 return NULL; 361 386 } 362 387 363 - glBindTexture( GL_TEXTURE_2D, handle ); 388 + bindTexture( renderer, handle ); 364 389 365 390 // Set the texture's stretching properties 366 391 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); ··· 386 411 // POT textures will change this later 387 412 data->tex_w = w; 388 413 data->tex_h = h; 389 - 390 - glBindTexture( GL_TEXTURE_2D, 0 ); 391 414 392 415 return result; 393 416 } ··· 410 433 } 411 434 412 435 glEnable(GL_TEXTURE_2D); 413 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)(result->data))->handle ); 436 + bindTexture( renderer, ((ImageData_OpenGL*)(result->data))->handle ); 414 437 415 438 GLenum internal_format = ((ImageData_OpenGL*)(result->data))->format; 416 439 w = result->w; ··· 430 453 ((ImageData_OpenGL*)(result->data))->tex_w = w; 431 454 ((ImageData_OpenGL*)(result->data))->tex_h = h; 432 455 433 - glBindTexture( GL_TEXTURE_2D, 0 ); 434 - 435 456 return result; 436 457 } 437 458 ··· 451 472 } 452 473 453 474 454 - static void readTexPixels(GPU_Target* source, unsigned int width, unsigned int height, GLint format, GLubyte* pixels) 475 + static void readTexPixels(GPU_Renderer* renderer, GPU_Target* source, unsigned int width, unsigned int height, GLint format, GLubyte* pixels) 455 476 { 456 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)source->data)->handle); 477 + bindFramebuffer(renderer, ((TargetData_OpenGL*)source->data)->handle); 457 478 glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, pixels); 458 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 459 479 } 460 480 461 - static unsigned char* getRawImageData(GPU_Image* image) 481 + static unsigned char* getRawImageData(GPU_Renderer* renderer, GPU_Image* image) 462 482 { 463 483 unsigned char* data = (unsigned char*)malloc(image->w * image->h * image->channels); 464 484 465 485 GPU_Target* tgt = GPU_LoadTarget(image); 466 - readTexPixels(tgt, image->w, image->h, ((ImageData_OpenGL*)image->data)->format, data); 486 + readTexPixels(renderer, tgt, image->w, image->h, ((ImageData_OpenGL*)image->data)->format, data); 467 487 GPU_FreeTarget(tgt); 468 488 469 489 return data; ··· 497 517 return 0; 498 518 } 499 519 500 - data = getRawImageData(image); 520 + data = getRawImageData(renderer, image); 501 521 502 522 if(data == NULL) 503 523 { ··· 814 834 815 835 816 836 glEnable(GL_TEXTURE_2D); 817 - glBindTexture(GL_TEXTURE_2D, data->handle); 837 + bindTexture(renderer, data->handle); 818 838 int alignment = 1; 819 839 if(newSurface->format->BytesPerPixel == 4) 820 840 alignment = 4; ··· 865 885 } 866 886 867 887 glEnable(GL_TEXTURE_2D); 868 - glBindTexture(GL_TEXTURE_2D, data->handle); 888 + bindTexture(renderer, data->handle); 869 889 int alignment = 1; 870 890 if(newSurface->format->BytesPerPixel == 4) 871 891 alignment = 4; ··· 986 1006 r.h = src->h; 987 1007 } 988 1008 989 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)dest->image->data)->handle ); 1009 + bindTexture( renderer, ((ImageData_OpenGL*)dest->image->data)->handle ); 990 1010 991 1011 //GLenum texture_format = GL_RGBA;//((ImageData_OpenGL*)image->data)->format; 992 1012 ··· 1055 1075 GLuint handle; 1056 1076 // Create framebuffer object 1057 1077 glGenFramebuffers(1, &handle); 1058 - glBindFramebuffer(GL_FRAMEBUFFER, handle); 1078 + bindFramebuffer(renderer, handle); 1059 1079 1060 1080 // Attach the texture to it 1061 1081 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle, 0); ··· 1063 1083 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 1064 1084 if(status != GL_FRAMEBUFFER_COMPLETE) 1065 1085 return NULL; 1066 - 1067 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 1068 1086 1069 1087 GPU_Target* result = (GPU_Target*)malloc(sizeof(GPU_Target)); 1070 1088 TargetData_OpenGL* data = (TargetData_OpenGL*)malloc(sizeof(TargetData_OpenGL)); ··· 1112 1130 1113 1131 1114 1132 // Bind the texture to which subsequent calls refer 1115 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)src->data)->handle ); 1133 + bindTexture( renderer, ((ImageData_OpenGL*)src->data)->handle ); 1116 1134 1117 1135 // Bind the FBO 1118 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)dest->data)->handle); 1136 + bindFramebuffer(renderer, ((TargetData_OpenGL*)dest->data)->handle); 1119 1137 1120 1138 // Modify the viewport and projection matrix if rendering to a texture 1121 1139 GLint vp[4]; ··· 1243 1261 glMatrixMode( GL_PROJECTION ); 1244 1262 glPopMatrix(); 1245 1263 glMatrixMode( GL_MODELVIEW ); 1246 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 1247 1264 1248 1265 // restore viewport and projection 1249 1266 if(renderer->display != dest) ··· 1393 1410 if(image == NULL) 1394 1411 return; 1395 1412 1396 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1413 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1397 1414 glGenerateMipmap(GL_TEXTURE_2D); 1398 1415 ((ImageData_OpenGL*)image->data)->hasMipmaps = 1; 1399 1416 ··· 1436 1453 if(renderer != image->renderer) 1437 1454 return; 1438 1455 1439 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1456 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1440 1457 1441 1458 GLint textureWidth, textureHeight; 1442 1459 ··· 1449 1466 GLubyte *buffer = (GLubyte *)malloc(textureWidth*textureHeight*image->channels); 1450 1467 1451 1468 GPU_Target* tgt = GPU_LoadTarget(image); 1452 - readTexPixels(tgt, textureWidth, textureHeight, texture_format, buffer); 1469 + readTexPixels(renderer, tgt, textureWidth, textureHeight, texture_format, buffer); 1453 1470 GPU_FreeTarget(tgt); 1454 1471 1455 1472 int x,y,i; ··· 1480 1497 if(renderer != image->renderer) 1481 1498 return; 1482 1499 1483 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1500 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1484 1501 1485 1502 GLint textureWidth, textureHeight; 1486 1503 ··· 1493 1510 GLubyte *buffer = (GLubyte *)malloc(textureWidth*textureHeight*4); 1494 1511 1495 1512 GPU_Target* tgt = GPU_LoadTarget(image); 1496 - readTexPixels(tgt, textureWidth, textureHeight, texture_format, buffer); 1513 + readTexPixels(renderer, tgt, textureWidth, textureHeight, texture_format, buffer); 1497 1514 GPU_FreeTarget(tgt); 1498 1515 1499 1516 int x,y,i; ··· 1618 1635 if(renderer != image->renderer) 1619 1636 return; 1620 1637 1621 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1638 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1622 1639 1623 1640 GLint textureWidth, textureHeight; 1624 1641 ··· 1631 1648 GLenum texture_format = ((ImageData_OpenGL*)image->data)->format; 1632 1649 1633 1650 GPU_Target* tgt = GPU_LoadTarget(image); 1634 - readTexPixels(tgt, textureWidth, textureHeight, texture_format, buffer); 1651 + readTexPixels(renderer, tgt, textureWidth, textureHeight, texture_format, buffer); 1635 1652 GPU_FreeTarget(tgt); 1636 1653 1637 1654 int x,y,i; ··· 1684 1701 if(renderer != image->renderer) 1685 1702 return; 1686 1703 1687 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1704 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1688 1705 1689 1706 GLint textureWidth, textureHeight; 1690 1707 ··· 1697 1714 GLenum texture_format = ((ImageData_OpenGL*)image->data)->format; 1698 1715 1699 1716 GPU_Target* tgt = GPU_LoadTarget(image); 1700 - readTexPixels(tgt, textureWidth, textureHeight, texture_format, buffer); 1717 + readTexPixels(renderer, tgt, textureWidth, textureHeight, texture_format, buffer); 1701 1718 GPU_FreeTarget(tgt); 1702 1719 1703 1720 int x,y,i; ··· 1762 1779 if(x < 0 || y < 0 || x >= target->w || y >= target->h) 1763 1780 return result; 1764 1781 1765 - // Bind the FBO 1766 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)target->data)->handle); 1782 + bindFramebuffer(renderer, ((TargetData_OpenGL*)target->data)->handle); 1767 1783 1768 1784 unsigned char pixels[4]; 1769 1785 glReadPixels(x, y, 1, 1, ((TargetData_OpenGL*)target->data)->format, GL_UNSIGNED_BYTE, pixels); ··· 1772 1788 result.g = pixels[1]; 1773 1789 result.b = pixels[2]; 1774 1790 result.unused = pixels[3]; 1775 - 1776 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 1777 1791 1778 1792 return result; 1779 1793 } ··· 1785 1799 if(renderer != image->renderer) 1786 1800 return; 1787 1801 1788 - glBindTexture( GL_TEXTURE_2D, ((ImageData_OpenGL*)image->data)->handle ); 1802 + bindTexture( renderer, ((ImageData_OpenGL*)image->data)->handle ); 1789 1803 1790 1804 GLenum minFilter = GL_NEAREST; 1791 1805 GLenum magFilter = GL_NEAREST; ··· 1887 1901 if(renderer != target->renderer) 1888 1902 return; 1889 1903 1890 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)target->data)->handle); 1904 + bindFramebuffer(renderer, ((TargetData_OpenGL*)target->data)->handle); 1891 1905 SDL_Rect viewport = getViewport(); 1892 1906 glViewport(0,0,target->w, target->h); 1893 1907 ··· 1913 1927 } 1914 1928 1915 1929 setViewport(viewport); 1916 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 1917 1930 } 1918 1931 1919 1932 ··· 1924 1937 if(renderer != target->renderer) 1925 1938 return; 1926 1939 1927 - glBindFramebuffer(GL_FRAMEBUFFER, ((TargetData_OpenGL*)target->data)->handle); 1940 + bindFramebuffer(renderer, ((TargetData_OpenGL*)target->data)->handle); 1928 1941 1929 1942 SDL_Rect viewport = getViewport(); 1930 1943 glViewport(0,0,target->w, target->h); ··· 1949 1962 } 1950 1963 1951 1964 setViewport(viewport); 1952 - glBindFramebuffer(GL_FRAMEBUFFER, 0); 1953 1965 } 1954 1966 1955 1967 static void Flip(GPU_Renderer* renderer)
+10
SDL_gpu/OpenGL_common/SDL_gpu_OpenGL.h
··· 30 30 #define GL_FUNC_REVERSE_SUBTRACT GL_FUNC_REVERSE_SUBTRACT_OES 31 31 #endif 32 32 33 + #define GPU_BLIT_BUFFER_STRIDE (sizeof(float)*5) 34 + #define GPU_BLIT_BUFFER_VERTEX_OFFSET 0 35 + #define GPU_BLIT_BUFFER_TEX_COORD_OFFSET 3 36 + 33 37 typedef struct RendererData_OpenGL 34 38 { 35 39 #ifdef SDL_GPU_USE_SDL2 ··· 39 43 GLuint handle; 40 44 float z; 41 45 Uint8 blending; 46 + 47 + GLuint last_texture; 48 + GLuint last_framebuffer; 49 + /*float* blit_buffer; // Holds sets of 4 vertices and 4 tex coords interleaved (e.g. [x0, y0, z0, s0, t0, ...]). 50 + int blit_buffer_size; 51 + int blit_buffer_max_size;*/ 42 52 } RendererData_OpenGL; 43 53 44 54 typedef struct ImageData_OpenGL