iris: emit 3DSTATE_SAMPLER_STATE_POINTERS
This commit is contained in:
@@ -52,6 +52,12 @@ enum iris_dirty {
|
|||||||
IRIS_DIRTY_MULTISAMPLE = (1ull << 13),
|
IRIS_DIRTY_MULTISAMPLE = (1ull << 13),
|
||||||
IRIS_DIRTY_VERTEX_BUFFERS = (1ull << 14),
|
IRIS_DIRTY_VERTEX_BUFFERS = (1ull << 14),
|
||||||
IRIS_DIRTY_SAMPLE_MASK = (1ull << 15),
|
IRIS_DIRTY_SAMPLE_MASK = (1ull << 15),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_VS = (1ull << 16),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_TCS = (1ull << 17),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_TES = (1ull << 18),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_GS = (1ull << 19),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_PS = (1ull << 20),
|
||||||
|
IRIS_DIRTY_SAMPLER_STATES_CS = (1ull << 21),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iris_depth_stencil_alpha_state;
|
struct iris_depth_stencil_alpha_state;
|
||||||
|
@@ -725,6 +725,8 @@ iris_bind_sampler_states(struct pipe_context *ctx,
|
|||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
ice->state.samplers[stage][start + i] = states[i];
|
ice->state.samplers[stage][start + i] = states[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ice->state.dirty |= IRIS_DIRTY_SAMPLER_STATES_VS << stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct iris_sampler_view {
|
struct iris_sampler_view {
|
||||||
@@ -1404,6 +1406,30 @@ iris_upload_render_state(struct iris_context *ice,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int stage = 0; stage <= MESA_SHADER_FRAGMENT; stage++) {
|
||||||
|
if (!(dirty & (IRIS_DIRTY_SAMPLER_STATES_VS << stage)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// XXX: get sampler count from shader; don't emit them all...
|
||||||
|
const int count = IRIS_MAX_TEXTURE_SAMPLERS;
|
||||||
|
|
||||||
|
uint32_t offset;
|
||||||
|
uint32_t *map = iris_alloc_state(batch,
|
||||||
|
count * 4 * GENX(SAMPLER_STATE_length),
|
||||||
|
32, &offset);
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
memcpy(map, ice->state.samplers[stage][i]->sampler_state,
|
||||||
|
4 * GENX(SAMPLER_STATE_length));
|
||||||
|
map += GENX(SAMPLER_STATE_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
iris_emit_cmd(batch, GENX(3DSTATE_SAMPLER_STATE_POINTERS_VS), ptr) {
|
||||||
|
ptr._3DCommandSubOpcode = 43 + stage;
|
||||||
|
ptr.PointertoVSSamplerState = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (1) {
|
if (1) {
|
||||||
iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) {
|
iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) {
|
||||||
topo.PrimitiveTopologyType =
|
topo.PrimitiveTopologyType =
|
||||||
@@ -1469,9 +1495,6 @@ iris_upload_render_state(struct iris_context *ice,
|
|||||||
3DSTATE_BINDING_TABLE_POINTERS_*
|
3DSTATE_BINDING_TABLE_POINTERS_*
|
||||||
-> TODO
|
-> TODO
|
||||||
|
|
||||||
3DSTATE_SAMPLER_STATE_POINTERS_*
|
|
||||||
-> TODO
|
|
||||||
|
|
||||||
3DSTATE_VS
|
3DSTATE_VS
|
||||||
3DSTATE_HS
|
3DSTATE_HS
|
||||||
3DSTATE_TE
|
3DSTATE_TE
|
||||||
|
Reference in New Issue
Block a user