/** * 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; } }
/** * Initialize pipeline object state for given context. */ void _mesa_init_pipeline(struct gl_context *ctx) { ctx->Pipeline.Objects = _mesa_NewHashTable(); ctx->Pipeline.Current = NULL; /* Install a default Pipeline */ ctx->Pipeline.Default = _mesa_new_pipeline_object(ctx, 0); _mesa_reference_pipeline_object(ctx, &ctx->_Shader, ctx->Pipeline.Default); }
/** * 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; } }