summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-10-26 18:01:50 -0600
committerBrian Paul <[email protected]>2010-10-26 18:05:37 -0600
commitccef2110edbcc418abebabecc42ee3d9c0e5ab7a (patch)
tree23be893a9a1cefcf1e843e72744e5cb2dd28d7cd
parent705978e2831eb8b8bb23bd11ee08ce51d9b2915c (diff)
mesa: call _mesa_valid_to_render() in glDrawPixels, glCopyPixels, glBitmap
This lets us simplify and consolidate some state checking code. This implements the GL_INVALID_OPERATION check for all drawing commands required by GL_EXT_texture_integer.
-rw-r--r--src/mesa/main/drawpix.c76
1 files changed, 15 insertions, 61 deletions
diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c
index 890d0ab5a72..46adc67c1c5 100644
--- a/src/mesa/main/drawpix.c
+++ b/src/mesa/main/drawpix.c
@@ -40,17 +40,6 @@
#if FEATURE_drawpix
-/**
- * If a fragment program is enabled, check that it's valid.
- * \return GL_TRUE if valid, GL_FALSE otherwise
- */
-static GLboolean
-valid_fragment_program(struct gl_context *ctx)
-{
- return !(ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled);
-}
-
-
/*
* Execute glDrawPixels
*/
@@ -67,41 +56,21 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
}
/* We're not using the current vertex program, and the driver may install
- * it's own.
+ * its own. Note: this may dirty some state.
*/
_mesa_set_vp_override(ctx, GL_TRUE);
- if (ctx->NewState) {
- _mesa_update_state(ctx);
- }
-
- if (!valid_fragment_program(ctx)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glDrawPixels (invalid fragment program)");
- goto end;
+ /* Note: this call does state validation */
+ if (!_mesa_valid_to_render(ctx, "glDrawPixels")) {
+ goto end; /* the error code was recorded */
}
if (_mesa_error_check_format_type(ctx, format, type, GL_TRUE)) {
- /* the error was already recorded */
- goto end;
- }
-
- if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
- "glDrawPixels(incomplete framebuffer)" );
- goto end;
+ goto end; /* the error code was recorded */
}
if (!ctx->Current.RasterPosValid) {
- goto end; /* no-op, not an error */
- }
-
- if (_mesa_is_integer_format(format) &&
- !_mesa_is_fragment_shader_active(ctx)) {
- /* A fragment shader is required when drawing integer formats */
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glDrawPixels(integer format but no fragment shader)");
- goto end;
+ goto end; /* no-op, not an error */
}
if (ctx->RenderMode == GL_RENDER) {
@@ -175,22 +144,17 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
}
/* We're not using the current vertex program, and the driver may install
- * it's own.
+ * it's own. Note: this may dirty some state.
*/
_mesa_set_vp_override(ctx, GL_TRUE);
- if (ctx->NewState) {
- _mesa_update_state(ctx);
- }
-
- if (!valid_fragment_program(ctx)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glCopyPixels (invalid fragment program)");
- goto end;
+ /* Note: this call does state validation */
+ if (!_mesa_valid_to_render(ctx, "glCopyPixels")) {
+ goto end; /* the error code was recorded */
}
- if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
- ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ /* Check read buffer's status (draw buffer was already checked) */
+ if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
_mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
"glCopyPixels(incomplete framebuffer)" );
goto end;
@@ -251,19 +215,9 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
return; /* do nothing */
}
- if (ctx->NewState) {
- _mesa_update_state(ctx);
- }
-
- if (!valid_fragment_program(ctx)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBitmap (invalid fragment program)");
- return;
- }
-
- if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
- "glBitmap(incomplete framebuffer)");
+ /* Note: this call does state validation */
+ if (!_mesa_valid_to_render(ctx, "glBitmap")) {
+ /* the error code was recorded */
return;
}