}
if (*ptr) {
/* Unreference the old shader */
- GLboolean deleteFlag = GL_FALSE;
struct gl_shader *old = *ptr;
assert(old->RefCount > 0);
- old->RefCount--;
- deleteFlag = (old->RefCount == 0);
- if (deleteFlag) {
+ if (p_atomic_dec_zero(&old->RefCount)) {
if (old->Name != 0)
_mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name);
_mesa_delete_shader(ctx, old);
if (sh) {
/* reference new */
- sh->RefCount++;
+ p_atomic_inc(&sh->RefCount);
*ptr = sh;
}
}
}
-/**
- * Allocate a new gl_linked_shader object.
- * Called via ctx->Driver.NewShader()
- */
-struct gl_linked_shader *
-_mesa_new_linked_shader(gl_shader_stage stage)
-{
- struct gl_linked_shader *shader;
- shader = rzalloc(NULL, struct gl_linked_shader);
- if (shader) {
- shader->Stage = stage;
- }
- return shader;
-}
-
-
/**
* Delete a shader object.
*/
_mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh)
{
free((void *)sh->Source);
+ free((void *)sh->FallbackSource);
free(sh->Label);
ralloc_free(sh);
}
}
if (*ptr) {
/* Unreference the old shader program */
- GLboolean deleteFlag = GL_FALSE;
struct gl_shader_program *old = *ptr;
assert(old->RefCount > 0);
- old->RefCount--;
- deleteFlag = (old->RefCount == 0);
- if (deleteFlag) {
+ if (p_atomic_dec_zero(&old->RefCount)) {
if (old->Name != 0)
_mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name);
_mesa_delete_shader_program(ctx, old);
assert(!*ptr);
if (shProg) {
- shProg->RefCount++;
+ p_atomic_inc(&shProg->RefCount);
*ptr = shProg;
}
}
prog->Geom.UsesEndPrimitive = false;
prog->Geom.UsesStreams = false;
- prog->Comp.LocalSizeVariable = false;
-
prog->TransformFeedback.BufferMode = GL_INTERLEAVED_ATTRIBS;
exec_list_make_empty(&prog->EmptyUniformLocations);
shProg->data->linked_stages = 0;
- if (shProg->data->UniformStorage) {
+ if (shProg->data->UniformStorage && !shProg->data->cache_fallback) {
for (unsigned i = 0; i < shProg->data->NumUniformStorage; ++i)
_mesa_uniform_detach_all_driver_storage(&shProg->data->
UniformStorage[i]);
shProg->data->UniformStorage = NULL;
}
- if (shProg->UniformRemapTable) {
+ if (shProg->UniformRemapTable && !shProg->data->cache_fallback) {
ralloc_free(shProg->UniformRemapTable);
shProg->NumUniformRemapTable = 0;
shProg->UniformRemapTable = NULL;
shProg->data->AtomicBuffers = NULL;
shProg->data->NumAtomicBuffers = 0;
- if (shProg->ProgramResourceList) {
- ralloc_free(shProg->ProgramResourceList);
- shProg->ProgramResourceList = NULL;
- shProg->NumProgramResourceList = 0;
+ if (shProg->data->ProgramResourceList) {
+ ralloc_free(shProg->data->ProgramResourceList);
+ shProg->data->ProgramResourceList = NULL;
+ shProg->data->NumProgramResourceList = 0;
}
}
struct gl_shader_program *shProg)
{
_mesa_free_shader_program_data(ctx, shProg);
- _mesa_reference_shader_program_data(ctx, &shProg->data, NULL);
+ if (!shProg->data->cache_fallback)
+ _mesa_reference_shader_program_data(ctx, &shProg->data, NULL);
ralloc_free(shProg);
}
void
_mesa_init_shader_object_functions(struct dd_function_table *driver)
{
- driver->NewShader = _mesa_new_linked_shader;
driver->LinkShader = _mesa_ir_link_shader;
}