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>
This commit is contained in:
@@ -4404,8 +4404,6 @@ handle_tess_ctrl_shader_output_decl(struct _mesa_glsl_parse_state *state,
|
|||||||
if (var->data.patch)
|
if (var->data.patch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var->data.tess_varying_implicit_sized_array = var->type->is_unsized_array();
|
|
||||||
|
|
||||||
validate_layout_qualifier_vertex_count(state, loc, var, num_vertices,
|
validate_layout_qualifier_vertex_count(state, loc, var, num_vertices,
|
||||||
&state->tcs_output_size,
|
&state->tcs_output_size,
|
||||||
"tessellation control shader output");
|
"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()) {
|
if (var->type->is_unsized_array()) {
|
||||||
var->type = glsl_type::get_array_instance(var->type->fields.array,
|
var->type = glsl_type::get_array_instance(var->type->fields.array,
|
||||||
state->Const.MaxPatchVertices);
|
state->Const.MaxPatchVertices);
|
||||||
var->data.tess_varying_implicit_sized_array = true;
|
|
||||||
} else if (var->type->length != state->Const.MaxPatchVertices) {
|
} else if (var->type->length != state->Const.MaxPatchVertices) {
|
||||||
_mesa_glsl_error(&loc, state,
|
_mesa_glsl_error(&loc, state,
|
||||||
"per-vertex tessellation shader input arrays must be "
|
"per-vertex tessellation shader input arrays must be "
|
||||||
|
@@ -843,12 +843,6 @@ public:
|
|||||||
|
|
||||||
unsigned implicit_sized_array:1;
|
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
|
* Whether this is a fragment shader output implicitly initialized with
|
||||||
* the previous contents of the specified render target at the
|
* the previous contents of the specified render target at the
|
||||||
|
@@ -3709,17 +3709,6 @@ create_shader_variable(struct gl_shader_program *shProg,
|
|||||||
return out;
|
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
|
static bool
|
||||||
add_shader_variable(const struct gl_context *ctx,
|
add_shader_variable(const struct gl_context *ctx,
|
||||||
struct gl_shader_program *shProg,
|
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();
|
const glsl_type *interface_type = var->get_interface_type();
|
||||||
|
|
||||||
if (outermost_struct_type == NULL) {
|
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) {
|
if (var->data.from_named_ifc_block) {
|
||||||
const char *interface_name = interface_type->name;
|
const char *interface_name = interface_type->name;
|
||||||
|
|
||||||
|
@@ -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.patch = iface_t->fields.structure[i].patch;
|
||||||
new_var->data.stream = var->data.stream;
|
new_var->data.stream = var->data.stream;
|
||||||
new_var->data.how_declared = var->data.how_declared;
|
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->data.from_named_ifc_block = 1;
|
||||||
|
|
||||||
new_var->init_interface_type(var->type);
|
new_var->init_interface_type(var->type);
|
||||||
|
Reference in New Issue
Block a user