diff options
author | Kenneth Graunke <[email protected]> | 2019-03-06 20:56:37 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-03-11 14:07:12 -0700 |
commit | 2f51cb5e67524d55508ec7bc1ee2a9d4d1087291 (patch) | |
tree | 1e67c4d60e4fda0008ea126723d140f0dd708226 /src/gallium | |
parent | fd5075e0594ba13c24eb195e098a814c8e76249b (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/iris/iris_program.c | 25 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_state.c | 47 |
2 files changed, 33 insertions, 39 deletions
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 9d1664029d9..279dbc3a943 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -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; } diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 1c89682b61c..427419acfb9 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -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; |