diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2017-02-10 23:02:56 -0800 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2017-02-12 21:09:25 -0800 |
commit | 57dc6d80a0dab253ef8e8543810e5384b01f41f7 (patch) | |
tree | 980314bfbf561becd088c6468b43a448c4d6e52b | |
parent | 1fad070f96596ab1c0d888d2e676b6425a48825b (diff) |
glsl: Drop resize-to-MaxPatchVertices hack.
TCS and TES inputs without an array size are implicitly sized to
gl_MaxPatchVertices. But TCS outputs are apparently not:
"If no size is specified, it will be taken from the output patch size
(gl_VerticesOut) declared in the shader."
Fixes dEQP-GLES31.functional.program_interface_query.program_output.
array_size.separable_tess_ctrl.var.
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 3 | ||||
-rw-r--r-- | src/compiler/glsl/ir.h | 6 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 32 | ||||
-rw-r--r-- | src/compiler/glsl/lower_named_interface_blocks.cpp | 2 |
4 files changed, 0 insertions, 43 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index ee47b654bf..b90ad97b1d 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -4404,8 +4404,6 @@ handle_tess_ctrl_shader_output_decl(struct _mesa_glsl_parse_state *state, if (var->data.patch) return; - var->data.tess_varying_implicit_sized_array = var->type->is_unsized_array(); - validate_layout_qualifier_vertex_count(state, loc, var, num_vertices, &state->tcs_output_size, "tessellation control shader output"); @@ -4442,7 +4440,6 @@ handle_tess_shader_input_decl(struct _mesa_glsl_parse_state *state, if (var->type->is_unsized_array()) { var->type = glsl_type::get_array_instance(var->type->fields.array, state->Const.MaxPatchVertices); - var->data.tess_varying_implicit_sized_array = true; } else if (var->type->length != state->Const.MaxPatchVertices) { _mesa_glsl_error(&loc, state, "per-vertex tessellation shader input arrays must be " diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index 4317c54d49..3544161105 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -844,12 +844,6 @@ public: unsigned implicit_sized_array:1; /** - * Is this a non-patch TCS output / TES input array that was implicitly - * sized to gl_MaxPatchVertices? - */ - unsigned tess_varying_implicit_sized_array:1; - - /** * Whether this is a fragment shader output implicitly initialized with * the previous contents of the specified render target at the * framebuffer location corresponding to this shader invocation. diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 4c7bf282ce..b3c7d2c145 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3709,17 +3709,6 @@ create_shader_variable(struct gl_shader_program *shProg, return out; } -static const glsl_type * -resize_to_max_patch_vertices(const struct gl_context *ctx, - const glsl_type *type) -{ - if (!type) - return NULL; - - return glsl_type::get_array_instance(type->fields.array, - ctx->Const.MaxPatchVertices); -} - static bool add_shader_variable(const struct gl_context *ctx, struct gl_shader_program *shProg, @@ -3733,27 +3722,6 @@ add_shader_variable(const struct gl_context *ctx, const glsl_type *interface_type = var->get_interface_type(); if (outermost_struct_type == NULL) { - /* Unsized (non-patch) TCS output/TES input arrays are implicitly - * sized to gl_MaxPatchVertices. Internally, we shrink them to a - * smaller size. - * - * This can cause trouble with SSO programs. Since the TCS declares - * the number of output vertices, we can always shrink TCS output - * arrays. However, the TES might not be linked with a TCS, in - * which case it won't know the size of the patch. In other words, - * the TCS and TES may disagree on the (smaller) array sizes. This - * can result in the resource names differing across stages, causing - * SSO validation failures and other cascading issues. - * - * Expanding the array size to the full gl_MaxPatchVertices fixes - * these issues. It's also what program interface queries expect, - * as that is the official size of the array. - */ - if (var->data.tess_varying_implicit_sized_array) { - type = resize_to_max_patch_vertices(ctx, type); - interface_type = resize_to_max_patch_vertices(ctx, interface_type); - } - if (var->data.from_named_ifc_block) { const char *interface_name = interface_type->name; diff --git a/src/compiler/glsl/lower_named_interface_blocks.cpp b/src/compiler/glsl/lower_named_interface_blocks.cpp index 53ef638c9c..a00e60dd77 100644 --- a/src/compiler/glsl/lower_named_interface_blocks.cpp +++ b/src/compiler/glsl/lower_named_interface_blocks.cpp @@ -193,8 +193,6 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions) new_var->data.patch = iface_t->fields.structure[i].patch; new_var->data.stream = var->data.stream; new_var->data.how_declared = var->data.how_declared; - new_var->data.tess_varying_implicit_sized_array = - var->data.tess_varying_implicit_sized_array; new_var->data.from_named_ifc_block = 1; new_var->init_interface_type(var->type); |