summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/common/meta.c5
-rw-r--r--src/mesa/drivers/dri/i965/brw_cs.c8
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp5
-rw-r--r--src/mesa/drivers/dri/i965/brw_tcs.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_tes.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm.c4
-rw-r--r--src/mesa/drivers/dri/i965/gen7_l3_state.c4
-rw-r--r--src/mesa/main/ff_fragment_shader.cpp6
-rw-r--r--src/mesa/main/mtypes.h18
-rw-r--r--src/mesa/main/pipelineobj.c4
-rw-r--r--src/mesa/main/program_resource.c2
-rw-r--r--src/mesa/main/shader_query.cpp20
-rw-r--r--src/mesa/main/shaderapi.c70
-rw-r--r--src/mesa/main/shaderobj.c46
-rw-r--r--src/mesa/main/state.c12
-rw-r--r--src/mesa/main/texstate.c2
-rw-r--r--src/mesa/main/uniform_query.cpp8
-rw-r--r--src/mesa/main/uniforms.c20
-rw-r--r--src/mesa/program/ir_to_mesa.cpp34
-rw-r--r--src/mesa/state_tracker/st_atom_atomicbuf.c4
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp12
23 files changed, 147 insertions, 151 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 99c85cff17b..0d5661ba062 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -153,8 +153,9 @@ _mesa_meta_link_program_with_debug(struct gl_context *ctx,
{
_mesa_link_program(ctx, sh_prog);
- if (!sh_prog->LinkStatus) {
- _mesa_problem(ctx, "meta program link failed:\n%s", sh_prog->InfoLog);
+ if (!sh_prog->data->LinkStatus) {
+ _mesa_problem(ctx, "meta program link failed:\n%s",
+ sh_prog->data->InfoLog);
}
}
diff --git a/src/mesa/drivers/dri/i965/brw_cs.c b/src/mesa/drivers/dri/i965/brw_cs.c
index 72b2dbee51c..4516f1f33a2 100644
--- a/src/mesa/drivers/dri/i965/brw_cs.c
+++ b/src/mesa/drivers/dri/i965/brw_cs.c
@@ -73,10 +73,10 @@ brw_codegen_cs_prog(struct brw_context *brw,
memset(&prog_data, 0, sizeof(prog_data));
if (prog->Comp.SharedSize > 64 * 1024) {
- prog->LinkStatus = false;
+ prog->data->LinkStatus = false;
const char *error_str =
"Compute shader used more than 64KB of shared variables";
- ralloc_strcat(&prog->InfoLog, error_str);
+ ralloc_strcat(&prog->data->InfoLog, error_str);
_mesa_problem(NULL, "Failed to link compute shader: %s\n", error_str);
ralloc_free(mem_ctx);
@@ -126,8 +126,8 @@ brw_codegen_cs_prog(struct brw_context *brw,
&prog_data, cp->program.nir, st_index,
&program_size, &error_str);
if (program == NULL) {
- prog->LinkStatus = false;
- ralloc_strcat(&prog->InfoLog, error_str);
+ prog->data->LinkStatus = false;
+ ralloc_strcat(&prog->data->InfoLog, error_str);
_mesa_problem(NULL, "Failed to compile compute shader: %s\n", error_str);
ralloc_free(mem_ctx);
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index 6bdedb96574..b83fdb4bae8 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -161,7 +161,7 @@ brw_codegen_gs_prog(struct brw_context *brw,
&prog_data, gs->Program->nir, prog,
st_index, &program_size, &error_str);
if (program == NULL) {
- ralloc_strcat(&prog->InfoLog, error_str);
+ ralloc_strcat(&prog->data->InfoLog, error_str);
_mesa_problem(NULL, "Failed to compile geometry shader: %s\n", error_str);
ralloc_free(mem_ctx);
diff --git a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
index b752ad5610b..15a608c857a 100644
--- a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
+++ b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
@@ -81,8 +81,9 @@ brw_nir_setup_glsl_uniform(gl_shader_stage stage, nir_variable *var,
* with our name, or the prefix of a component that starts with our name.
*/
unsigned uniform_index = var->data.driver_location / 4;
- for (unsigned u = 0; u < shader_prog->NumUniformStorage; u++) {
- struct gl_uniform_storage *storage = &shader_prog->UniformStorage[u];
+ for (unsigned u = 0; u < shader_prog->data->NumUniformStorage; u++) {
+ struct gl_uniform_storage *storage =
+ &shader_prog->data->UniformStorage[u];
if (storage->builtin)
continue;
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c
index 87a956faf50..95926dbe1a6 100644
--- a/src/mesa/drivers/dri/i965/brw_tcs.c
+++ b/src/mesa/drivers/dri/i965/brw_tcs.c
@@ -265,8 +265,8 @@ brw_codegen_tcs_prog(struct brw_context *brw,
&program_size, &error_str);
if (program == NULL) {
if (shader_prog) {
- shader_prog->LinkStatus = false;
- ralloc_strcat(&shader_prog->InfoLog, error_str);
+ shader_prog->data->LinkStatus = false;
+ ralloc_strcat(&shader_prog->data->InfoLog, error_str);
}
_mesa_problem(NULL, "Failed to compile tessellation control shader: "
diff --git a/src/mesa/drivers/dri/i965/brw_tes.c b/src/mesa/drivers/dri/i965/brw_tes.c
index b2d41c15557..414e90f09d2 100644
--- a/src/mesa/drivers/dri/i965/brw_tes.c
+++ b/src/mesa/drivers/dri/i965/brw_tes.c
@@ -187,8 +187,8 @@ brw_codegen_tes_prog(struct brw_context *brw,
shader_prog, st_index, &program_size, &error_str);
if (program == NULL) {
if (shader_prog) {
- shader_prog->LinkStatus = false;
- ralloc_strcat(&shader_prog->InfoLog, error_str);
+ shader_prog->data->LinkStatus = false;
+ ralloc_strcat(&shader_prog->data->InfoLog, error_str);
}
_mesa_problem(NULL, "Failed to compile tessellation evaluation shader: "
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 86cd1bf8bca..a6ffa835066 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -198,8 +198,8 @@ brw_codegen_vs_prog(struct brw_context *brw,
st_index, &program_size, &error_str);
if (program == NULL) {
if (prog) {
- prog->LinkStatus = false;
- ralloc_strcat(&prog->InfoLog, error_str);
+ prog->data->LinkStatus = false;
+ ralloc_strcat(&prog->data->InfoLog, error_str);
}
_mesa_problem(NULL, "Failed to compile vertex shader: %s\n", error_str);
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index dab2e330583..a3a0fd24788 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -151,8 +151,8 @@ brw_codegen_wm_prog(struct brw_context *brw,
if (program == NULL) {
if (prog) {
- prog->LinkStatus = false;
- ralloc_strcat(&prog->InfoLog, error_str);
+ prog->data->LinkStatus = false;
+ ralloc_strcat(&prog->data->InfoLog, error_str);
}
_mesa_problem(NULL, "Failed to compile fragment shader: %s\n", error_str);
diff --git a/src/mesa/drivers/dri/i965/gen7_l3_state.c b/src/mesa/drivers/dri/i965/gen7_l3_state.c
index 0692b081b83..e746b995c1e 100644
--- a/src/mesa/drivers/dri/i965/gen7_l3_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_l3_state.c
@@ -53,8 +53,8 @@ get_pipeline_state_l3_weights(const struct brw_context *brw)
brw->ctx._Shader->CurrentProgram[stage_states[i]->stage];
const struct brw_stage_prog_data *prog_data = stage_states[i]->prog_data;
- needs_dc |= (prog && (prog->NumAtomicBuffers ||
- prog->NumShaderStorageBlocks)) ||
+ needs_dc |= (prog && (prog->data->NumAtomicBuffers ||
+ prog->data->NumShaderStorageBlocks)) ||
(prog_data && (prog_data->total_scratch || prog_data->nr_image_params));
needs_slm |= prog_data && prog_data->total_shared;
}
diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp
index 9aa1dc15cdc..e00eac55beb 100644
--- a/src/mesa/main/ff_fragment_shader.cpp
+++ b/src/mesa/main/ff_fragment_shader.cpp
@@ -301,7 +301,7 @@ static GLbitfield get_fp_input_mask( struct gl_context *ctx )
/* _NEW_PROGRAM */
const GLboolean vertexShader =
(ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX] &&
- ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]->LinkStatus &&
+ ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]->data->LinkStatus &&
ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]->_LinkedShaders[MESA_SHADER_VERTEX]);
const GLboolean vertexProgram = ctx->VertexProgram._Enabled;
GLbitfield fp_inputs = 0x0;
@@ -1266,9 +1266,9 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
_mesa_glsl_link_shader(ctx, p.shader_program);
- if (!p.shader_program->LinkStatus)
+ if (!p.shader_program->data->LinkStatus)
_mesa_problem(ctx, "Failed to link fixed function fragment shader: %s\n",
- p.shader_program->InfoLog);
+ p.shader_program->data->InfoLog);
ralloc_free(p.mem_ctx);
return p.shader_program;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index aa4d1d5e8f0..e87005326b6 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2781,10 +2781,8 @@ struct gl_shader_program
bool LocalSizeVariable;
} Comp;
- /* post-link info: */
- unsigned NumUniformStorage;
- unsigned NumHiddenUniforms;
- struct gl_uniform_storage *UniformStorage;
+ /** Data shared by gl_program and gl_shader_program */
+ struct gl_shader_program_data *data;
/**
* Mapping from GL uniform locations returned by \c glUniformLocation to
@@ -2808,12 +2806,6 @@ struct gl_shader_program
unsigned LastClipDistanceArraySize;
unsigned LastCullDistanceArraySize;
- unsigned NumUniformBlocks;
- struct gl_uniform_block *UniformBlocks;
-
- unsigned NumShaderStorageBlocks;
- struct gl_uniform_block *ShaderStorageBlocks;
-
/**
* Map of active uniform names to locations
*
@@ -2824,14 +2816,8 @@ struct gl_shader_program
*/
struct string_to_uint_map *UniformHash;
- struct gl_active_atomic_buffer *AtomicBuffers;
- unsigned NumAtomicBuffers;
-
- GLboolean LinkStatus; /**< GL_LINK_STATUS */
- GLboolean Validated;
GLboolean _Used; /**< Ever used for drawing? */
GLboolean SamplersValidated; /**< Samplers validated against texture units? */
- GLchar *InfoLog;
unsigned Version; /**< GLSL version used for linking */
bool IsES; /**< True if this program uses GLSL ES */
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c
index 310b745ebc8..35d416dc9df 100644
--- a/src/mesa/main/pipelineobj.c
+++ b/src/mesa/main/pipelineobj.c
@@ -297,7 +297,7 @@ _mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
* shader stages in the pipeline program pipeline object are not
* modified."
*/
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glUseProgramStages(program not linked)");
return;
@@ -376,7 +376,7 @@ _mesa_ActiveShaderProgram(GLuint pipeline, GLuint program)
*/
pipe->EverBound = GL_TRUE;
- if ((shProg != NULL) && !shProg->LinkStatus) {
+ if ((shProg != NULL) && !shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glActiveShaderProgram(program %u not linked)", shProg->Name);
return;
diff --git a/src/mesa/main/program_resource.c b/src/mesa/main/program_resource.c
index 19aaf48f984..859bda2c4dd 100644
--- a/src/mesa/main/program_resource.c
+++ b/src/mesa/main/program_resource.c
@@ -78,7 +78,7 @@ lookup_linked_program(GLuint program,
if (!prog)
return NULL;
- if (prog->LinkStatus == GL_FALSE) {
+ if (prog->data->LinkStatus == GL_FALSE) {
if (raise_link_error)
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)",
caller);
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 5c42006b5dc..e4a8773e09c 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -118,7 +118,7 @@ _mesa_GetActiveAttrib(GLuint program, GLuint desired_index,
if (!shProg)
return;
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glGetActiveAttrib(program not linked)");
return;
@@ -165,7 +165,7 @@ _mesa_GetAttribLocation(GLuint program, const GLchar * name)
return -1;
}
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetAttribLocation(program not linked)");
return -1;
@@ -193,7 +193,7 @@ _mesa_GetAttribLocation(GLuint program, const GLchar * name)
unsigned
_mesa_count_active_attribs(struct gl_shader_program *shProg)
{
- if (!shProg->LinkStatus
+ if (!shProg->data->LinkStatus
|| shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
return 0;
}
@@ -212,7 +212,7 @@ _mesa_count_active_attribs(struct gl_shader_program *shProg)
size_t
_mesa_longest_attribute_name_length(struct gl_shader_program *shProg)
{
- if (!shProg->LinkStatus
+ if (!shProg->data->LinkStatus
|| shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
return 0;
}
@@ -297,7 +297,7 @@ _mesa_GetFragDataIndex(GLuint program, const GLchar *name)
return -1;
}
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetFragDataIndex(program not linked)");
return -1;
@@ -332,7 +332,7 @@ _mesa_GetFragDataLocation(GLuint program, const GLchar *name)
return -1;
}
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetFragDataLocation(program not linked)");
return -1;
@@ -591,7 +591,7 @@ _mesa_program_resource_index(struct gl_shader_program *shProg,
switch (res->Type) {
case GL_ATOMIC_COUNTER_BUFFER:
- return RESOURCE_ATC(res) - shProg->AtomicBuffers;
+ return RESOURCE_ATC(res) - shProg->data->AtomicBuffers;
case GL_VERTEX_SUBROUTINE:
case GL_GEOMETRY_SUBROUTINE:
case GL_FRAGMENT_SUBROUTINE:
@@ -931,10 +931,10 @@ is_resource_referenced(struct gl_shader_program *shProg,
return RESOURCE_ATC(res)->StageReferences[stage];
if (res->Type == GL_UNIFORM_BLOCK)
- return shProg->UniformBlocks[index].stageref & (1 << stage);
+ return shProg->data->UniformBlocks[index].stageref & (1 << stage);
if (res->Type == GL_SHADER_STORAGE_BLOCK)
- return shProg->ShaderStorageBlocks[index].stageref & (1 << stage);
+ return shProg->data->ShaderStorageBlocks[index].stageref & (1 << stage);
return res->StageReferences & (1 << stage);
}
@@ -1043,7 +1043,7 @@ get_buffer_property(struct gl_shader_program *shProg,
unsigned idx = RESOURCE_ATC(res)->Uniforms[i];
struct gl_program_resource *uni =
program_resource_find_data(shProg,
- &shProg->UniformStorage[idx]);
+ &shProg->data->UniformStorage[idx]);
assert(uni);
*val++ = _mesa_program_resource_index(shProg, uni);
}
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index aebd81214e7..ab153009e27 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -532,7 +532,7 @@ get_handle(struct gl_context *ctx, GLenum pname)
static bool
check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
{
- if (shProg->LinkStatus &&
+ if (shProg->data->LinkStatus &&
shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) {
return true;
}
@@ -557,7 +557,7 @@ check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
static bool
check_tcs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
{
- if (shProg->LinkStatus &&
+ if (shProg->data->LinkStatus &&
shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL] != NULL) {
return true;
}
@@ -583,7 +583,7 @@ check_tcs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
static bool
check_tes_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
{
- if (shProg->LinkStatus &&
+ if (shProg->data->LinkStatus &&
shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL] != NULL) {
return true;
}
@@ -636,14 +636,14 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
*params = shProg->DeletePending;
return;
case GL_LINK_STATUS:
- *params = shProg->LinkStatus;
+ *params = shProg->data->LinkStatus;
return;
case GL_VALIDATE_STATUS:
- *params = shProg->Validated;
+ *params = shProg->data->Validated;
return;
case GL_INFO_LOG_LENGTH:
- *params = (shProg->InfoLog && shProg->InfoLog[0] != '\0') ?
- strlen(shProg->InfoLog) + 1 : 0;
+ *params = (shProg->data->InfoLog && shProg->data->InfoLog[0] != '\0') ?
+ strlen(shProg->data->InfoLog) + 1 : 0;
return;
case GL_ATTACHED_SHADERS:
*params = shProg->NumShaders;
@@ -657,9 +657,9 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
case GL_ACTIVE_UNIFORMS: {
unsigned i;
const unsigned num_uniforms =
- shProg->NumUniformStorage - shProg->NumHiddenUniforms;
+ shProg->data->NumUniformStorage - shProg->data->NumHiddenUniforms;
for (*params = 0, i = 0; i < num_uniforms; i++) {
- if (!shProg->UniformStorage[i].is_shader_storage)
+ if (!shProg->data->UniformStorage[i].is_shader_storage)
(*params)++;
}
return;
@@ -668,17 +668,17 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
unsigned i;
GLint max_len = 0;
const unsigned num_uniforms =
- shProg->NumUniformStorage - shProg->NumHiddenUniforms;
+ shProg->data->NumUniformStorage - shProg->data->NumHiddenUniforms;
for (i = 0; i < num_uniforms; i++) {
- if (shProg->UniformStorage[i].is_shader_storage)
+ if (shProg->data->UniformStorage[i].is_shader_storage)
continue;
/* Add one for the terminating NUL character for a non-array, and
* 4 for the "[0]" and the NUL for an array.
*/
- const GLint len = strlen(shProg->UniformStorage[i].name) + 1 +
- ((shProg->UniformStorage[i].array_elements != 0) ? 3 : 0);
+ const GLint len = strlen(shProg->data->UniformStorage[i].name) + 1 +
+ ((shProg->data->UniformStorage[i].array_elements != 0) ? 3 : 0);
if (len > max_len)
max_len = len;
@@ -755,10 +755,10 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
if (!has_ubo)
break;
- for (i = 0; i < shProg->NumUniformBlocks; i++) {
+ for (i = 0; i < shProg->data->NumUniformBlocks; i++) {
/* Add one for the terminating NUL character.
*/
- const GLint len = strlen(shProg->UniformBlocks[i].Name) + 1;
+ const GLint len = strlen(shProg->data->UniformBlocks[i].Name) + 1;
if (len > max_len)
max_len = len;
@@ -771,7 +771,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
if (!has_ubo)
break;
- *params = shProg->NumUniformBlocks;
+ *params = shProg->data->NumUniformBlocks;
return;
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
/* This enum isn't part of the OES extension for OpenGL ES 2.0. It is
@@ -792,13 +792,13 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
if (!ctx->Extensions.ARB_shader_atomic_counters)
break;
- *params = shProg->NumAtomicBuffers;
+ *params = shProg->data->NumAtomicBuffers;
return;
case GL_COMPUTE_WORK_GROUP_SIZE: {
int i;
if (!_mesa_has_compute_shaders(ctx))
break;
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(program not "
"linked)");
return;
@@ -814,7 +814,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
}
case GL_PROGRAM_SEPARABLE:
/* If the program has not been linked, return initial value 0. */
- *params = (shProg->LinkStatus == GL_FALSE) ? 0 : shProg->SeparateShader;
+ *params = (shProg->data->LinkStatus == GL_FALSE) ? 0 : shProg->SeparateShader;
return;
/* ARB_tessellation_shader */
@@ -927,7 +927,7 @@ get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize,
return;
}
- _mesa_copy_string(infoLog, bufSize, length, shProg->InfoLog);
+ _mesa_copy_string(infoLog, bufSize, length, shProg->data->InfoLog);
}
@@ -1115,10 +1115,10 @@ _mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg)
ralloc_free(filename);
}
- if (shProg->LinkStatus == GL_FALSE &&
+ if (shProg->data->LinkStatus == GL_FALSE &&
(ctx->_Shader->Flags & GLSL_REPORT_ERRORS)) {
_mesa_debug(ctx, "Error linking program %u:\n%s\n",
- shProg->Name, shProg->InfoLog);
+ shProg->Name, shProg->data->InfoLog);
}
/* debug code */
@@ -1127,7 +1127,7 @@ _mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg)
printf("Link %u shaders in program %u: %s\n",
shProg->NumShaders, shProg->Name,
- shProg->LinkStatus ? "Success" : "Failed");
+ shProg->data->LinkStatus ? "Success" : "Failed");
for (i = 0; i < shProg->NumShaders; i++) {
printf(" shader %u, stage %u\n",
@@ -1178,7 +1178,7 @@ void
_mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg,
const char *caller)
{
- if ((shProg != NULL) && !shProg->LinkStatus) {
+ if ((shProg != NULL) && !shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"%s(program %u not linked)", caller, shProg->Name);
return;
@@ -1259,7 +1259,7 @@ static GLboolean
validate_shader_program(const struct gl_shader_program *shProg,
char *errMsg)
{
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
return GL_FALSE;
}
@@ -1303,13 +1303,13 @@ validate_program(struct gl_context *ctx, GLuint program)
return;
}
- shProg->Validated = validate_shader_program(shProg, errMsg);
- if (!shProg->Validated) {
+ shProg->data->Validated = validate_shader_program(shProg, errMsg);
+ if (!shProg->data->Validated) {
/* update info log */
- if (shProg->InfoLog) {
- ralloc_free(shProg->InfoLog);
+ if (shProg->data->InfoLog) {
+ ralloc_free(shProg->data->InfoLog);
}
- shProg->InfoLog = ralloc_strdup(shProg, errMsg);
+ shProg->data->InfoLog = ralloc_strdup(shProg->data, errMsg);
}
}
@@ -1815,7 +1815,7 @@ _mesa_UseProgram(GLuint program)
if (!shProg) {
return;
}
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glUseProgram(program %u not linked)", program);
return;
@@ -1992,7 +1992,7 @@ _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length,
* length is zero, and a call to GetProgramBinary will generate an
* INVALID_OPERATION error.
*/
- if (!shProg->LinkStatus) {
+ if (!shProg->data->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetProgramBinary(program %u not linked)",
shProg->Name);
@@ -2044,7 +2044,7 @@ _mesa_ProgramBinary(GLuint program, GLenum binaryFormat,
* Since any value of binaryFormat passed "is not one of those specified as
* allowable for [this] command, an INVALID_ENUM error is generated."
*/
- shProg->LinkStatus = GL_FALSE;
+ shProg->data->LinkStatus = GL_FALSE;
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramBinary");
}
@@ -2246,12 +2246,12 @@ _mesa_CreateShaderProgramv(GLenum type, GLsizei count,
/* Possibly... */
if (active-user-defined-varyings-in-linked-program) {
append-error-to-info-log;
- shProg->LinkStatus = GL_FALSE;
+ shProg->data->LinkStatus = GL_FALSE;
}
#endif
}
if (sh->InfoLog)
- ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
+ ralloc_strcat(&shProg->data->InfoLog, sh->InfoLog);
}
delete_shader(ctx, shader);
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index fe0b45f57e8..167431dfe67 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -307,7 +307,7 @@ init_shader_program(struct gl_shader_program *prog)
exec_list_make_empty(&prog->EmptyUniformLocations);
- prog->InfoLog = ralloc_strdup(prog, "");
+ prog->data->InfoLog = ralloc_strdup(prog->data, "");
}
/**
@@ -320,6 +320,11 @@ _mesa_new_shader_program(GLuint name)
shProg = rzalloc(NULL, struct gl_shader_program);
if (shProg) {
shProg->Name = name;
+ shProg->data = create_shader_program_data();
+ if (!shProg->data) {
+ ralloc_free(shProg);
+ return NULL;
+ }
init_shader_program(shProg);
}
return shProg;
@@ -340,12 +345,13 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
}
}
- if (shProg->UniformStorage) {
- for (unsigned i = 0; i < shProg->NumUniformStorage; ++i)
- _mesa_uniform_detach_all_driver_storage(&shProg->UniformStorage[i]);
- ralloc_free(shProg->UniformStorage);
- shProg->NumUniformStorage = 0;
- shProg->UniformStorage = NULL;
+ if (shProg->data->UniformStorage) {
+ for (unsigned i = 0; i < shProg->data->NumUniformStorage; ++i)
+ _mesa_uniform_detach_all_driver_storage(&shProg->data->
+ UniformStorage[i]);
+ ralloc_free(shProg->data->UniformStorage);
+ shProg->data->NumUniformStorage = 0;
+ shProg->data->UniformStorage = NULL;
}
if (shProg->UniformRemapTable) {
@@ -359,21 +365,21 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
shProg->UniformHash = NULL;
}
- assert(shProg->InfoLog != NULL);
- ralloc_free(shProg->InfoLog);
- shProg->InfoLog = ralloc_strdup(shProg, "");
+ assert(shProg->data->InfoLog != NULL);
+ ralloc_free(shProg->data->InfoLog);
+ shProg->data->InfoLog = ralloc_strdup(shProg->data, "");
- ralloc_free(shProg->UniformBlocks);
- shProg->UniformBlocks = NULL;
- shProg->NumUniformBlocks = 0;
+ ralloc_free(shProg->data->UniformBlocks);
+ shProg->data->UniformBlocks = NULL;
+ shProg->data->NumUniformBlocks = 0;
- ralloc_free(shProg->ShaderStorageBlocks);
- shProg->ShaderStorageBlocks = NULL;
- shProg->NumShaderStorageBlocks = 0;
+ ralloc_free(shProg->data->ShaderStorageBlocks);
+ shProg->data->ShaderStorageBlocks = NULL;
+ shProg->data->NumShaderStorageBlocks = 0;
- ralloc_free(shProg->AtomicBuffers);
- shProg->AtomicBuffers = NULL;
- shProg->NumAtomicBuffers = 0;
+ ralloc_free(shProg->data->AtomicBuffers);
+ shProg->data->AtomicBuffers = NULL;
+ shProg->data->NumAtomicBuffers = 0;
if (shProg->ProgramResourceList) {
ralloc_free(shProg->ProgramResourceList);
@@ -442,7 +448,7 @@ _mesa_delete_shader_program(struct gl_context *ctx,
struct gl_shader_program *shProg)
{
_mesa_free_shader_program_data(ctx, shProg);
-
+ _mesa_reference_shader_program_data(ctx, &shProg->data, NULL);
ralloc_free(shProg);
}
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index 42956fd5d91..e56f6e136d3 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -132,7 +132,7 @@ update_program(struct gl_context *ctx)
* come up, or matter.
*/
- if (fsProg && fsProg->LinkStatus
+ if (fsProg && fsProg->data->LinkStatus
&& fsProg->_LinkedShaders[MESA_SHADER_FRAGMENT]) {
/* Use GLSL fragment shader */
_mesa_reference_shader_program(ctx,
@@ -183,7 +183,7 @@ update_program(struct gl_context *ctx)
NULL);
}
- if (gsProg && gsProg->LinkStatus
+ if (gsProg && gsProg->data->LinkStatus
&& gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]) {
/* Use GLSL geometry shader */
_mesa_reference_program(ctx, &ctx->GeometryProgram._Current,
@@ -193,7 +193,7 @@ update_program(struct gl_context *ctx)
_mesa_reference_program(ctx, &ctx->GeometryProgram._Current, NULL);
}
- if (tesProg && tesProg->LinkStatus
+ if (tesProg && tesProg->data->LinkStatus
&& tesProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]) {
/* Use GLSL tessellation evaluation shader */
_mesa_reference_program(ctx, &ctx->TessEvalProgram._Current,
@@ -204,7 +204,7 @@ update_program(struct gl_context *ctx)
_mesa_reference_program(ctx, &ctx->TessEvalProgram._Current, NULL);
}
- if (tcsProg && tcsProg->LinkStatus
+ if (tcsProg && tcsProg->data->LinkStatus
&& tcsProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]) {
/* Use GLSL tessellation control shader */
_mesa_reference_program(ctx, &ctx->TessCtrlProgram._Current,
@@ -219,7 +219,7 @@ update_program(struct gl_context *ctx)
* _mesa_get_fixed_func_vertex_program() needs to know active
* fragprog inputs.
*/
- if (vsProg && vsProg->LinkStatus
+ if (vsProg && vsProg->data->LinkStatus
&& vsProg->_LinkedShaders[MESA_SHADER_VERTEX]) {
/* Use GLSL vertex shader */
_mesa_reference_program(ctx, &ctx->VertexProgram._Current,
@@ -242,7 +242,7 @@ update_program(struct gl_context *ctx)
_mesa_reference_program(ctx, &ctx->VertexProgram._Current, NULL);
}
- if (csProg && csProg->LinkStatus
+ if (csProg && csProg->data->LinkStatus
&& csProg->_LinkedShaders[MESA_SHADER_COMPUTE]) {
/* Use GLSL compute shader */
_mesa_reference_program(ctx, &ctx->ComputeProgram._Current,
diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
index 56446c3af09..4676d4aa0d9 100644
--- a/src/mesa/main/texstate.c
+++ b/src/mesa/main/texstate.c
@@ -701,7 +701,7 @@ update_texture_state( struct gl_context *ctx )
for (i = 0; i < MESA_SHADER_STAGES; i++) {
if (ctx->_Shader->CurrentProgram[i] &&
- ctx->_Shader->CurrentProgram[i]->LinkStatus) {
+ ctx->_Shader->CurrentProgram[i]->data->LinkStatus) {
prog[i] = ctx->_Shader->CurrentProgram[i]->_LinkedShaders[i]->Program;
} else {
if (i == MESA_SHADER_FRAGMENT && ctx->FragmentProgram._Enabled)
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index db700df91e4..3108d348d6f 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -179,10 +179,10 @@ validate_uniform_parameters(struct gl_context *ctx,
/* Check that the given location is in bounds of uniform remap table.
* Unlinked programs will have NumUniformRemapTable == 0, so we can take
- * the shProg->LinkStatus check out of the main path.
+ * the shProg->data->LinkStatus check out of the main path.
*/
if (unlikely(location >= (GLint) shProg->NumUniformRemapTable)) {
- if (!shProg->LinkStatus)
+ if (!shProg->data->LinkStatus)
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)",
caller);
else
@@ -193,7 +193,7 @@ validate_uniform_parameters(struct gl_context *ctx,
}
if (location == -1) {
- if (!shProg->LinkStatus)
+ if (!shProg->data->LinkStatus)
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)",
caller);
@@ -1068,7 +1068,7 @@ _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
char *errMsg, size_t errMsgLength)
{
/* Shader does not have samplers. */
- if (shProg->NumUniformStorage == 0)
+ if (shProg->data->NumUniformStorage == 0)
return true;
if (!shProg->SamplersValidated) {
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
index 3921644892c..f26fd784e71 100644
--- a/src/mesa/main/uniforms.c
+++ b/src/mesa/main/uniforms.c
@@ -915,7 +915,7 @@ _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name)
* "If program has not been successfully linked, the error
* INVALID_OPERATION is generated."
*/
- if (shProg->LinkStatus == GL_FALSE) {
+ if (shProg->data->LinkStatus == GL_FALSE) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetUniformLocation(program not linked)");
return -1;
@@ -1002,10 +1002,10 @@ _mesa_UniformBlockBinding(GLuint program,
if (!shProg)
return;
- if (uniformBlockIndex >= shProg->NumUniformBlocks) {
+ if (uniformBlockIndex >= shProg->data->NumUniformBlocks) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glUniformBlockBinding(block index %u >= %u)",
- uniformBlockIndex, shProg->NumUniformBlocks);
+ uniformBlockIndex, shProg->data->NumUniformBlocks);
return;
}
@@ -1016,13 +1016,14 @@ _mesa_UniformBlockBinding(GLuint program,
return;
}
- if (shProg->UniformBlocks[uniformBlockIndex].Binding !=
+ if (shProg->data->UniformBlocks[uniformBlockIndex].Binding !=
uniformBlockBinding) {
FLUSH_VERTICES(ctx, 0);
ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
- shProg->UniformBlocks[uniformBlockIndex].Binding = uniformBlockBinding;
+ shProg->data->UniformBlocks[uniformBlockIndex].Binding =
+ uniformBlockBinding;
}
}
@@ -1044,10 +1045,11 @@ _mesa_ShaderStorageBlockBinding(GLuint program,
if (!shProg)
return;
- if (shaderStorageBlockIndex >= shProg->NumShaderStorageBlocks) {
+ if (shaderStorageBlockIndex >= shProg->data->NumShaderStorageBlocks) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glShaderStorageBlockBinding(block index %u >= %u)",
- shaderStorageBlockIndex, shProg->NumShaderStorageBlocks);
+ shaderStorageBlockIndex,
+ shProg->data->NumShaderStorageBlocks);
return;
}
@@ -1059,13 +1061,13 @@ _mesa_ShaderStorageBlockBinding(GLuint program,
return;
}
- if (shProg->ShaderStorageBlocks[shaderStorageBlockIndex].Binding !=
+ if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding !=
shaderStorageBlockBinding) {
FLUSH_VERTICES(ctx, 0);
ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
- shProg->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
+ shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
shaderStorageBlockBinding;
}
}
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 88a7f368ee1..558f0ea4f68 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -1622,7 +1622,7 @@ calc_sampler_offsets(struct gl_shader_program *prog, ir_dereference *deref,
* all that would work would be an unrolled loop counter that ends
* up being constant above.
*/
- ralloc_strcat(&prog->InfoLog,
+ ralloc_strcat(&prog->data->InfoLog,
"warning: Variable sampler array index unsupported.\n"
"This feature of the language was removed in GLSL 1.20 "
"and is unlikely to be supported for 1.10 in Mesa.\n");
@@ -1668,8 +1668,8 @@ get_sampler_uniform_value(class ir_dereference *sampler,
calc_sampler_offsets(shader_program, sampler, &offset, &array_elements,
&location);
- assert(shader_program->UniformStorage[location].opaque[shader].active);
- return shader_program->UniformStorage[location].opaque[shader].index +
+ assert(shader_program->data->UniformStorage[location].opaque[shader].active);
+ return shader_program->data->UniformStorage[location].opaque[shader].index +
offset;
}
@@ -2441,7 +2441,7 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
return;
struct gl_uniform_storage *storage =
- &this->shader_program->UniformStorage[location];
+ &this->shader_program->data->UniformStorage[location];
assert(storage->type->is_sampler() &&
storage->opaque[shader_type].active);
@@ -2510,7 +2510,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
continue;
struct gl_uniform_storage *storage =
- &shader_program->UniformStorage[location];
+ &shader_program->data->UniformStorage[location];
/* Do not associate any uniform storage to built-in uniforms */
if (storage->builtin)
@@ -2883,11 +2883,11 @@ get_mesa_program(struct gl_context *ctx,
mesa_inst++;
i++;
- if (!shader_program->LinkStatus)
+ if (!shader_program->data->LinkStatus)
break;
}
- if (!shader_program->LinkStatus) {
+ if (!shader_program->data->LinkStatus) {
goto fail_exit;
}
@@ -2936,7 +2936,7 @@ get_mesa_program(struct gl_context *ctx,
* program constant) has to happen before creating this linkage.
*/
_mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters);
- if (!shader_program->LinkStatus) {
+ if (!shader_program->data->LinkStatus) {
goto fail_exit;
}
@@ -2959,7 +2959,7 @@ extern "C" {
GLboolean
_mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
{
- assert(prog->LinkStatus);
+ assert(prog->data->LinkStatus);
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
if (prog->_LinkedShaders[i] == NULL)
@@ -3037,7 +3037,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
}
build_program_resource_list(ctx, prog);
- return prog->LinkStatus;
+ return prog->data->LinkStatus;
}
/**
@@ -3050,7 +3050,7 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
_mesa_clear_shader_program_data(ctx, prog);
- prog->LinkStatus = GL_TRUE;
+ prog->data->LinkStatus = GL_TRUE;
for (i = 0; i < prog->NumShaders; i++) {
if (!prog->Shaders[i]->CompileStatus) {
@@ -3058,24 +3058,24 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
}
}
- if (prog->LinkStatus) {
+ if (prog->data->LinkStatus) {
link_shaders(ctx, prog);
}
- if (prog->LinkStatus) {
+ if (prog->data->LinkStatus) {
if (!ctx->Driver.LinkShader(ctx, prog)) {
- prog->LinkStatus = GL_FALSE;
+ prog->data->LinkStatus = GL_FALSE;
}
}
if (ctx->_Shader->Flags & GLSL_DUMP) {
- if (!prog->LinkStatus) {
+ if (!prog->data->LinkStatus) {
fprintf(stderr, "GLSL shader program %d failed to link\n", prog->Name);
}
- if (prog->InfoLog && prog->InfoLog[0] != 0) {
+ if (prog->data->InfoLog && prog->data->InfoLog[0] != 0) {
fprintf(stderr, "GLSL shader program %d info log:\n", prog->Name);
- fprintf(stderr, "%s\n", prog->InfoLog);
+ fprintf(stderr, "%s\n", prog->data->InfoLog);
}
}
}
diff --git a/src/mesa/state_tracker/st_atom_atomicbuf.c b/src/mesa/state_tracker/st_atom_atomicbuf.c
index f48ae61377f..93538b567f1 100644
--- a/src/mesa/state_tracker/st_atom_atomicbuf.c
+++ b/src/mesa/state_tracker/st_atom_atomicbuf.c
@@ -50,8 +50,8 @@ st_bind_atomics(struct st_context *st,
if (!prog || !st->pipe->set_shader_buffers)
return;
- for (i = 0; i < prog->NumAtomicBuffers; i++) {
- struct gl_active_atomic_buffer *atomic = &prog->AtomicBuffers[i];
+ for (i = 0; i < prog->data->NumAtomicBuffers; i++) {
+ struct gl_active_atomic_buffer *atomic = &prog->data->AtomicBuffers[i];
struct gl_atomic_buffer_binding *binding =
&st->ctx->AtomicBufferBindings[atomic->Binding];
struct st_buffer_object *st_obj =
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 0cea32b764b..978dc46401b 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -570,10 +570,10 @@ fail_link(struct gl_shader_program *prog, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
- ralloc_vasprintf_append(&prog->InfoLog, fmt, args);
+ ralloc_vasprintf_append(&prog->data->InfoLog, fmt, args);
va_end(args);
- prog->LinkStatus = GL_FALSE;
+ prog->data->LinkStatus = GL_FALSE;
}
static int
@@ -3880,8 +3880,8 @@ glsl_to_tgsi_visitor::get_deref_offsets(ir_dereference *ir,
if (opaque) {
assert(location != 0xffffffff);
- *base += this->shader_program->UniformStorage[location].opaque[shader].index;
- *index += this->shader_program->UniformStorage[location].opaque[shader].index;
+ *base += this->shader_program->data->UniformStorage[location].opaque[shader].index;
+ *index += this->shader_program->data->UniformStorage[location].opaque[shader].index;
}
}
@@ -6534,7 +6534,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
* program constant) has to happen before creating this linkage.
*/
_mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters);
- if (!shader_program->LinkStatus) {
+ if (!shader_program->data->LinkStatus) {
free_glsl_to_tgsi_visitor(v);
_mesa_reference_program(ctx, &shader->Program, NULL);
return NULL;
@@ -6760,7 +6760,7 @@ GLboolean
st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
{
struct pipe_screen *pscreen = ctx->st->pipe->screen;
- assert(prog->LinkStatus);
+ assert(prog->data->LinkStatus);
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
if (prog->_LinkedShaders[i] == NULL)