i965: Switch to absolute addressing for constant buffer 0.
By default, 3DSTATE_CONSTANT_* Constant Buffer 0 is relative to dynamic state base address. This makes it unusable for pushing UBOs. I'd like to be able to use all four push buffers. There is a bit in the INSTPM register (or CS_DEBUG_MODE2 on Skylake) which controls whether buffer 0 is relative to dynamic state base address, or simply a normal pointer. Setting that gives us full flexibility. We can't currently write this on Haswell and earlier, and will need to update the kernel command parser, and then do the whole version checking song and dance. Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -100,6 +100,12 @@ struct brw_compiler {
|
|||||||
* This can negatively impact performance.
|
* This can negatively impact performance.
|
||||||
*/
|
*/
|
||||||
bool precise_trig;
|
bool precise_trig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is 3DSTATE_CONSTANT_*'s Constant Buffer 0 relative to Dynamic State
|
||||||
|
* Base Address? (If not, it's a normal GPU address.)
|
||||||
|
*/
|
||||||
|
bool constant_buffer_0_is_relative;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1680,4 +1680,10 @@ enum brw_pixel_shader_coverage_mask_mode {
|
|||||||
# define GEN8_L3CNTLREG_ALL_ALLOC_SHIFT 25
|
# define GEN8_L3CNTLREG_ALL_ALLOC_SHIFT 25
|
||||||
# define GEN8_L3CNTLREG_ALL_ALLOC_MASK INTEL_MASK(31, 25)
|
# define GEN8_L3CNTLREG_ALL_ALLOC_MASK INTEL_MASK(31, 25)
|
||||||
|
|
||||||
|
#define INSTPM 0x20c0
|
||||||
|
# define INSTPM_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE (1 << 6)
|
||||||
|
|
||||||
|
#define CS_DEBUG_MODE2 0x20d8 /* Gen9+ */
|
||||||
|
# define CSDBG2_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE (1 << 4)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -90,6 +90,30 @@ brw_upload_initial_gpu_state(struct brw_context *brw)
|
|||||||
OUT_BATCH(0);
|
OUT_BATCH(0);
|
||||||
ADVANCE_BATCH();
|
ADVANCE_BATCH();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the "CONSTANT_BUFFER Address Offset Disable" bit, so
|
||||||
|
* 3DSTATE_CONSTANT_XS buffer 0 is an absolute address.
|
||||||
|
*
|
||||||
|
* On Gen6-7.5, we use an execbuf parameter to do this for us.
|
||||||
|
* However, the kernel ignores that when execlists are in use.
|
||||||
|
* Fortunately, we can just write the registers from userspace
|
||||||
|
* on Gen8+, and they're context saved/restored.
|
||||||
|
*/
|
||||||
|
if (brw->gen >= 9) {
|
||||||
|
BEGIN_BATCH(3);
|
||||||
|
OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2));
|
||||||
|
OUT_BATCH(CS_DEBUG_MODE2);
|
||||||
|
OUT_BATCH(REG_MASK(CSDBG2_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE) |
|
||||||
|
CSDBG2_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE);
|
||||||
|
ADVANCE_BATCH();
|
||||||
|
} else if (brw->gen == 8) {
|
||||||
|
BEGIN_BATCH(3);
|
||||||
|
OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2));
|
||||||
|
OUT_BATCH(INSTPM);
|
||||||
|
OUT_BATCH(REG_MASK(INSTPM_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE) |
|
||||||
|
INSTPM_CONSTANT_BUFFER_ADDRESS_OFFSET_DISABLE);
|
||||||
|
ADVANCE_BATCH();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const struct brw_tracked_state *
|
static inline const struct brw_tracked_state *
|
||||||
|
@@ -2327,6 +2327,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *dri_screen)
|
|||||||
screen->compiler = brw_compiler_create(screen, devinfo);
|
screen->compiler = brw_compiler_create(screen, devinfo);
|
||||||
screen->compiler->shader_debug_log = shader_debug_log_mesa;
|
screen->compiler->shader_debug_log = shader_debug_log_mesa;
|
||||||
screen->compiler->shader_perf_log = shader_perf_log_mesa;
|
screen->compiler->shader_perf_log = shader_perf_log_mesa;
|
||||||
|
screen->compiler->constant_buffer_0_is_relative = devinfo->gen < 8;
|
||||||
screen->program_id = 1;
|
screen->program_id = 1;
|
||||||
|
|
||||||
screen->has_exec_fence =
|
screen->has_exec_fence =
|
||||||
|
Reference in New Issue
Block a user