From cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 16 Sep 2009 12:57:26 -0600 Subject: [PATCH 01/10] st/mesa: fix texture memory allocation bug The following example caused an incorrect GL_OUT_OF_MEMORY error to be raised in glTexSubImage2D: glTexImage2D(level=0, width=32, height=32, pixels=NULL); glTexImage2D(level=0, width=64, height=64, pixels=NULL); glTexSubImage2D(level=0, pixels!=NULL); The second glTexImage2D() call needs to cause the first image to be deallocated then reallocated at the new size. This was not happening because we were testing for pixels==NULL too early. --- src/mesa/state_tracker/st_cb_texture.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 2db28ef0a44..31196fe776b 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -661,8 +661,10 @@ st_TexImage(GLcontext * ctx, format, type, pixels, unpack, "glTexImage"); } - if (!pixels) - return; + + /* Note: we can't check for pixels==NULL until after we've allocated + * memory for the texture. + */ /* See if we can do texture compression with a blit/render. */ @@ -673,6 +675,9 @@ st_TexImage(GLcontext * ctx, stImage->pt->format, stImage->pt->target, PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) { + if (!pixels) + goto done; + if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, format, type, pixels, unpack, texImage)) { goto done; @@ -714,6 +719,9 @@ st_TexImage(GLcontext * ctx, return; } + if (!pixels) + goto done; + DBG("Upload image %dx%dx%d row_len %x pitch %x\n", width, height, depth, width * texelBytes, dstRowStride); From 08d39251a79a964e4a3ac0d7d8a397c2b66a0808 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 16 Sep 2009 13:07:12 -0600 Subject: [PATCH 02/10] st/mesa: fix some incorrect branching/clean-up code in TexImage functions We need to be sure to call the _mesa_unmap_teximage_pbo() function if we called _mesa_validate_pbo_teximage(). --- src/mesa/state_tracker/st_cb_texture.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 31196fe776b..cfa33d48e12 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -764,9 +764,9 @@ st_TexImage(GLcontext * ctx, } } +done: _mesa_unmap_teximage_pbo(ctx, unpack); -done: if (stImage->pt && texImage->Data) { st_texture_image_unmap(ctx->st, stImage); texImage->Data = NULL; @@ -1107,7 +1107,7 @@ st_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, if (!texImage->Data) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); - return; + goto done; } src = (const GLubyte *) pixels; @@ -1138,9 +1138,9 @@ st_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, } } +done: _mesa_unmap_teximage_pbo(ctx, packing); -done: if (stImage->pt) { st_texture_image_unmap(ctx->st, stImage); texImage->Data = NULL; From 9666529b5a5be1fcde82caadc2fe2efa5ea81e49 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 16 Sep 2009 16:43:50 -0700 Subject: [PATCH 03/10] glx: Use initstate_r / random_r instead of corrupting global random number state Previously srandom and random were used. This cause the global random number generator state to be modified. This caused problems for applications that called srandom before calling into GLX. By using local state the global state is left unmodified. This should fix bug #23774. --- src/glx/x11/glxhash.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/glx/x11/glxhash.c b/src/glx/x11/glxhash.c index 74cd4f344df..7d28ada49ca 100644 --- a/src/glx/x11/glxhash.c +++ b/src/glx/x11/glxhash.c @@ -87,9 +87,13 @@ #define HASH_ALLOC malloc #define HASH_FREE free -#define HASH_RANDOM_DECL -#define HASH_RANDOM_INIT(seed) srandom(seed) -#define HASH_RANDOM random() +#define HASH_RANDOM_DECL struct random_data rd; int32_t rv; char rs[256] +#define HASH_RANDOM_INIT(seed) \ + do { \ + (void) memset(&rd, 0, sizeof(rd)); \ + (void) initstate_r(seed, rs, sizeof(rs), &rd); \ + } while(0) +#define HASH_RANDOM ((void) random_r(&rd, &rv), rv) #define HASH_RANDOM_DESTROY typedef struct __glxHashBucket From fac38e8c8f1814ae54703b872db8c6dd21c34a3b Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 16 Sep 2009 21:21:42 -0600 Subject: [PATCH 04/10] mesa: fix clip plane, fog issues --- src/mesa/drivers/common/meta.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 47090ba297b..ddd476eba1c 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -656,7 +656,6 @@ _mesa_meta_end(GLcontext *ctx) _mesa_MatrixMode(save->MatrixMode); - save->ClipPlanesEnabled = ctx->Transform.ClipPlanesEnabled; if (save->ClipPlanesEnabled) { GLuint i; for (i = 0; i < ctx->Const.MaxClipPlanes; i++) { @@ -692,9 +691,6 @@ _mesa_meta_end(GLcontext *ctx) if (save->Lighting) { _mesa_set_enable(ctx, GL_LIGHTING, GL_TRUE); } - if (save->Fog) { - _mesa_set_enable(ctx, GL_FOG, GL_TRUE); - } } From a66bab0e379c3add034667ed394bcead386d8c10 Mon Sep 17 00:00:00 2001 From: Zou Nan hai Date: Fri, 18 Sep 2009 13:29:28 +0800 Subject: [PATCH 05/10] [i965] use intel_batchbuffer_flush to flush the clear --- src/mesa/drivers/dri/intel/intel_clear.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c index 9efe6a277c7..736434d7639 100644 --- a/src/mesa/drivers/dri/intel/intel_clear.c +++ b/src/mesa/drivers/dri/intel/intel_clear.c @@ -170,8 +170,9 @@ intelClear(GLcontext *ctx, GLbitfield mask) } DBG("\n"); } - intelFlush(&intel->ctx); + _mesa_meta_clear(&intel->ctx, tri_mask); + intel_batchbuffer_flush(intel->batch); } if (swrast_mask) { From 1e4c3535111dc431e4fe51da6892259a5ebe2ae6 Mon Sep 17 00:00:00 2001 From: Zou Nan hai Date: Fri, 18 Sep 2009 16:04:41 +0800 Subject: [PATCH 06/10] [i965] add a missing header file --- src/mesa/drivers/dri/intel/intel_clear.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c index 736434d7639..9010b910c7d 100644 --- a/src/mesa/drivers/dri/intel/intel_clear.c +++ b/src/mesa/drivers/dri/intel/intel_clear.c @@ -38,6 +38,7 @@ #include "intel_fbo.h" #include "intel_pixel.h" #include "intel_regions.h" +#include "intel_batchbuffer.h" #define FILE_DEBUG_FLAG DEBUG_BLIT From 6c323a2473cbfcdf41a8b3c395fcd277e16b963c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Sun, 20 Sep 2009 16:33:59 +0200 Subject: [PATCH 07/10] r300/compiler: Fix R300 fragment program regression introduced by 0723cd1... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We obviously need to move the code addr register backwards because their may be overlap. This bug affected in particular the Compiz water plugin. Signed-off-by: Nicolai Hähnle --- src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c index 305dc074ee8..c7227bbd15b 100644 --- a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c @@ -352,7 +352,7 @@ void r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compi if (emit.current_node < 3) { int shift = 3 - emit.current_node; int i; - for(i = 0; i <= emit.current_node; ++i) + for(i = emit.current_node; i >= 0; --i) code->code_addr[shift + i] = code->code_addr[i]; for(i = 0; i < shift; ++i) code->code_addr[i] = 0; From c8c5de9e9a310633a2d046e63a7277820e0577ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Sun, 20 Sep 2009 16:46:58 +0200 Subject: [PATCH 08/10] docs: Document new features in radeon/r200/r300 drivers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolai Hähnle --- docs/relnotes-7.6.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/relnotes-7.6.html b/docs/relnotes-7.6.html index 9cd3417e7ea..aaa36188d9d 100644 --- a/docs/relnotes-7.6.html +++ b/docs/relnotes-7.6.html @@ -50,6 +50,8 @@ This was written by Zack Rusin at Tungsten Graphics.
  • Rewritten radeon/r200/r300 driver using a buffer manager
  • radeon/r200/r300 GL_EXT_framebuffer_object support when used with kernel memory manager +
  • radeon/r200/r300 support for GL_ARB_occlusion_query
  • +
  • r300 driver supports OpenGL 1.5
  • r300 driver support for GL_EXT_vertex_array_bgra, GL_EXT_texture_sRGB
  • i915/945 driver support for GL_ARB_point_sprite, GL_EXT_stencil_two_side and GL_ATI_separate_stencil extensions From c4ce6f6a7c124c62a8ee9bd9fba28fc69a38e18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Sat, 12 Sep 2009 12:13:35 +0200 Subject: [PATCH 09/10] mesa/st: Initialize format bits of framebuffer renderbuffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nicolai Hähnle --- src/mesa/state_tracker/st_cb_fbo.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 21ddf2fc7a2..6762ed39c3b 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -256,6 +256,7 @@ st_new_renderbuffer_fb(enum pipe_format format, int samples, boolean sw) strb->Base.ClassID = 0x4242; /* just a unique value */ strb->Base.NumSamples = samples; strb->format = format; + init_renderbuffer_bits(strb, format); strb->software = sw; switch (format) { From e617dd14ab4863921c02612ab76faa94b02a155c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Sat, 12 Sep 2009 16:49:31 +0200 Subject: [PATCH 10/10] mesa/st: Create front renderbuffer on the fly when supplied with a surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Normally, the mesa/st would create a fake front buffer out of a client-allocated surface. In the DRI setting, however, st/dri provides a front buffer surface which is created and maintained by the X server. Prefer to use this surface instead, so that front buffer rendering and reading works correctly. Signed-off-by: Nicolai Hähnle --- src/mesa/state_tracker/st_framebuffer.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mesa/state_tracker/st_framebuffer.c b/src/mesa/state_tracker/st_framebuffer.c index ca32b2e573c..5c0d335d62d 100644 --- a/src/mesa/state_tracker/st_framebuffer.c +++ b/src/mesa/state_tracker/st_framebuffer.c @@ -66,7 +66,7 @@ st_create_framebuffer( const __GLcontextModes *visual, else { /* Only allocate front buffer right now if we're single buffered. * If double-buffered, allocate front buffer on demand later. - * See check_create_front_buffers(). + * See check_create_front_buffers() and st_set_framebuffer_surface(). */ struct gl_renderbuffer *rb = st_new_renderbuffer_fb(colorFormat, samples, FALSE); @@ -170,8 +170,20 @@ st_set_framebuffer_surface(struct st_framebuffer *stfb, strb = st_renderbuffer(stfb->Base.Attachment[surfIndex].Renderbuffer); - /* fail */ - if (!strb) return; + if (!strb) { + if (surfIndex == ST_SURFACE_FRONT_LEFT) { + /* Delayed creation when the window system supplies a fake front buffer */ + struct st_renderbuffer *strb_back + = st_renderbuffer(stfb->Base.Attachment[ST_SURFACE_BACK_LEFT].Renderbuffer); + struct gl_renderbuffer *rb + = st_new_renderbuffer_fb(surf->format, strb_back->Base.NumSamples, FALSE); + _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb); + strb = st_renderbuffer(rb); + } else { + /* fail */ + return; + } + } /* replace the renderbuffer's surface/texture pointers */ pipe_surface_reference( &strb->surface, surf );