mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 02:20:11 +01:00
i915g: Simplify the process of texcoord mapping to TGSI semantics.
Custom index-as-semantic defines and extra bool flags at state update time are unnecessary if we just store the semantics and index that each texcoord should be. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12218>
This commit is contained in:
parent
6dd87592a6
commit
d5254601c9
4 changed files with 37 additions and 67 deletions
|
|
@ -122,10 +122,13 @@ struct i915_fragment_shader {
|
|||
ubyte constant_flags[I915_MAX_CONSTANT];
|
||||
|
||||
/**
|
||||
* The mapping between generics and hw texture coords.
|
||||
* The mapping between TGSI inputs and hw texture coords.
|
||||
* We need to share this between the vertex and fragment stages.
|
||||
**/
|
||||
int generic_mapping[I915_TEX_UNITS];
|
||||
struct {
|
||||
enum tgsi_semantic semantic;
|
||||
int index;
|
||||
} texcoords[I915_TEX_UNITS];
|
||||
};
|
||||
|
||||
struct i915_cache_context;
|
||||
|
|
|
|||
|
|
@ -39,10 +39,6 @@ struct nir_shader;
|
|||
|
||||
#define I915_PROGRAM_SIZE 192
|
||||
|
||||
/* Use those indices for pos/face routing, must be >= num of inputs */
|
||||
#define I915_SEMANTIC_POS 100
|
||||
#define I915_SEMANTIC_FACE 101
|
||||
|
||||
/**
|
||||
* Program translation state
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -108,15 +108,18 @@ i915_program_error(struct i915_fp_compile *p, const char *msg, ...)
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
get_mapping(struct i915_fragment_shader *fs, int unit)
|
||||
get_mapping(struct i915_fragment_shader *fs, enum tgsi_semantic semantic,
|
||||
int index)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < I915_TEX_UNITS; i++) {
|
||||
if (fs->generic_mapping[i] == -1) {
|
||||
fs->generic_mapping[i] = unit;
|
||||
if (fs->texcoords[i].semantic == -1) {
|
||||
fs->texcoords[i].semantic = semantic;
|
||||
fs->texcoords[i].index = index;
|
||||
return i;
|
||||
}
|
||||
if (fs->generic_mapping[i] == unit)
|
||||
if (fs->texcoords[i].semantic == semantic &&
|
||||
fs->texcoords[i].index == index)
|
||||
return i;
|
||||
}
|
||||
debug_printf("Exceeded max generics\n");
|
||||
|
|
@ -158,9 +161,9 @@ src_vector(struct i915_fp_compile *p,
|
|||
sem_ind = p->shader->info.input_semantic_index[index];
|
||||
|
||||
switch (sem_name) {
|
||||
case TGSI_SEMANTIC_GENERIC:
|
||||
case TGSI_SEMANTIC_POSITION: {
|
||||
/* for fragcoord */
|
||||
int real_tex_unit = get_mapping(fs, I915_SEMANTIC_POS);
|
||||
int real_tex_unit = get_mapping(fs, sem_name, sem_ind);
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit,
|
||||
D0_CHANNEL_ALL);
|
||||
break;
|
||||
|
|
@ -179,15 +182,9 @@ src_vector(struct i915_fp_compile *p,
|
|||
src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W);
|
||||
src = swizzle(src, W, W, W, W);
|
||||
break;
|
||||
case TGSI_SEMANTIC_GENERIC: {
|
||||
int real_tex_unit = get_mapping(fs, sem_ind);
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit,
|
||||
D0_CHANNEL_ALL);
|
||||
break;
|
||||
}
|
||||
case TGSI_SEMANTIC_FACE: {
|
||||
/* for back/front faces */
|
||||
int real_tex_unit = get_mapping(fs, I915_SEMANTIC_FACE);
|
||||
int real_tex_unit = get_mapping(fs, sem_name, sem_ind);
|
||||
src =
|
||||
i915_emit_decl(p, REG_TYPE_T, T_TEX0 + real_tex_unit, D0_CHANNEL_X);
|
||||
break;
|
||||
|
|
@ -875,7 +872,7 @@ i915_init_compile(struct i915_context *i915, struct i915_fragment_shader *ifs)
|
|||
memset(&p->register_phases, 0, sizeof(p->register_phases));
|
||||
|
||||
for (i = 0; i < I915_TEX_UNITS; i++)
|
||||
ifs->generic_mapping[i] = -1;
|
||||
ifs->texcoords[i].semantic = -1;
|
||||
|
||||
p->log_program_errors = !i915->no_log_program_errors;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include "draw/draw_context.h"
|
||||
#include "draw/draw_vertex.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
#include "util/log.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "i915_context.h"
|
||||
#include "i915_debug.h"
|
||||
|
|
@ -35,17 +36,6 @@
|
|||
#include "i915_reg.h"
|
||||
#include "i915_state.h"
|
||||
|
||||
static uint32_t
|
||||
find_mapping(const struct i915_fragment_shader *fs, int unit)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < I915_TEX_UNITS; i++) {
|
||||
if (fs->generic_mapping[i] == unit)
|
||||
return i;
|
||||
}
|
||||
debug_printf("Mapping not found\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Determine the hardware vertex layout.
|
||||
|
|
@ -56,11 +46,10 @@ calculate_vertex_layout(struct i915_context *i915)
|
|||
{
|
||||
const struct i915_fragment_shader *fs = i915->fs;
|
||||
struct vertex_info vinfo;
|
||||
bool texCoords[I915_TEX_UNITS], colors[2], fog, needW, face;
|
||||
bool colors[2], fog, needW, face;
|
||||
uint32_t i;
|
||||
int src;
|
||||
|
||||
memset(texCoords, 0, sizeof(texCoords));
|
||||
colors[0] = colors[1] = fog = needW = face = false;
|
||||
memset(&vinfo, 0, sizeof(vinfo));
|
||||
|
||||
|
|
@ -69,27 +58,21 @@ calculate_vertex_layout(struct i915_context *i915)
|
|||
*/
|
||||
for (i = 0; i < fs->info.num_inputs; i++) {
|
||||
switch (fs->info.input_semantic_name[i]) {
|
||||
case TGSI_SEMANTIC_POSITION: {
|
||||
uint32_t unit = I915_SEMANTIC_POS;
|
||||
texCoords[find_mapping(fs, unit)] = true;
|
||||
} break;
|
||||
case TGSI_SEMANTIC_POSITION:
|
||||
case TGSI_SEMANTIC_FACE:
|
||||
/* Handled as texcoord inputs below */
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR:
|
||||
assert(fs->info.input_semantic_index[i] < 2);
|
||||
colors[fs->info.input_semantic_index[i]] = true;
|
||||
break;
|
||||
case TGSI_SEMANTIC_GENERIC: {
|
||||
case TGSI_SEMANTIC_GENERIC:
|
||||
/* texcoords/varyings/other generic */
|
||||
uint32_t unit = fs->info.input_semantic_index[i];
|
||||
|
||||
texCoords[find_mapping(fs, unit)] = true;
|
||||
needW = true;
|
||||
} break;
|
||||
break;
|
||||
case TGSI_SEMANTIC_FOG:
|
||||
fog = true;
|
||||
break;
|
||||
case TGSI_SEMANTIC_FACE:
|
||||
face = true;
|
||||
break;
|
||||
default:
|
||||
debug_printf("Unknown input type %d\n",
|
||||
fs->info.input_semantic_name[i]);
|
||||
|
|
@ -142,36 +125,27 @@ calculate_vertex_layout(struct i915_context *i915)
|
|||
/* texcoords/varyings */
|
||||
for (i = 0; i < I915_TEX_UNITS; i++) {
|
||||
uint32_t hwtc;
|
||||
if (texCoords[i]) {
|
||||
hwtc = TEXCOORDFMT_4D;
|
||||
if (fs->generic_mapping[i] == I915_SEMANTIC_POS) {
|
||||
src =
|
||||
draw_find_shader_output(i915->draw, TGSI_SEMANTIC_POSITION, 0);
|
||||
if (fs->texcoords[i].semantic != -1) {
|
||||
src = draw_find_shader_output(i915->draw, fs->texcoords[i].semantic,
|
||||
fs->texcoords[i].index);
|
||||
if (fs->texcoords[i].semantic == TGSI_SEMANTIC_FACE) {
|
||||
/* XXX Because of limitations in the draw module, currently src will
|
||||
* be 0 for SEMANTIC_FACE, so this aliases to POS. We need to fix in
|
||||
* the draw module by adding an extra shader output.
|
||||
*/
|
||||
mesa_loge("Front/back face is broken\n");
|
||||
draw_emit_vertex_attr(&vinfo, EMIT_1F, src);
|
||||
hwtc = TEXCOORDFMT_1D;
|
||||
} else {
|
||||
src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_GENERIC,
|
||||
fs->generic_mapping[i]);
|
||||
hwtc = TEXCOORDFMT_4D;
|
||||
draw_emit_vertex_attr(&vinfo, EMIT_4F, src);
|
||||
}
|
||||
draw_emit_vertex_attr(&vinfo, EMIT_4F, src);
|
||||
} else {
|
||||
hwtc = TEXCOORDFMT_NOT_PRESENT;
|
||||
}
|
||||
vinfo.hwfmt[1] |= hwtc << (i * 4);
|
||||
}
|
||||
|
||||
/* front/back face */
|
||||
if (face) {
|
||||
uint32_t slot = find_mapping(fs, I915_SEMANTIC_FACE);
|
||||
debug_printf("Front/back face is broken\n");
|
||||
/* XXX Because of limitations in the draw module, currently src will be 0
|
||||
* for SEMANTIC_FACE, so this aliases to POS. We need to fix in the draw
|
||||
* module by adding an extra shader output.
|
||||
*/
|
||||
src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_FACE, 0);
|
||||
draw_emit_vertex_attr(&vinfo, EMIT_1F, src);
|
||||
vinfo.hwfmt[1] &= ~(TEXCOORDFMT_NOT_PRESENT << (slot * 4));
|
||||
vinfo.hwfmt[1] |= TEXCOORDFMT_1D << (slot * 4);
|
||||
}
|
||||
|
||||
draw_compute_vertex_size(&vinfo);
|
||||
|
||||
if (memcmp(&i915->current.vertex_info, &vinfo, sizeof(vinfo))) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue