Thanks Brecht! -mats
On Oct 28, 2011, at 7:57 PM, Brecht Van Lommel wrote: > Revision: 41345 > > http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41345 > Author: blendix > Date: 2011-10-28 16:57:06 +0000 (Fri, 28 Oct 2011) > Log Message: > ----------- > Fix: OpenGL renders on graphics cards which do not support non-power-of-two > textures were stretched and the wrong size. > > Modified Paths: > -------------- > trunk/blender/source/blender/editors/render/render_opengl.c > trunk/blender/source/blender/editors/space_view3d/view3d_draw.c > trunk/blender/source/blender/gpu/GPU_extensions.h > trunk/blender/source/blender/gpu/intern/gpu_extensions.c > trunk/blender/source/blender/gpu/intern/gpu_material.c > > Modified: trunk/blender/source/blender/editors/render/render_opengl.c > =================================================================== > --- trunk/blender/source/blender/editors/render/render_opengl.c > 2011-10-28 16:13:07 UTC (rev 41344) > +++ trunk/blender/source/blender/editors/render/render_opengl.c > 2011-10-28 16:57:06 UTC (rev 41345) > @@ -154,7 +154,7 @@ > > if((scene->r.mode & R_OSA) == 0) { > ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, > NULL, winmat); > - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, > rr->rectf); > + GPU_offscreen_read_pixels(oglrender->ofs, GL_FLOAT, > rr->rectf); > } > else { > /* simple accumulation, less hassle then FSAA FBO's */ > @@ -167,7 +167,7 @@ > > /* first sample buffer, also initializes > 'rv3d->persmat' */ > ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, > NULL, winmat); > - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, > accum_buffer); > + GPU_offscreen_read_pixels(oglrender->ofs, GL_FLOAT, > accum_buffer); > > /* skip the first sample */ > for(j=1; j < SAMPLES; j++) { > @@ -175,7 +175,7 @@ > window_translate_m4(winmat_jitter, > rv3d->persmat, jit_ofs[j][0] / sizex, jit_ofs[j][1] / sizey); > > ED_view3d_draw_offscreen(scene, v3d, ar, sizex, > sizey, NULL, winmat_jitter); > - glReadPixels(0, 0, sizex, sizey, GL_RGBA, > GL_FLOAT, accum_tmp); > + GPU_offscreen_read_pixels(oglrender->ofs, > GL_FLOAT, accum_tmp); > add_vn_vn(accum_buffer, accum_tmp, > sizex*sizey*sizeof(float)); > } > > @@ -278,7 +278,7 @@ > sizey= (scene->r.size*scene->r.ysch)/100; > > /* corrects render size with actual size, not every card supports > non-power-of-two dimensions */ > - ofs= GPU_offscreen_create(&sizex, &sizey, err_out); > + ofs= GPU_offscreen_create(sizex, sizey, err_out); > > if(!ofs) { > BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL > offscreen buffer, %s", err_out); > > Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c > =================================================================== > --- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c > 2011-10-28 16:13:07 UTC (rev 41344) > +++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c > 2011-10-28 16:57:06 UTC (rev 41345) > @@ -2379,7 +2379,7 @@ > glPushAttrib(GL_LIGHTING_BIT); > > /* bind */ > - ofs= GPU_offscreen_create(&sizex, &sizey, err_out); > + ofs= GPU_offscreen_create(sizex, sizey, err_out); > if(ofs == NULL) > return NULL; > > @@ -2403,9 +2403,9 @@ > ibuf= IMB_allocImBuf(sizex, sizey, 32, flag); > > if(ibuf->rect_float) > - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, > ibuf->rect_float); > + GPU_offscreen_read_pixels(ofs, GL_FLOAT, ibuf->rect_float); > else if(ibuf->rect) > - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_UNSIGNED_BYTE, > ibuf->rect); > + GPU_offscreen_read_pixels(ofs, GL_UNSIGNED_BYTE, ibuf->rect); > > //if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW)) > // BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4); > > Modified: trunk/blender/source/blender/gpu/GPU_extensions.h > =================================================================== > --- trunk/blender/source/blender/gpu/GPU_extensions.h 2011-10-28 16:13:07 UTC > (rev 41344) > +++ trunk/blender/source/blender/gpu/GPU_extensions.h 2011-10-28 16:57:06 UTC > (rev 41345) > @@ -136,7 +136,7 @@ > GPUFrameBuffer *GPU_framebuffer_create(void); > int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char > err_out[256]); > void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex); > -void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex); > +void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex, int > w, int h); > void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex); > void GPU_framebuffer_free(GPUFrameBuffer *fb); > > @@ -146,10 +146,11 @@ > - wrapper around framebuffer and texture for simple offscreen drawing > - changes size if graphics card can't support it */ > > -GPUOffScreen *GPU_offscreen_create(int *width, int *height, char > err_out[256]); > +GPUOffScreen *GPU_offscreen_create(int width, int height, char err_out[256]); > void GPU_offscreen_free(GPUOffScreen *ofs); > void GPU_offscreen_bind(GPUOffScreen *ofs); > void GPU_offscreen_unbind(GPUOffScreen *ofs); > +void GPU_offscreen_read_pixels(GPUOffScreen *ofs, int type, void *pixels); > > /* GPU Shader > - only for fragment shaders now > > Modified: trunk/blender/source/blender/gpu/intern/gpu_extensions.c > =================================================================== > --- trunk/blender/source/blender/gpu/intern/gpu_extensions.c 2011-10-28 > 16:13:07 UTC (rev 41344) > +++ trunk/blender/source/blender/gpu/intern/gpu_extensions.c 2011-10-28 > 16:57:06 UTC (rev 41345) > @@ -790,7 +790,7 @@ > tex->fb = NULL; > } > > -void GPU_framebuffer_texture_bind(GPUFrameBuffer *UNUSED(fb), GPUTexture > *tex) > +void GPU_framebuffer_texture_bind(GPUFrameBuffer *UNUSED(fb), GPUTexture > *tex, int w, int h) > { > /* push attributes */ > glPushAttrib(GL_ENABLE_BIT); > @@ -801,7 +801,7 @@ > glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, tex->fb->object); > > /* push matrices and set default viewport and matrix */ > - glViewport(0, 0, tex->w, tex->h); > + glViewport(0, 0, w, h); > GG.currentfb = tex->fb->object; > > glMatrixMode(GL_PROJECTION); > @@ -859,13 +859,19 @@ > GPUFrameBuffer *fb; > GPUTexture *color; > GPUTexture *depth; > + > + /* requested width/height, may be smaller than actual texture size due > + to missing non-power of two support, so we compensate for that */ > + int w, h; > }; > > -GPUOffScreen *GPU_offscreen_create(int *width, int *height, char > err_out[256]) > +GPUOffScreen *GPU_offscreen_create(int width, int height, char err_out[256]) > { > GPUOffScreen *ofs; > > ofs= MEM_callocN(sizeof(GPUOffScreen), "GPUOffScreen"); > + ofs->w= width; > + ofs->h= height; > > ofs->fb = GPU_framebuffer_create(); > if(!ofs->fb) { > @@ -873,24 +879,18 @@ > return NULL; > } > > - ofs->depth = GPU_texture_create_depth(*width, *height, err_out); > + ofs->depth = GPU_texture_create_depth(width, height, err_out); > if(!ofs->depth) { > GPU_offscreen_free(ofs); > return NULL; > } > > - if(*width!=ofs->depth->w || *height!=ofs->depth->h) { > - *width= ofs->depth->w; > - *height= ofs->depth->h; > - printf("Offscreen size differs from given size!\n"); > - } > - > if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->depth, err_out)) { > GPU_offscreen_free(ofs); > return NULL; > } > > - ofs->color = GPU_texture_create_2D(*width, *height, NULL, err_out); > + ofs->color = GPU_texture_create_2D(width, height, NULL, err_out); > if(!ofs->color) { > GPU_offscreen_free(ofs); > return NULL; > @@ -921,7 +921,7 @@ > void GPU_offscreen_bind(GPUOffScreen *ofs) > { > glDisable(GL_SCISSOR_TEST); > - GPU_framebuffer_texture_bind(ofs->fb, ofs->color); > + GPU_framebuffer_texture_bind(ofs->fb, ofs->color, ofs->w, ofs->h); > } > > void GPU_offscreen_unbind(GPUOffScreen *ofs) > @@ -931,6 +931,11 @@ > glEnable(GL_SCISSOR_TEST); > } > > +void GPU_offscreen_read_pixels(GPUOffScreen *ofs, int type, void *pixels) > +{ > + glReadPixels(0, 0, ofs->w, ofs->h, GL_RGBA, type, pixels); > +} > + > /* GPUShader */ > > struct GPUShader { > > Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c > =================================================================== > --- trunk/blender/source/blender/gpu/intern/gpu_material.c 2011-10-28 > 16:13:07 UTC (rev 41344) > +++ trunk/blender/source/blender/gpu/intern/gpu_material.c 2011-10-28 > 16:57:06 UTC (rev 41345) > @@ -1661,7 +1661,8 @@ > > /* opengl */ > glDisable(GL_SCISSOR_TEST); > - GPU_framebuffer_texture_bind(lamp->fb, lamp->tex); > + GPU_framebuffer_texture_bind(lamp->fb, lamp->tex, > + GPU_texture_opengl_width(lamp->tex), > GPU_texture_opengl_height(lamp->tex)); > > /* set matrices */ > copy_m4_m4(viewmat, lamp->viewmat); > > _______________________________________________ > Bf-blender-cvs mailing list > bf-blender-...@blender.org > http://lists.blender.org/mailman/listinfo/bf-blender-cvs _______________________________________________ Bf-committers mailing list Bf-committers@blender.org http://lists.blender.org/mailman/listinfo/bf-committers