crocus/gen8: add VF SGVS support.

This is moved functionality on gen8

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11507>
This commit is contained in:
Dave Airlie
2021-06-22 05:11:25 +10:00
committed by Marge Bot
parent 5b32fccd3f
commit 22b9063aee
4 changed files with 35 additions and 0 deletions
@@ -114,6 +114,7 @@ enum {
#define CROCUS_DIRTY_GEN6_SVBI (1ull << 36)
#define CROCUS_DIRTY_GEN8_VF_TOPOLOGY (1ull << 37)
#define CROCUS_DIRTY_GEN8_PMA_FIX (1ull << 38)
#define CROCUS_DIRTY_GEN8_VF_SGVS (1ull << 39)
#define CROCUS_ALL_DIRTY_FOR_COMPUTE (CROCUS_DIRTY_COMPUTE_RESOLVES_AND_FLUSHES)
+3
View File
@@ -248,8 +248,11 @@ crocus_update_draw_parameters(struct crocus_context *ice,
}
if (changed) {
struct crocus_screen *screen = (struct crocus_screen *)ice->ctx.screen;
ice->state.dirty |= CROCUS_DIRTY_VERTEX_BUFFERS |
CROCUS_DIRTY_VERTEX_ELEMENTS;
if (screen->devinfo.ver == 8)
ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS;
}
}
@@ -1344,6 +1344,8 @@ crocus_update_compiled_vs(struct crocus_context *ice)
if (old != shader) {
ice->shaders.prog[CROCUS_CACHE_VS] = shader;
if (devinfo->ver == 8)
ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS;
ice->state.stage_dirty |= CROCUS_STAGE_DIRTY_VS |
CROCUS_STAGE_DIRTY_BINDINGS_VS |
CROCUS_STAGE_DIRTY_CONSTANTS_VS;
+29
View File
@@ -3769,7 +3769,13 @@ static void
crocus_bind_vertex_elements_state(struct pipe_context *ctx, void *state)
{
struct crocus_context *ice = (struct crocus_context *) ctx;
#if GFX_VER == 8
struct crocus_vertex_element_state *old_cso = ice->state.cso_vertex_elements;
struct crocus_vertex_element_state *new_cso = state;
if (new_cso && cso_changed(count))
ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS;
#endif
ice->state.cso_vertex_elements = state;
ice->state.dirty |= CROCUS_DIRTY_VERTEX_ELEMENTS | CROCUS_DIRTY_VERTEX_BUFFERS;
ice->state.stage_dirty |= ice->state.stage_dirty_for_nos[CROCUS_NOS_VERTEX_ELEMENTS];
@@ -7377,6 +7383,29 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
#endif
}
#if GFX_VER == 8
if (dirty & CROCUS_DIRTY_GEN8_VF_SGVS) {
const struct brw_vs_prog_data *vs_prog_data = (void *)
ice->shaders.prog[MESA_SHADER_VERTEX]->prog_data;
struct crocus_vertex_element_state *cso = ice->state.cso_vertex_elements;
crocus_emit_cmd(batch, GENX(3DSTATE_VF_SGVS), sgv) {
if (vs_prog_data->uses_vertexid) {
sgv.VertexIDEnable = true;
sgv.VertexIDComponentNumber = 2;
sgv.VertexIDElementOffset =
cso->count - ice->state.vs_needs_edge_flag;
}
if (vs_prog_data->uses_instanceid) {
sgv.InstanceIDEnable = true;
sgv.InstanceIDComponentNumber = 3;
sgv.InstanceIDElementOffset =
cso->count - ice->state.vs_needs_edge_flag;
}
}
}
#endif
#if GFX_VERx10 >= 75
if (dirty & CROCUS_DIRTY_GEN75_VF) {
crocus_emit_cmd(batch, GENX(3DSTATE_VF), vf) {