mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 20:08:06 +02:00
i965g: populate wm reloc array earlier
Still have to calculate the reloc background in two places.
This commit is contained in:
parent
b8e63e9210
commit
4a3e24522b
1 changed files with 46 additions and 36 deletions
|
|
@ -140,40 +140,13 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
|
|||
*/
|
||||
static enum pipe_error
|
||||
wm_unit_create_from_key(struct brw_context *brw, struct brw_wm_unit_key *key,
|
||||
struct brw_winsys_buffer **reloc_bufs,
|
||||
struct brw_winsys_reloc *reloc,
|
||||
unsigned nr_reloc,
|
||||
struct brw_winsys_buffer **bo_out)
|
||||
{
|
||||
struct brw_wm_unit_state wm;
|
||||
struct brw_winsys_reloc reloc[3];
|
||||
unsigned nr_reloc = 0;
|
||||
enum pipe_error ret;
|
||||
|
||||
/* Emit WM program relocation */
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_STATE,
|
||||
wm.thread0.grf_reg_count << 1,
|
||||
offsetof(struct brw_wm_unit_state, thread0),
|
||||
brw->wm.prog_bo);
|
||||
|
||||
/* Emit scratch space relocation */
|
||||
if (key->total_scratch != 0) {
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_SCRATCH,
|
||||
wm.thread2.per_thread_scratch_space,
|
||||
offsetof(struct brw_wm_unit_state, thread2),
|
||||
brw->wm.scratch_bo);
|
||||
}
|
||||
|
||||
/* Emit sampler state relocation */
|
||||
if (key->sampler_count != 0) {
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_STATE,
|
||||
wm.wm4.stats_enable | (wm.wm4.sampler_count << 2),
|
||||
offsetof(struct brw_wm_unit_state, wm4),
|
||||
brw->wm.sampler_bo);
|
||||
}
|
||||
|
||||
|
||||
memset(&wm, 0, sizeof(wm));
|
||||
|
||||
wm.thread0.grf_reg_count = align(key->total_grf, 16) / 16 - 1;
|
||||
|
|
@ -243,7 +216,7 @@ wm_unit_create_from_key(struct brw_context *brw, struct brw_wm_unit_key *key,
|
|||
|
||||
wm.wm5.line_stipple = key->line_stipple;
|
||||
|
||||
if (BRW_DEBUG & DEBUG_STATS || key->stats_wm)
|
||||
if ((BRW_DEBUG & DEBUG_STATS) || key->stats_wm)
|
||||
wm.wm4.stats_enable = 1;
|
||||
|
||||
ret = brw_upload_cache(&brw->cache, BRW_WM_UNIT,
|
||||
|
|
@ -262,11 +235,17 @@ wm_unit_create_from_key(struct brw_context *brw, struct brw_wm_unit_key *key,
|
|||
static enum pipe_error upload_wm_unit( struct brw_context *brw )
|
||||
{
|
||||
struct brw_wm_unit_key key;
|
||||
struct brw_winsys_buffer *reloc_bufs[3];
|
||||
struct brw_winsys_reloc reloc[3];
|
||||
unsigned nr_reloc = 0;
|
||||
enum pipe_error ret;
|
||||
unsigned grf_reg_count;
|
||||
unsigned per_thread_scratch_space;
|
||||
unsigned stats_enable;
|
||||
unsigned sampler_count;
|
||||
|
||||
wm_unit_populate_key(brw, &key);
|
||||
|
||||
|
||||
/* Allocate the necessary scratch space if we haven't already. Don't
|
||||
* bother reducing the allocation later, since we use scratch so
|
||||
* rarely.
|
||||
|
|
@ -291,18 +270,49 @@ static enum pipe_error upload_wm_unit( struct brw_context *brw )
|
|||
}
|
||||
}
|
||||
|
||||
reloc_bufs[0] = brw->wm.prog_bo;
|
||||
reloc_bufs[1] = brw->wm.scratch_bo;
|
||||
reloc_bufs[2] = brw->wm.sampler_bo;
|
||||
|
||||
/* XXX: temporary:
|
||||
*/
|
||||
grf_reg_count = (align(key.total_grf, 16) / 16 - 1);
|
||||
per_thread_scratch_space = key.total_scratch / 1024 - 1;
|
||||
stats_enable = (BRW_DEBUG & DEBUG_STATS) || key.stats_wm;
|
||||
sampler_count = BRW_IS_IGDNG(brw) ? 0 :(key.sampler_count + 1) / 4;
|
||||
|
||||
/* Emit WM program relocation */
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_STATE,
|
||||
grf_reg_count << 1,
|
||||
offsetof(struct brw_wm_unit_state, thread0),
|
||||
brw->wm.prog_bo);
|
||||
|
||||
/* Emit scratch space relocation */
|
||||
if (key.total_scratch != 0) {
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_SCRATCH,
|
||||
per_thread_scratch_space,
|
||||
offsetof(struct brw_wm_unit_state, thread2),
|
||||
brw->wm.scratch_bo);
|
||||
}
|
||||
|
||||
/* Emit sampler state relocation */
|
||||
if (key.sampler_count != 0) {
|
||||
make_reloc(&reloc[nr_reloc++],
|
||||
BRW_USAGE_STATE,
|
||||
stats_enable | (sampler_count << 2),
|
||||
offsetof(struct brw_wm_unit_state, wm4),
|
||||
brw->wm.sampler_bo);
|
||||
}
|
||||
|
||||
|
||||
if (brw_search_cache(&brw->cache, BRW_WM_UNIT,
|
||||
&key, sizeof(key),
|
||||
reloc_bufs, 3,
|
||||
reloc, nr_reloc,
|
||||
NULL,
|
||||
&brw->wm.state_bo))
|
||||
return PIPE_OK;
|
||||
|
||||
ret = wm_unit_create_from_key(brw, &key, reloc_bufs,
|
||||
ret = wm_unit_create_from_key(brw, &key,
|
||||
reloc, nr_reloc,
|
||||
&brw->wm.state_bo);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue