diff options
author | Brian Paul <[email protected]> | 2017-07-06 17:54:49 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-07-07 12:22:46 -0600 |
commit | 9ac55e8219e1f6abeab3c779c8fe710c2bc25f2b (patch) | |
tree | d703c4a13687819611f5f735c5d6fa0bf296129d | |
parent | f5c8bb1e00f358e05ed21f8ed69c9fc3803bf95f (diff) |
mesa: finish implementing glPrimitiveRestartNV() for display lists
If we try to build a display list with just a glPrimitiveRestartNV()
call, we'd crash because of a null GLvertexformat::PrimitiveRestartNV
pointer. This change fixes that case.
The previous patch fixed the case of calling glPrimitiveRestartNV()
inside a glBegin/End pair.
v2: minor clean-up in save_PrimitiveRestartNV(), per Charmaine.
Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r-- | src/mesa/main/dlist.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 9e817beb943..208471aca73 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -325,7 +325,8 @@ typedef enum OPCODE_STENCIL_FUNC_SEPARATE, OPCODE_STENCIL_OP_SEPARATE, OPCODE_STENCIL_MASK_SEPARATE, - + /* GL_NV_primitive_restart */ + OPCODE_PRIMITIVE_RESTART_NV, /* GL_ARB_shader_objects */ OPCODE_USE_PROGRAM, OPCODE_UNIFORM_1F, @@ -6095,6 +6096,19 @@ save_VertexAttrib4fvARB(GLuint index, const GLfloat * v) } static void GLAPIENTRY +save_PrimitiveRestartNV(void) +{ + /* Note: this is used when outside a glBegin/End pair in a display list */ + GET_CURRENT_CONTEXT(ctx); + ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); + (void) alloc_instruction(ctx, OPCODE_PRIMITIVE_RESTART_NV, 0); + if (ctx->ExecuteFlag) { + CALL_PrimitiveRestartNV(ctx->Exec, ()); + } +} + + +static void GLAPIENTRY save_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) @@ -8670,6 +8684,10 @@ execute_list(struct gl_context *ctx, GLuint list) n[5].i, n[6].i, n[7].i, n[8].i, n[9].i, n[10].e)); break; + case OPCODE_PRIMITIVE_RESTART_NV: + CALL_PrimitiveRestartNV(ctx->Exec, ()); + break; + case OPCODE_USE_PROGRAM: CALL_UseProgram(ctx->Exec, (n[1].ui)); break; @@ -10460,6 +10478,8 @@ save_vtxfmt_init(GLvertexformat * vfmt) vfmt->VertexAttrib3fvARB = save_VertexAttrib3fvARB; vfmt->VertexAttrib4fARB = save_VertexAttrib4fARB; vfmt->VertexAttrib4fvARB = save_VertexAttrib4fvARB; + + vfmt->PrimitiveRestartNV = save_PrimitiveRestartNV; } |