static void GLAPIENTRY _save_OBE_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); struct vbo_save_context *save = &vbo_context(ctx)->save; if (!_mesa_is_valid_prim_mode(ctx, mode)) { _mesa_compile_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(mode)"); return; } if (count < 0) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(count<0)"); return; } if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT) { _mesa_compile_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(type)"); return; } if (end < start) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(end < start)"); return; } if (save->out_of_memory) return; _save_OBE_DrawElements(mode, count, type, indices); }
static void GLAPIENTRY _save_OBE_DrawArrays(GLenum mode, GLint start, GLsizei count) { GET_CURRENT_CONTEXT(ctx); struct vbo_save_context *save = &vbo_context(ctx)->save; GLint i; if (!_mesa_is_valid_prim_mode(ctx, mode)) { _mesa_compile_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)"); return; } if (count < 0) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glDrawArrays(count<0)"); return; } if (save->out_of_memory) return; _ae_map_vbos(ctx); vbo_save_NotifyBegin(ctx, (mode | VBO_SAVE_PRIM_WEAK | VBO_SAVE_PRIM_NO_CURRENT_UPDATE)); for (i = 0; i < count; i++) CALL_ArrayElement(GET_DISPATCH(), (start + i)); CALL_End(GET_DISPATCH(), ()); _ae_unmap_vbos(ctx); }
/* Could do better by copying the arrays and element list intact and * then emitting an indexed prim at runtime. */ static void GLAPIENTRY _save_OBE_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); struct vbo_save_context *save = &vbo_context(ctx)->save; struct gl_buffer_object *indexbuf = ctx->Array.VAO->IndexBufferObj; GLint i; if (!_mesa_is_valid_prim_mode(ctx, mode)) { _mesa_compile_error(ctx, GL_INVALID_ENUM, "glDrawElements(mode)"); return; } if (count < 0) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glDrawElements(count<0)"); return; } if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glDrawElements(count<0)"); return; } if (save->out_of_memory) return; _ae_map_vbos(ctx); if (_mesa_is_bufferobj(indexbuf)) indices = ADD_POINTERS(indexbuf->Mappings[MAP_INTERNAL].Pointer, indices); vbo_save_NotifyBegin(ctx, (mode | VBO_SAVE_PRIM_WEAK | VBO_SAVE_PRIM_NO_CURRENT_UPDATE)); switch (type) { case GL_UNSIGNED_BYTE: for (i = 0; i < count; i++) CALL_ArrayElement(GET_DISPATCH(), (((GLubyte *) indices)[i])); break; case GL_UNSIGNED_SHORT: for (i = 0; i < count; i++) CALL_ArrayElement(GET_DISPATCH(), (((GLushort *) indices)[i])); break; case GL_UNSIGNED_INT: for (i = 0; i < count; i++) CALL_ArrayElement(GET_DISPATCH(), (((GLuint *) indices)[i])); break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)"); break; } CALL_End(GET_DISPATCH(), ()); _ae_unmap_vbos(ctx); }
static void GLAPIENTRY _save_EvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) i1; (void) i2; (void) j1; (void) j2; _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glEvalMesh2" ); }
/* These are all errors as this vtxfmt is only installed inside * begin/end pairs. */ static void GLAPIENTRY _save_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) count; (void) type; (void) indices; _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawElements" ); }
/* NOTE: Have to remove/deal-with colormaterial crossovers, probably * later on - in the meantime just store everything. */ static void GLAPIENTRY _save_Materialfv( GLenum face, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT( ctx ); TNLcontext *tnl = TNL_CONTEXT(ctx); switch (pname) { case GL_EMISSION: MAT( _TNL_ATTRIB_MAT_FRONT_EMISSION, 4, face, params ); break; case GL_AMBIENT: MAT( _TNL_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params ); break; case GL_DIFFUSE: MAT( _TNL_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params ); break; case GL_SPECULAR: MAT( _TNL_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params ); break; case GL_SHININESS: MAT( _TNL_ATTRIB_MAT_FRONT_SHININESS, 1, face, params ); break; case GL_COLOR_INDEXES: MAT( _TNL_ATTRIB_MAT_FRONT_INDEXES, 3, face, params ); break; case GL_AMBIENT_AND_DIFFUSE: MAT( _TNL_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params ); MAT( _TNL_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params ); break; default: _mesa_compile_error( ctx, GL_INVALID_ENUM, "glMaterialfv" ); return; } }
static void GLAPIENTRY _save_Begin(GLenum mode) { GET_CURRENT_CONTEXT(ctx); (void) mode; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "Recursive glBegin"); }
static void GLAPIENTRY _save_DrawTransformFeedback(GLenum mode, GLuint name) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) name; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawTransformFeedback"); }
/** * Save a glMaterial call found between glBegin/End. * glMaterial calls outside Begin/End are handled in dlist.c. */ static void GLAPIENTRY _save_Materialfv(GLenum face, GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); if (face != GL_FRONT && face != GL_BACK && face != GL_FRONT_AND_BACK) { _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)"); return; } __debugbreak(); switch (pname) { case GL_EMISSION: MAT(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, face, params); break; case GL_AMBIENT: MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params); break; case GL_DIFFUSE: MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params); break; case GL_SPECULAR: MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params); break; case GL_SHININESS: if (*params < 0 || *params > ctx->Const.MaxShininess) { _mesa_compile_error(ctx, GL_INVALID_VALUE, "glMaterial(shininess)"); } else { MAT(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, face, params); } break; case GL_COLOR_INDEXES: MAT(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, face, params); break; case GL_AMBIENT_AND_DIFFUSE: MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params); MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params); break; default: _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)"); return; } }
static void GLAPIENTRY _save_DrawArrays(GLenum mode, GLint start, GLsizei count) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) start; (void) count; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawArrays"); }
static void GLAPIENTRY _save_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { GET_CURRENT_CONTEXT(ctx); (void) x1; (void) y1; (void) x2; (void) y2; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glRectf"); }
static void GLAPIENTRY _save_DrawTransformFeedbackInstanced(GLenum mode, GLuint name, GLsizei primcount) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) name; (void) primcount; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawTransformFeedbackInstanced"); }
static void GLAPIENTRY _save_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) start; (void) end; (void) count; (void) type; (void) indices; (void)basevertex; _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawRangeElements" ); }
static void GLAPIENTRY _save_MultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount, const GLint *basevertex) { GET_CURRENT_CONTEXT(ctx); (void) mode; (void) count; (void) type; (void) indices; (void) primcount; (void) basevertex; _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glMultiDrawElementsBaseVertex"); }
void _tnl_save_Begin( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); struct immediate *IM = TNL_CURRENT_IM(ctx); GLuint inflags, state; /* fprintf(stderr, "%s: before: %x\n", __FUNCTION__, IM->BeginState); */ if (mode > GL_POLYGON) { _mesa_compile_error( ctx, GL_INVALID_ENUM, "_tnl_Begin" ); return; } if (ctx->NewState) _mesa_update_state(ctx); if (IM->Count > IMM_MAXDATA-8) { _tnl_flush_immediate( IM ); IM = TNL_CURRENT_IM(ctx); } /* Check for and flush buffered vertices from internal operations. */ if (IM->SavedBeginState) { _tnl_flush_immediate( IM ); IM = TNL_CURRENT_IM(ctx); IM->BeginState = IM->SavedBeginState; IM->SavedBeginState = 0; } state = IM->BeginState; inflags = state & (VERT_BEGIN_0|VERT_BEGIN_1); state |= inflags << 2; /* set error conditions */ if (inflags != (VERT_BEGIN_0|VERT_BEGIN_1)) { GLuint count = IM->Count; GLuint last = IM->LastPrimitive; state |= (VERT_BEGIN_0|VERT_BEGIN_1); IM->Flag[count] |= VERT_BEGIN; IM->Primitive[count] = mode | PRIM_BEGIN; IM->PrimitiveLength[IM->LastPrimitive] = count - IM->LastPrimitive; IM->LastPrimitive = count; /* Not quite right. Need to use the fallback '_aa_ArrayElement' * when not known to be inside begin/end and arrays are * unlocked. */ if (IM->FlushElt == FLUSH_ELT_EAGER) { _tnl_translate_array_elts( ctx, IM, last, count ); } } ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; IM->BeginState = state; /* Update save_primitive now. Don't touch ExecPrimitive as this is * updated in the replay of this cassette if we are in * COMPILE_AND_EXECUTE mode. */ if (ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN) ctx->Driver.CurrentSavePrimitive = PRIM_INSIDE_UNKNOWN_PRIM; else if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END) ctx->Driver.CurrentSavePrimitive = mode; }
static void enum_error( void ) { GET_CURRENT_CONTEXT( ctx ); _mesa_compile_error( ctx, GL_INVALID_ENUM, "glVertexAttrib" ); }