diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 2 | ||||
-rw-r--r-- | src/compiler/glsl/link_varyings.cpp | 5 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 71 |
3 files changed, 38 insertions, 40 deletions
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index a6b695c1a44..0e8f008fd1e 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -1704,7 +1704,7 @@ set_shader_inout_layout(struct gl_shader *shader, if (state->out_qualifier->out_xfb_stride[i]-> process_qualifier_constant(state, "xfb_stride", &xfb_stride, true)) { - shader->info.TransformFeedback.BufferStride[i] = xfb_stride; + shader->TransformFeedbackBufferStride[i] = xfb_stride; } } } diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 6d54a111ea1..8cd364441d3 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -108,6 +108,7 @@ create_xfb_varying_names(void *mem_ctx, const glsl_type *t, char **name, static bool process_xfb_layout_qualifiers(void *mem_ctx, const gl_linked_shader *sh, + struct gl_shader_program *prog, unsigned *num_tfeedback_decls, char ***varying_names) { @@ -118,7 +119,7 @@ process_xfb_layout_qualifiers(void *mem_ctx, const gl_linked_shader *sh, * xfb_stride to interface block members so this will catch that case also. */ for (unsigned j = 0; j < MAX_FEEDBACK_BUFFERS; j++) { - if (sh->info.TransformFeedback.BufferStride[j]) { + if (prog->TransformFeedback.BufferStride[j]) { has_xfb_qualifiers = true; break; } @@ -2397,7 +2398,7 @@ link_varyings(struct gl_shader_program *prog, unsigned first, unsigned last, if (prog->_LinkedShaders[i]) { has_xfb_qualifiers = process_xfb_layout_qualifiers(mem_ctx, prog->_LinkedShaders[i], - &num_tfeedback_decls, + prog, &num_tfeedback_decls, &varying_names); break; } diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 35f1d8b6a8e..61dfa556810 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1587,6 +1587,29 @@ private: hash_table *unnamed_interfaces; }; +static bool +validate_xfb_buffer_stride(struct gl_context *ctx, unsigned idx, + struct gl_shader_program *prog) +{ + /* We will validate doubles at a later stage */ + if (prog->TransformFeedback.BufferStride[idx] % 4) { + linker_error(prog, "invalid qualifier xfb_stride=%d must be a " + "multiple of 4 or if its applied to a type that is " + "or contains a double a multiple of 8.", + prog->TransformFeedback.BufferStride[idx]); + return false; + } + + if (prog->TransformFeedback.BufferStride[idx] / 4 > + ctx->Const.MaxTransformFeedbackInterleavedComponents) { + linker_error(prog, "The MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS " + "limit has been exceeded."); + return false; + } + + return true; +} + /** * Check for conflicting xfb_stride default qualifiers and store buffer stride * for later use. @@ -1599,54 +1622,28 @@ link_xfb_stride_layout_qualifiers(struct gl_context *ctx, unsigned num_shaders) { for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) { - linked_shader->info.TransformFeedback.BufferStride[i] = 0; + prog->TransformFeedback.BufferStride[i] = 0; } for (unsigned i = 0; i < num_shaders; i++) { struct gl_shader *shader = shader_list[i]; for (unsigned j = 0; j < MAX_FEEDBACK_BUFFERS; j++) { - if (shader->info.TransformFeedback.BufferStride[j]) { - if (linked_shader->info.TransformFeedback.BufferStride[j] != 0 && - shader->info.TransformFeedback.BufferStride[j] != 0 && - linked_shader->info.TransformFeedback.BufferStride[j] != - shader->info.TransformFeedback.BufferStride[j]) { + if (shader->TransformFeedbackBufferStride[j]) { + if (prog->TransformFeedback.BufferStride[j] == 0) { + prog->TransformFeedback.BufferStride[j] = + shader->TransformFeedbackBufferStride[j]; + if (!validate_xfb_buffer_stride(ctx, j, prog)) + return; + } else if (prog->TransformFeedback.BufferStride[j] != + shader->TransformFeedbackBufferStride[j]){ linker_error(prog, "intrastage shaders defined with conflicting " "xfb_stride for buffer %d (%d and %d)\n", j, - linked_shader-> - info.TransformFeedback.BufferStride[j], - shader->info.TransformFeedback.BufferStride[j]); + prog->TransformFeedback.BufferStride[j], + shader->TransformFeedbackBufferStride[j]); return; } - - if (shader->info.TransformFeedback.BufferStride[j]) - linked_shader->info.TransformFeedback.BufferStride[j] = - shader->info.TransformFeedback.BufferStride[j]; - } - } - } - - for (unsigned j = 0; j < MAX_FEEDBACK_BUFFERS; j++) { - if (linked_shader->info.TransformFeedback.BufferStride[j]) { - prog->TransformFeedback.BufferStride[j] = - linked_shader->info.TransformFeedback.BufferStride[j]; - - /* We will validate doubles at a later stage */ - if (prog->TransformFeedback.BufferStride[j] % 4) { - linker_error(prog, "invalid qualifier xfb_stride=%d must be a " - "multiple of 4 or if its applied to a type that is " - "or contains a double a multiple of 8.", - prog->TransformFeedback.BufferStride[j]); - return; - } - - if (prog->TransformFeedback.BufferStride[j] / 4 > - ctx->Const.MaxTransformFeedbackInterleavedComponents) { - linker_error(prog, - "The MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS " - "limit has been exceeded."); - return; } } } |