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:
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user