radeonsi: get rid of secondary input/output word
By keeping track of fewer generics, everything can fit into 64 bits. Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
0dd8aa44b3
commit
a16ae77185
|
@ -148,29 +148,22 @@ unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index)
|
||||||
assert(!"invalid generic index");
|
assert(!"invalid generic index");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
|
||||||
assert(!"invalid semantic name");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned si_shader_io_get_unique_index2(unsigned name, unsigned index)
|
|
||||||
{
|
|
||||||
switch (name) {
|
|
||||||
case TGSI_SEMANTIC_FOG:
|
case TGSI_SEMANTIC_FOG:
|
||||||
return 0;
|
return SI_MAX_IO_GENERIC + 4;
|
||||||
case TGSI_SEMANTIC_LAYER:
|
case TGSI_SEMANTIC_LAYER:
|
||||||
return 1;
|
return SI_MAX_IO_GENERIC + 5;
|
||||||
case TGSI_SEMANTIC_VIEWPORT_INDEX:
|
case TGSI_SEMANTIC_VIEWPORT_INDEX:
|
||||||
return 2;
|
return SI_MAX_IO_GENERIC + 6;
|
||||||
case TGSI_SEMANTIC_PRIMID:
|
case TGSI_SEMANTIC_PRIMID:
|
||||||
return 3;
|
return SI_MAX_IO_GENERIC + 7;
|
||||||
case TGSI_SEMANTIC_COLOR: /* these alias */
|
case TGSI_SEMANTIC_COLOR: /* these alias */
|
||||||
case TGSI_SEMANTIC_BCOLOR:
|
case TGSI_SEMANTIC_BCOLOR:
|
||||||
return 4 + index;
|
assert(index < 2);
|
||||||
|
return SI_MAX_IO_GENERIC + 8 + index;
|
||||||
case TGSI_SEMANTIC_TEXCOORD:
|
case TGSI_SEMANTIC_TEXCOORD:
|
||||||
assert(index < 8);
|
assert(index < 8);
|
||||||
return 6 + index;
|
assert(SI_MAX_IO_GENERIC + 10 + index < 64);
|
||||||
|
return SI_MAX_IO_GENERIC + 10 + index;
|
||||||
default:
|
default:
|
||||||
assert(!"invalid semantic name");
|
assert(!"invalid semantic name");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2298,16 +2291,10 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
|
||||||
if (semantic_index >= SI_MAX_IO_GENERIC)
|
if (semantic_index >= SI_MAX_IO_GENERIC)
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
default:
|
||||||
if (shader->key.opt.hw_vs.kill_outputs &
|
if (shader->key.opt.hw_vs.kill_outputs &
|
||||||
(1ull << si_shader_io_get_unique_index(semantic_name, semantic_index)))
|
(1ull << si_shader_io_get_unique_index(semantic_name, semantic_index)))
|
||||||
export_param = false;
|
export_param = false;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (shader->key.opt.hw_vs.kill_outputs2 &
|
|
||||||
(1u << si_shader_io_get_unique_index2(semantic_name, semantic_index)))
|
|
||||||
export_param = false;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outputs[i].vertex_stream[0] != 0 &&
|
if (outputs[i].vertex_stream[0] != 0 &&
|
||||||
|
@ -7159,7 +7146,6 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
|
||||||
processor == PIPE_SHADER_VERTEX) &&
|
processor == PIPE_SHADER_VERTEX) &&
|
||||||
!key->as_es && !key->as_ls) {
|
!key->as_es && !key->as_ls) {
|
||||||
fprintf(f, " opt.hw_vs.kill_outputs = 0x%"PRIx64"\n", key->opt.hw_vs.kill_outputs);
|
fprintf(f, " opt.hw_vs.kill_outputs = 0x%"PRIx64"\n", key->opt.hw_vs.kill_outputs);
|
||||||
fprintf(f, " opt.hw_vs.kill_outputs2 = 0x%x\n", key->opt.hw_vs.kill_outputs2);
|
|
||||||
fprintf(f, " opt.hw_vs.clip_disable = %u\n", key->opt.hw_vs.clip_disable);
|
fprintf(f, " opt.hw_vs.clip_disable = %u\n", key->opt.hw_vs.clip_disable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,11 +361,9 @@ struct si_shader_selector {
|
||||||
unsigned local_size;
|
unsigned local_size;
|
||||||
|
|
||||||
uint64_t outputs_written; /* "get_unique_index" bits */
|
uint64_t outputs_written; /* "get_unique_index" bits */
|
||||||
uint32_t patch_outputs_written; /* "get_unique_index" bits */
|
uint32_t patch_outputs_written; /* "get_unique_index_patch" bits */
|
||||||
uint32_t outputs_written2; /* "get_unique_index2" bits */
|
|
||||||
|
|
||||||
uint64_t inputs_read; /* "get_unique_index" bits */
|
uint64_t inputs_read; /* "get_unique_index" bits */
|
||||||
uint32_t inputs_read2; /* "get_unique_index2" bits */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Valid shader configurations:
|
/* Valid shader configurations:
|
||||||
|
@ -505,7 +503,6 @@ struct si_shader_key {
|
||||||
struct {
|
struct {
|
||||||
struct {
|
struct {
|
||||||
uint64_t kill_outputs; /* "get_unique_index" bits */
|
uint64_t kill_outputs; /* "get_unique_index" bits */
|
||||||
uint32_t kill_outputs2; /* "get_unique_index2" bits */
|
|
||||||
unsigned clip_disable:1;
|
unsigned clip_disable:1;
|
||||||
} hw_vs; /* HW VS (it can be VS, TES, GS) */
|
} hw_vs; /* HW VS (it can be VS, TES, GS) */
|
||||||
|
|
||||||
|
@ -604,7 +601,6 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
|
||||||
void si_shader_destroy(struct si_shader *shader);
|
void si_shader_destroy(struct si_shader *shader);
|
||||||
unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned index);
|
unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned index);
|
||||||
unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
|
unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
|
||||||
unsigned si_shader_io_get_unique_index2(unsigned name, unsigned index);
|
|
||||||
int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader);
|
int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader);
|
||||||
void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
|
void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
|
||||||
struct pipe_debug_callback *debug, unsigned processor,
|
struct pipe_debug_callback *debug, unsigned processor,
|
||||||
|
|
|
@ -1231,22 +1231,17 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx,
|
||||||
|
|
||||||
/* Find out which VS outputs aren't used by the PS. */
|
/* Find out which VS outputs aren't used by the PS. */
|
||||||
uint64_t outputs_written = vs->outputs_written;
|
uint64_t outputs_written = vs->outputs_written;
|
||||||
uint32_t outputs_written2 = vs->outputs_written2;
|
|
||||||
uint64_t inputs_read = 0;
|
uint64_t inputs_read = 0;
|
||||||
uint32_t inputs_read2 = 0;
|
|
||||||
|
|
||||||
outputs_written &= ~0x3; /* ignore POSITION, PSIZE */
|
outputs_written &= ~0x3; /* ignore POSITION, PSIZE */
|
||||||
|
|
||||||
if (!ps_disabled) {
|
if (!ps_disabled) {
|
||||||
inputs_read = ps->inputs_read;
|
inputs_read = ps->inputs_read;
|
||||||
inputs_read2 = ps->inputs_read2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t linked = outputs_written & inputs_read;
|
uint64_t linked = outputs_written & inputs_read;
|
||||||
uint32_t linked2 = outputs_written2 & inputs_read2;
|
|
||||||
|
|
||||||
key->opt.hw_vs.kill_outputs = ~linked & outputs_written;
|
key->opt.hw_vs.kill_outputs = ~linked & outputs_written;
|
||||||
key->opt.hw_vs.kill_outputs2 = ~linked2 & outputs_written2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the key for the hw shader variant */
|
/* Compute the key for the hw shader variant */
|
||||||
|
@ -1846,7 +1841,7 @@ void si_init_shader_selector_async(void *job, int thread_index)
|
||||||
if (index >= SI_MAX_IO_GENERIC)
|
if (index >= SI_MAX_IO_GENERIC)
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
default:
|
||||||
id = si_shader_io_get_unique_index(name, index);
|
id = si_shader_io_get_unique_index(name, index);
|
||||||
sel->outputs_written &= ~(1ull << id);
|
sel->outputs_written &= ~(1ull << id);
|
||||||
break;
|
break;
|
||||||
|
@ -1855,9 +1850,6 @@ void si_init_shader_selector_async(void *job, int thread_index)
|
||||||
case TGSI_SEMANTIC_CLIPVERTEX:
|
case TGSI_SEMANTIC_CLIPVERTEX:
|
||||||
case TGSI_SEMANTIC_EDGEFLAG:
|
case TGSI_SEMANTIC_EDGEFLAG:
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
id = si_shader_io_get_unique_index2(name, index);
|
|
||||||
sel->outputs_written2 &= ~(1u << id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2003,18 +1995,13 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
|
||||||
if (index >= SI_MAX_IO_GENERIC)
|
if (index >= SI_MAX_IO_GENERIC)
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case TGSI_SEMANTIC_POSITION:
|
default:
|
||||||
case TGSI_SEMANTIC_PSIZE:
|
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
|
||||||
sel->outputs_written |=
|
sel->outputs_written |=
|
||||||
1llu << si_shader_io_get_unique_index(name, index);
|
1llu << si_shader_io_get_unique_index(name, index);
|
||||||
break;
|
break;
|
||||||
case TGSI_SEMANTIC_CLIPVERTEX: /* ignore these */
|
case TGSI_SEMANTIC_CLIPVERTEX: /* ignore these */
|
||||||
case TGSI_SEMANTIC_EDGEFLAG:
|
case TGSI_SEMANTIC_EDGEFLAG:
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
sel->outputs_written2 |=
|
|
||||||
1u << si_shader_io_get_unique_index2(name, index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16;
|
sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16;
|
||||||
|
@ -2037,15 +2024,12 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
|
||||||
if (index >= SI_MAX_IO_GENERIC)
|
if (index >= SI_MAX_IO_GENERIC)
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
default:
|
||||||
sel->inputs_read |=
|
sel->inputs_read |=
|
||||||
1llu << si_shader_io_get_unique_index(name, index);
|
1llu << si_shader_io_get_unique_index(name, index);
|
||||||
break;
|
break;
|
||||||
case TGSI_SEMANTIC_PCOORD: /* ignore this */
|
case TGSI_SEMANTIC_PCOORD: /* ignore this */
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
sel->inputs_read2 |=
|
|
||||||
1u << si_shader_io_get_unique_index2(name, index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue