gallium: add some checks for null surface pointers in state tracker
Fixes some segfaults in low memory situations.
This commit is contained in:
@@ -118,11 +118,12 @@ update_framebuffer_state( struct st_context *st )
|
||||
update_renderbuffer_surface(st, strb);
|
||||
}
|
||||
|
||||
assert(strb->surface);
|
||||
if (strb->surface) {
|
||||
framebuffer->cbufs[framebuffer->num_cbufs] = strb->surface;
|
||||
framebuffer->num_cbufs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer);
|
||||
if (strb) {
|
||||
@@ -132,7 +133,6 @@ update_framebuffer_state( struct st_context *st )
|
||||
update_renderbuffer_surface(st, strb);
|
||||
}
|
||||
|
||||
assert(strb->surface);
|
||||
framebuffer->zsbuf = strb->surface;
|
||||
}
|
||||
else {
|
||||
|
@@ -406,13 +406,17 @@ check_clear_stencil_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
static void
|
||||
clear_color_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
{
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
if (!strb->surface)
|
||||
return;
|
||||
|
||||
if (check_clear_color_with_quad( ctx, rb )) {
|
||||
/* masking or scissoring */
|
||||
clear_with_quad(ctx, GL_TRUE, GL_FALSE, GL_FALSE);
|
||||
}
|
||||
else {
|
||||
/* clear whole buffer w/out masking */
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
uint clearValue;
|
||||
/* NOTE: we always pass the clear color as PIPE_FORMAT_A8R8G8B8_UNORM
|
||||
* at this time!
|
||||
@@ -426,13 +430,16 @@ clear_color_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
static void
|
||||
clear_depth_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
{
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
if (!strb->surface)
|
||||
return;
|
||||
|
||||
if (check_clear_depth_with_quad(ctx, rb)) {
|
||||
/* scissoring or we have a combined depth/stencil buffer */
|
||||
clear_with_quad(ctx, GL_FALSE, GL_TRUE, GL_FALSE);
|
||||
}
|
||||
else {
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
/* simple clear of whole buffer */
|
||||
uint clearValue = util_pack_z(strb->surface->format, ctx->Depth.Clear);
|
||||
ctx->st->pipe->clear(ctx->st->pipe, strb->surface, clearValue);
|
||||
@@ -443,13 +450,16 @@ clear_depth_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
static void
|
||||
clear_stencil_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
{
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
if (!strb->surface)
|
||||
return;
|
||||
|
||||
if (check_clear_stencil_with_quad(ctx, rb)) {
|
||||
/* masking or scissoring or combined depth/stencil buffer */
|
||||
clear_with_quad(ctx, GL_FALSE, GL_FALSE, GL_TRUE);
|
||||
}
|
||||
else {
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
/* simple clear of whole buffer */
|
||||
GLuint clearValue = ctx->Stencil.Clear;
|
||||
|
||||
@@ -469,14 +479,16 @@ clear_stencil_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
static void
|
||||
clear_depth_stencil_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
{
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
if (!strb->surface)
|
||||
return;
|
||||
|
||||
if (check_clear_depth_stencil_with_quad(ctx, rb)) {
|
||||
/* masking or scissoring */
|
||||
clear_with_quad(ctx, GL_FALSE, GL_TRUE, GL_TRUE);
|
||||
}
|
||||
else {
|
||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||
|
||||
/* clear whole buffer w/out masking */
|
||||
GLuint clearValue = util_pack_z(strb->surface->format, ctx->Depth.Clear);
|
||||
|
||||
|
@@ -289,6 +289,7 @@ st_notify_swapbuffers_complete(struct st_framebuffer *stfb)
|
||||
for (i = 0; i < BUFFER_COUNT; i++) {
|
||||
if (stfb->Base.Attachment[i].Renderbuffer) {
|
||||
strb = st_renderbuffer(stfb->Base.Attachment[i].Renderbuffer);
|
||||
if (strb->surface)
|
||||
strb->surface->status = PIPE_SURFACE_STATUS_UNDEFINED;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user