mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-11 15:40:31 +01:00
anv/gen8: Enable SLM in L3 cache control register
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
parent
97b09a9268
commit
19830031cb
2 changed files with 69 additions and 17 deletions
|
|
@ -1087,6 +1087,7 @@ struct anv_attachment_state {
|
||||||
struct anv_cmd_state {
|
struct anv_cmd_state {
|
||||||
/* PIPELINE_SELECT.PipelineSelection */
|
/* PIPELINE_SELECT.PipelineSelection */
|
||||||
uint32_t current_pipeline;
|
uint32_t current_pipeline;
|
||||||
|
uint32_t current_l3_config;
|
||||||
uint32_t vb_dirty;
|
uint32_t vb_dirty;
|
||||||
anv_cmd_dirty_mask_t dirty;
|
anv_cmd_dirty_mask_t dirty;
|
||||||
anv_cmd_dirty_mask_t compute_dirty;
|
anv_cmd_dirty_mask_t compute_dirty;
|
||||||
|
|
|
||||||
|
|
@ -146,9 +146,74 @@ gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_lrm(struct anv_batch *batch,
|
||||||
|
uint32_t reg, struct anv_bo *bo, uint32_t offset)
|
||||||
|
{
|
||||||
|
anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM),
|
||||||
|
.RegisterAddress = reg,
|
||||||
|
.MemoryAddress = { bo, offset });
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_lri(struct anv_batch *batch, uint32_t reg, uint32_t imm)
|
||||||
|
{
|
||||||
|
anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM),
|
||||||
|
.RegisterOffset = reg,
|
||||||
|
.DataDWord = imm);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GEN8_L3CNTLREG 0x7034
|
||||||
|
|
||||||
|
static void
|
||||||
|
config_l3(struct anv_cmd_buffer *cmd_buffer, bool enable_slm)
|
||||||
|
{
|
||||||
|
/* References for GL state:
|
||||||
|
*
|
||||||
|
* - commits e307cfa..228d5a3
|
||||||
|
* - src/mesa/drivers/dri/i965/gen7_l3_state.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t val = enable_slm ?
|
||||||
|
/* All = 48 ways; URB = 16 ways; DC and RO = 0, SLM = 1 */
|
||||||
|
0x60000021 :
|
||||||
|
/* All = 48 ways; URB = 48 ways; DC, RO and SLM = 0 */
|
||||||
|
0x60000060;
|
||||||
|
bool changed = cmd_buffer->state.current_l3_config != val;
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
/* According to the hardware docs, the L3 partitioning can only be changed
|
||||||
|
* while the pipeline is completely drained and the caches are flushed,
|
||||||
|
* which involves a first PIPE_CONTROL flush which stalls the pipeline and
|
||||||
|
* initiates invalidation of the relevant caches...
|
||||||
|
*/
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL),
|
||||||
|
.TextureCacheInvalidationEnable = true,
|
||||||
|
.ConstantCacheInvalidationEnable = true,
|
||||||
|
.InstructionCacheInvalidateEnable = true,
|
||||||
|
.DCFlushEnable = true,
|
||||||
|
.PostSyncOperation = NoWrite,
|
||||||
|
.CommandStreamerStallEnable = true);
|
||||||
|
|
||||||
|
/* ...followed by a second stalling flush which guarantees that
|
||||||
|
* invalidation is complete when the L3 configuration registers are
|
||||||
|
* modified.
|
||||||
|
*/
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL),
|
||||||
|
.DCFlushEnable = true,
|
||||||
|
.PostSyncOperation = NoWrite,
|
||||||
|
.CommandStreamerStallEnable = true);
|
||||||
|
|
||||||
|
emit_lri(&cmd_buffer->batch, GEN8_L3CNTLREG, val);
|
||||||
|
cmd_buffer->state.current_l3_config = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
flush_pipeline_select_3d(struct anv_cmd_buffer *cmd_buffer)
|
flush_pipeline_select_3d(struct anv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
|
config_l3(cmd_buffer, false);
|
||||||
|
|
||||||
if (cmd_buffer->state.current_pipeline != _3D) {
|
if (cmd_buffer->state.current_pipeline != _3D) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
|
||||||
#if ANV_GEN >= 9
|
#if ANV_GEN >= 9
|
||||||
|
|
@ -426,23 +491,6 @@ void genX(CmdDrawIndexed)(
|
||||||
.BaseVertexLocation = vertexOffset);
|
.BaseVertexLocation = vertexOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
emit_lrm(struct anv_batch *batch,
|
|
||||||
uint32_t reg, struct anv_bo *bo, uint32_t offset)
|
|
||||||
{
|
|
||||||
anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_MEM),
|
|
||||||
.RegisterAddress = reg,
|
|
||||||
.MemoryAddress = { bo, offset });
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
emit_lri(struct anv_batch *batch, uint32_t reg, uint32_t imm)
|
|
||||||
{
|
|
||||||
anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM),
|
|
||||||
.RegisterOffset = reg,
|
|
||||||
.DataDWord = imm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Auto-Draw / Indirect Registers */
|
/* Auto-Draw / Indirect Registers */
|
||||||
#define GEN7_3DPRIM_END_OFFSET 0x2420
|
#define GEN7_3DPRIM_END_OFFSET 0x2420
|
||||||
#define GEN7_3DPRIM_START_VERTEX 0x2430
|
#define GEN7_3DPRIM_START_VERTEX 0x2430
|
||||||
|
|
@ -571,6 +619,9 @@ cmd_buffer_flush_compute_state(struct anv_cmd_buffer *cmd_buffer)
|
||||||
|
|
||||||
assert(pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT);
|
assert(pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT);
|
||||||
|
|
||||||
|
bool needs_slm = pipeline->cs_prog_data.base.total_shared > 0;
|
||||||
|
config_l3(cmd_buffer, needs_slm);
|
||||||
|
|
||||||
if (cmd_buffer->state.current_pipeline != GPGPU) {
|
if (cmd_buffer->state.current_pipeline != GPGPU) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
|
||||||
#if ANV_GEN >= 9
|
#if ANV_GEN >= 9
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue