/** * Generate a set of unique pipeline object IDs and store them in \c pipelines. * \param n Number of IDs to generate. * \param pipelines pipeline of \c n locations to store the IDs. */ void GLAPIENTRY _mesa_GenProgramPipelines(GLsizei n, GLuint *pipelines) { GET_CURRENT_CONTEXT(ctx); GLuint first; GLint i; if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGenProgramPipelines(n<0)"); return; } if (!pipelines) { return; } first = _mesa_HashFindFreeKeyBlock(ctx->Pipeline.Objects, n); for (i = 0; i < n; i++) { struct gl_pipeline_object *obj; GLuint name = first + i; obj = _mesa_new_pipeline_object(ctx, name); if (!obj) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenProgramPipelines"); return; } save_pipeline_object(ctx, obj); pipelines[i] = first + i; } }
/** * Generate a set of unique pipeline object IDs and store them in \c pipelines. * \param n Number of IDs to generate. * \param pipelines pipeline of \c n locations to store the IDs. */ static void create_program_pipelines(struct gl_context *ctx, GLsizei n, GLuint *pipelines, bool dsa) { const char *func; GLuint first; GLint i; func = dsa ? "glCreateProgramPipelines" : "glGenProgramPipelines"; if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "%s (n < 0)", func); return; } if (!pipelines) { return; } first = _mesa_HashFindFreeKeyBlock(ctx->Pipeline.Objects, n); for (i = 0; i < n; i++) { struct gl_pipeline_object *obj; GLuint name = first + i; obj = _mesa_new_pipeline_object(ctx, name); if (!obj) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func); return; } if (dsa) { /* make dsa-allocated objects behave like program objects */ obj->EverBound = GL_TRUE; } save_pipeline_object(ctx, obj); pipelines[i] = first + i; } }