From: Kenneth Graunke Date: Fri, 12 Jan 2018 06:50:12 +0000 (-0800) Subject: iris: emit 3DSTATE_SAMPLER_STATE_POINTERS X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21c016b49690dd46a6b26ba8fc27f820885d1638;p=mesa.git iris: emit 3DSTATE_SAMPLER_STATE_POINTERS --- diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index d4eaab75f4a..5adafed600c 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -52,6 +52,12 @@ enum iris_dirty { IRIS_DIRTY_MULTISAMPLE = (1ull << 13), IRIS_DIRTY_VERTEX_BUFFERS = (1ull << 14), 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; diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 5da3e791a53..9291bf449a2 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -725,6 +725,8 @@ iris_bind_sampler_states(struct pipe_context *ctx, for (int i = 0; i < count; i++) { ice->state.samplers[stage][start + i] = states[i]; } + + ice->state.dirty |= IRIS_DIRTY_SAMPLER_STATES_VS << stage; } 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) { iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) { topo.PrimitiveTopologyType = @@ -1469,9 +1495,6 @@ iris_upload_render_state(struct iris_context *ice, 3DSTATE_BINDING_TABLE_POINTERS_* -> TODO - 3DSTATE_SAMPLER_STATE_POINTERS_* - -> TODO - 3DSTATE_VS 3DSTATE_HS 3DSTATE_TE