From 210b74c613c435dd1f1f212466c5d120b9b9e6e8 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 3 May 2010 13:58:51 -0600 Subject: [PATCH 1/4] glsl: change variable declared assertion into conditional The slang_variable::declared field originated as a debug field but can be promoted for use during sematic error checking. Fixes fd.o bug 27921. NOTE: this is a candidate for back-porting to the 7.8 stable branch. (cherry picked from commit a12614362a79d676eeb1c3030ed52057bcb8f4f8) --- src/mesa/shader/slang/slang_codegen.c | 3 +-- src/mesa/shader/slang/slang_compile_variable.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index ecb2f6d5c1e..7d5e5eb2938 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -4187,11 +4187,10 @@ _slang_gen_variable(slang_assemble_ctx * A, slang_operation *oper) slang_atom name = oper->var ? oper->var->a_name : oper->a_id; slang_variable *var = _slang_variable_locate(oper->locals, name, GL_TRUE); slang_ir_node *n; - if (!var) { + if (!var || !var->declared) { slang_info_log_error(A->log, "undefined variable '%s'", (char *) name); return NULL; } - assert(var->declared); n = new_var(A, var); return n; } diff --git a/src/mesa/shader/slang/slang_compile_variable.h b/src/mesa/shader/slang/slang_compile_variable.h index b4585599f24..5c9d248b354 100644 --- a/src/mesa/shader/slang/slang_compile_variable.h +++ b/src/mesa/shader/slang/slang_compile_variable.h @@ -41,7 +41,7 @@ typedef struct slang_variable_ GLuint size; /**< Variable's size in bytes */ GLboolean is_global; GLboolean isTemp; /**< a named temporary (__resultTmp) */ - GLboolean declared; /**< for debug */ + GLboolean declared; /**< has the var been declared? */ struct slang_ir_storage_ *store; /**< Storage for this var */ } slang_variable; From 3c407b52ff46d2adc8fd927ecb91b8bbd0066dcc Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 4 May 2010 21:44:02 -0600 Subject: [PATCH 2/4] osmesa: fix OSMesa for CHAN_BITS=32 CHAN_BITS=16 still broken. NOTE: this is a candidate for back-porting to the 7.8 stable branch. (cherry picked from commit 36b3a8bd5a317ab297f44b19fd14c7e76ec2fc77) --- src/mesa/drivers/osmesa/osmesa.c | 37 ++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index e20507ae92f..e376f12bc3a 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -1004,7 +1004,20 @@ new_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) rb->AllocStorage = osmesa_renderbuffer_storage; rb->InternalFormat = GL_RGBA; - rb->Format = MESA_FORMAT_RGBA8888; + switch (type) { + case GL_UNSIGNED_BYTE: + rb->Format = MESA_FORMAT_RGBA8888; + break; + case GL_UNSIGNED_SHORT: + rb->Format = MESA_FORMAT_SIGNED_RGBA_16; + break; + case GL_FLOAT: + rb->Format = MESA_FORMAT_RGBA_FLOAT32; + break; + default: + assert(0 && "Unexpected type in new_osmesa_renderbuffer()"); + rb->Format = MESA_FORMAT_RGBA8888; + } rb->_BaseFormat = GL_RGBA; rb->DataType = type; } @@ -1167,11 +1180,9 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, return NULL; } - /* create front color buffer in user-provided memory (no back buffer) */ - osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, format, type); - _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); - assert(osmesa->rb->RefCount == 2); - + /* Create depth/stencil/accum buffers. We'll create the color + * buffer later in OSMesaMakeCurrent(). + */ _mesa_add_soft_renderbuffers(osmesa->gl_buffer, GL_FALSE, /* color */ osmesa->gl_visual->haveDepthBuffer, @@ -1308,11 +1319,23 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, */ _glapi_check_multithread(); + + /* Create a front/left color buffer which wraps the user-provided buffer. + * There is no back color buffer. + * If the user tries to use a 8, 16 or 32-bit/channel buffer that + * doesn't match what Mesa was compiled for (CHAN_BITS) the + * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer + * that converts rendering from CHAN_BITS to the user-requested channel + * size. + */ + osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type); + _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); + assert(osmesa->rb->RefCount == 2); + /* Set renderbuffer fields. Set width/height = 0 to force * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer() */ osmesa->rb->Data = buffer; - osmesa->rb->DataType = type; osmesa->rb->Width = osmesa->rb->Height = 0; /* Set the framebuffer's size. This causes the From 8b68c0aa24da7723c359e6a8a352f6e8fb584b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 7 May 2010 18:38:35 -0400 Subject: [PATCH 3/4] glx: Get GLX_SCREEN first in __glXQueryContextInfo() And lookup the GLX screen for the context. Otherwise we'll end up jumping through a NULL-pointer once we try to look up the visual or config for the shared context. https://bugs.freedesktop.org/show_bug.cgi?id=14245 --- src/glx/glxcmds.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 9e4e194d442..90fc59aa8c7 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -1766,6 +1766,15 @@ static int __glXQueryContextInfo(Display * dpy, GLXContext ctx) unsigned i; _XRead(dpy, (char *) propList, nPropListBytes); + + /* Look up screen first so we can look up visuals/fbconfigs later */ + pProp = propList; + for (i = 0; i < numValues; i++, pProp += 2) + if (pProp[0] == GLX_SCREEN) { + ctx->screen = pProp[1]; + ctx->psc = GetGLXScreenConfigs(dpy, ctx->screen); + } + pProp = propList; for (i = 0; i < numValues; i++) { switch (*pProp++) { @@ -1776,9 +1785,6 @@ static int __glXQueryContextInfo(Display * dpy, GLXContext ctx) ctx->mode = _gl_context_modes_find_visual(ctx->psc->visuals, *pProp++); break; - case GLX_SCREEN: - ctx->screen = *pProp++; - break; case GLX_FBCONFIG_ID: ctx->mode = _gl_context_modes_find_fbconfig(ctx->psc->configs, @@ -1787,6 +1793,7 @@ static int __glXQueryContextInfo(Display * dpy, GLXContext ctx) case GLX_RENDER_TYPE: ctx->renderType = *pProp++; break; + case GLX_SCREEN: default: pProp++; continue; From f3b55494f33e8c6569f8a1ca7dacc9e0f0dd1228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 12 May 2010 14:34:55 -0400 Subject: [PATCH 4/4] egl_dri2: Zero out driver struct Otherwise testing ->Probe for non-NULL and calling it goes boom. --- src/egl/drivers/dri2/egl_dri2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 2dfb70de000..b7ffc8759c1 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1331,6 +1331,7 @@ _eglMain(const char *args) if (!dri2_drv) return NULL; + memset(dri2_drv, 0, sizeof *dri2_drv); _eglInitDriverFallbacks(&dri2_drv->base); dri2_drv->base.API.Initialize = dri2_initialize; dri2_drv->base.API.Terminate = dri2_terminate;