iris: Rework default tessellation level uploads

Now that we've added a system value uploading mechanism, we may as well
reuse the same system for default tessellation levels.  This simplifies
the state upload code a bit.

Also fixes:
KHR-GL45.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_tessLevel

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Kenneth Graunke
2019-03-06 20:56:37 -08:00
parent fd5075e059
commit 2f51cb5e67
2 changed files with 33 additions and 39 deletions
+23 -2
View File
@@ -727,8 +727,29 @@ iris_compile_tcs(struct iris_context *ice,
nir = brw_nir_create_passthrough_tcs(mem_ctx, compiler, options, key);
/* Reserve space for passing the default tess levels as constants. */
prog_data->param = rzalloc_array(mem_ctx, uint32_t, 8);
prog_data->nr_params = 8;
num_system_values = 8;
system_values =
rzalloc_array(mem_ctx, enum brw_param_builtin, num_system_values);
prog_data->param = rzalloc_array(mem_ctx, uint32_t, num_system_values);
prog_data->nr_params = num_system_values;
if (key->tes_primitive_mode == GL_QUADS) {
for (int i = 0; i < 4; i++)
system_values[7 - i] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X + i;
system_values[3] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X;
system_values[2] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_Y;
} else if (key->tes_primitive_mode == GL_TRIANGLES) {
for (int i = 0; i < 3; i++)
system_values[7 - i] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X + i;
system_values[4] = BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X;
} else {
assert(key->tes_primitive_mode == GL_ISOLINES);
system_values[7] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_Y;
system_values[6] = BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X;
}
prog_data->ubo_ranges[0].length = 1;
}
+10 -37
View File
@@ -2023,11 +2023,13 @@ iris_set_tess_state(struct pipe_context *ctx,
const float default_inner_level[2])
{
struct iris_context *ice = (struct iris_context *) ctx;
struct iris_shader_state *shs = &ice->state.shaders[MESA_SHADER_TESS_CTRL];
memcpy(&ice->state.default_outer_level[0], &default_outer_level[0], 4 * sizeof(float));
memcpy(&ice->state.default_inner_level[0], &default_inner_level[0], 2 * sizeof(float));
ice->state.dirty |= IRIS_DIRTY_CONSTANTS_TCS;
shs->cbuf0_needs_upload = true;
}
static void
@@ -2492,6 +2494,14 @@ upload_uniforms(struct iris_context *ice,
value = tcs_info->tess.tcs_vertices_out;
}
} else if (sysval >= BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X &&
sysval <= BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_W) {
unsigned i = sysval - BRW_PARAM_BUILTIN_TESS_LEVEL_OUTER_X;
value = fui(ice->state.default_outer_level[i]);
} else if (sysval == BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X) {
value = fui(ice->state.default_inner_level[0]);
} else if (sysval == BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_Y) {
value = fui(ice->state.default_inner_level[1]);
} else {
assert(!"unhandled system value");
}
@@ -4349,43 +4359,6 @@ iris_upload_dirty_render_state(struct iris_context *ice,
}
}
/* Upload constants for TCS passthrough. */
if ((dirty & IRIS_DIRTY_CONSTANTS_TCS) &&
ice->shaders.prog[MESA_SHADER_TESS_CTRL] &&
!ice->shaders.uncompiled[MESA_SHADER_TESS_CTRL]) {
struct iris_compiled_shader *tes_shader = ice->shaders.prog[MESA_SHADER_TESS_EVAL];
assert(tes_shader);
/* Passthrough always copies 2 vec4s, so when uploading data we ensure
* it is in the right layout for TES.
*/
float hdr[8] = {};
struct brw_tes_prog_data *tes_prog_data = (void *) tes_shader->prog_data;
switch (tes_prog_data->domain) {
case BRW_TESS_DOMAIN_QUAD:
for (int i = 0; i < 4; i++)
hdr[7 - i] = ice->state.default_outer_level[i];
hdr[3] = ice->state.default_inner_level[0];
hdr[2] = ice->state.default_inner_level[1];
break;
case BRW_TESS_DOMAIN_TRI:
for (int i = 0; i < 3; i++)
hdr[7 - i] = ice->state.default_outer_level[i];
hdr[4] = ice->state.default_inner_level[0];
break;
case BRW_TESS_DOMAIN_ISOLINE:
hdr[7] = ice->state.default_outer_level[1];
hdr[6] = ice->state.default_outer_level[0];
break;
}
struct iris_shader_state *shs = &ice->state.shaders[MESA_SHADER_TESS_CTRL];
struct iris_const_buffer *cbuf = &shs->constbuf[0];
u_upload_data(ice->ctx.const_uploader, 0, sizeof(hdr), 32,
&hdr[0], &cbuf->data.offset,
&cbuf->data.res);
}
for (int stage = 0; stage <= MESA_SHADER_FRAGMENT; stage++) {
if (!(dirty & (IRIS_DIRTY_CONSTANTS_VS << stage)))
continue;