projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
st/mesa: add some null pointer checking to better handle out of memory
[mesa.git]
/
src
/
mesa
/
state_tracker
/
st_cb_clear.c
diff --git
a/src/mesa/state_tracker/st_cb_clear.c
b/src/mesa/state_tracker/st_cb_clear.c
index 181fedd2b9923fc09061aeb8cfc6b2cf6af630cb..89273e28e893a180c89f49a2cafaa63adc4a2683 100644
(file)
--- a/
src/mesa/state_tracker/st_cb_clear.c
+++ b/
src/mesa/state_tracker/st_cb_clear.c
@@
-136,7
+136,7
@@
set_vertex_shader(struct st_context *st)
static void
draw_quad(struct st_context *st,
float x0, float y0, float x1, float y1, GLfloat z,
static void
draw_quad(struct st_context *st,
float x0, float y0, float x1, float y1, GLfloat z,
- const
GLfloat color[4]
)
+ const
union pipe_color_union *color
)
{
struct pipe_context *pipe = st->pipe;
{
struct pipe_context *pipe = st->pipe;
@@
-165,6
+165,11
@@
draw_quad(struct st_context *st,
max_slots * sizeof(st->clear.vertices));
}
max_slots * sizeof(st->clear.vertices));
}
+ if (!st->clear.vbuf) {
+ /* ran out of memory */
+ return;
+ }
+
/* positions */
st->clear.vertices[0][0][0] = x0;
st->clear.vertices[0][0][1] = y0;
/* positions */
st->clear.vertices[0][0][0] = x0;
st->clear.vertices[0][0][1] = y0;
@@
-182,10
+187,10
@@
draw_quad(struct st_context *st,
for (i = 0; i < 4; i++) {
st->clear.vertices[i][0][2] = z;
st->clear.vertices[i][0][3] = 1.0;
for (i = 0; i < 4; i++) {
st->clear.vertices[i][0][2] = z;
st->clear.vertices[i][0][3] = 1.0;
- st->clear.vertices[i][1][0] = color[0];
- st->clear.vertices[i][1][1] = color[1];
- st->clear.vertices[i][1][2] = color[2];
- st->clear.vertices[i][1][3] = color[3];
+ st->clear.vertices[i][1][0] = color
->f
[0];
+ st->clear.vertices[i][1][1] = color
->f
[1];
+ st->clear.vertices[i][1][2] = color
->f
[2];
+ st->clear.vertices[i][1][3] = color
->f
[3];
}
/* put vertex data into vbuf */
}
/* put vertex data into vbuf */
@@
-227,7
+232,7
@@
clear_with_quad(struct gl_context *ctx,
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax / fb_width * 2.0f - 1.0f;
const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax / fb_width * 2.0f - 1.0f;
const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
-
float clearColor[4]
;
+
union pipe_color_union clearColor
;
/*
printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__,
/*
printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__,
@@
-246,6
+251,7
@@
clear_with_quad(struct gl_context *ctx,
cso_save_clip(st->cso_context);
cso_save_fragment_shader(st->cso_context);
cso_save_vertex_shader(st->cso_context);
cso_save_clip(st->cso_context);
cso_save_fragment_shader(st->cso_context);
cso_save_vertex_shader(st->cso_context);
+ cso_save_geometry_shader(st->cso_context);
cso_save_vertex_elements(st->cso_context);
cso_save_vertex_buffers(st->cso_context);
cso_save_vertex_elements(st->cso_context);
cso_save_vertex_buffers(st->cso_context);
@@
-321,15
+327,16
@@
clear_with_quad(struct gl_context *ctx,
cso_set_clip(st->cso_context, &st->clear.clip);
set_fragment_shader(st);
set_vertex_shader(st);
cso_set_clip(st->cso_context, &st->clear.clip);
set_fragment_shader(st);
set_vertex_shader(st);
+ cso_set_geometry_shader_handle(st->cso_context, NULL);
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
- st_translate_color(ctx->Color.ClearColor
Unclamped
,
- ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
-
clearColor
);
+ st_translate_color(ctx->Color.ClearColor
.f
,
+
ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
+
clearColor.f
);
}
/* draw quad matching scissor rect */
}
/* draw quad matching scissor rect */
- draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, clearColor);
+ draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear,
&
clearColor);
/* Restore pipe state */
cso_restore_blend(st->cso_context);
/* Restore pipe state */
cso_restore_blend(st->cso_context);
@@
-340,6
+347,7
@@
clear_with_quad(struct gl_context *ctx,
cso_restore_clip(st->cso_context);
cso_restore_fragment_shader(st->cso_context);
cso_restore_vertex_shader(st->cso_context);
cso_restore_clip(st->cso_context);
cso_restore_fragment_shader(st->cso_context);
cso_restore_vertex_shader(st->cso_context);
+ cso_restore_geometry_shader(st->cso_context);
cso_restore_vertex_elements(st->cso_context);
cso_restore_vertex_buffers(st->cso_context);
}
cso_restore_vertex_elements(st->cso_context);
cso_restore_vertex_buffers(st->cso_context);
}
@@
-381,7
+389,8
@@
check_clear_depth_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuff
assert(rb->Format == MESA_FORMAT_S8 ||
rb->Format == MESA_FORMAT_Z24_S8 ||
assert(rb->Format == MESA_FORMAT_S8 ||
rb->Format == MESA_FORMAT_Z24_S8 ||
- rb->Format == MESA_FORMAT_S8_Z24);
+ rb->Format == MESA_FORMAT_S8_Z24 ||
+ rb->Format == MESA_FORMAT_Z32_FLOAT_X24S8);
if (ctx->Scissor.Enabled &&
(ctx->Scissor.X != 0 ||
if (ctx->Scissor.Enabled &&
(ctx->Scissor.X != 0 ||
@@
-436,7
+445,8
@@
check_clear_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb
assert(rb->Format == MESA_FORMAT_S8 ||
rb->Format == MESA_FORMAT_Z24_S8 ||
assert(rb->Format == MESA_FORMAT_S8 ||
rb->Format == MESA_FORMAT_Z24_S8 ||
- rb->Format == MESA_FORMAT_S8_Z24);
+ rb->Format == MESA_FORMAT_S8_Z24 ||
+ rb->Format == MESA_FORMAT_Z32_FLOAT_X24S8);
if (maskStencil)
return GL_TRUE;
if (maskStencil)
return GL_TRUE;
@@
-570,7
+580,7
@@
st_Clear(struct gl_context *ctx, GLbitfield mask)
* required from the visual. Hence fix this up to avoid potential
* read-modify-write in the driver.
*/
* required from the visual. Hence fix this up to avoid potential
* read-modify-write in the driver.
*/
-
float clearColor[4]
;
+
union pipe_color_union clearColor
;
if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) &&
((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) &&
((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
@@
-580,12
+590,12
@@
st_Clear(struct gl_context *ctx, GLbitfield mask)
clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
- st_translate_color(ctx->Color.ClearColor,
-
ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
-
clearColor
);
+ st_translate_color(ctx->Color.ClearColor
.f
,
+ ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
+
clearColor.f
);
}
}
- st->pipe->clear(st->pipe, clear_buffers,
ctx->Color.ClearColorUnclamped
,
+ st->pipe->clear(st->pipe, clear_buffers,
&clearColor
,
ctx->Depth.Clear, ctx->Stencil.Clear);
}
if (mask & BUFFER_BIT_ACCUM)
ctx->Depth.Clear, ctx->Stencil.Clear);
}
if (mask & BUFFER_BIT_ACCUM)