summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi.h2
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c60
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c110
3 files changed, 87 insertions, 85 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
index 3446a8fd46d..dac97c35a9d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
@@ -374,6 +374,8 @@ struct lp_build_tgsi_soa_context
const struct lp_build_sampler_soa *sampler;
+ struct tgsi_declaration_sampler_view sv[PIPE_MAX_SHADER_SAMPLER_VIEWS];
+
LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][TGSI_NUM_CHANNELS];
LLVMValueRef temps[LP_MAX_TGSI_TEMPS][TGSI_NUM_CHANNELS];
LLVMValueRef addr[LP_MAX_TGSI_ADDRS][TGSI_NUM_CHANNELS];
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
index 3a19fe2a64f..a4caf788ec7 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
@@ -188,7 +188,8 @@ analyse_tex(struct analysis_context *ctx,
static void
analyse_sample(struct analysis_context *ctx,
const struct tgsi_full_instruction *inst,
- enum lp_build_tex_modifier modifier)
+ enum lp_build_tex_modifier modifier,
+ boolean shadow)
{
struct lp_tgsi_info *info = ctx->info;
unsigned chan;
@@ -197,45 +198,14 @@ analyse_sample(struct analysis_context *ctx,
struct lp_tgsi_texture_info *tex_info = &info->tex[info->num_texs];
boolean indirect = FALSE;
boolean shadow = FALSE;
- unsigned readmask = 0;
+ unsigned readmask;
- tex_info->target = inst->Texture.Texture;
- switch (inst->Texture.Texture) {
- case TGSI_TEXTURE_SHADOW1D:
- shadow = TRUE;
- /* Fallthrough */
- case TGSI_TEXTURE_1D:
- readmask = TGSI_WRITEMASK_X;
- break;
- case TGSI_TEXTURE_SHADOW1D_ARRAY:
- case TGSI_TEXTURE_SHADOW2D:
- case TGSI_TEXTURE_SHADOWRECT:
- shadow = TRUE;
- /* Fallthrough */
- case TGSI_TEXTURE_1D_ARRAY:
- case TGSI_TEXTURE_2D:
- case TGSI_TEXTURE_RECT:
- readmask = TGSI_WRITEMASK_XY;
- break;
- case TGSI_TEXTURE_SHADOW2D_ARRAY:
- case TGSI_TEXTURE_SHADOWCUBE:
- shadow = TRUE;
- /* Fallthrough */
- case TGSI_TEXTURE_2D_ARRAY:
- case TGSI_TEXTURE_3D:
- case TGSI_TEXTURE_CUBE:
- readmask = TGSI_WRITEMASK_XYZ;
- break;
- case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
- shadow = TRUE;
- /* Fallthrough */
- case TGSI_TEXTURE_CUBE_ARRAY:
- readmask = TGSI_WRITEMASK_XYZW;
- break;
- default:
- assert(0);
- return;
- }
+ /*
+ * We don't really get much information here, in particular not
+ * the target info, hence no useful writemask neither. Maybe should just
+ * forget the whole function.
+ */
+ readmask = TGSI_WRITEMASK_XYZW;
tex_info->texture_unit = inst->Src[1].Register.Index;
tex_info->sampler_unit = inst->Src[2].Register.Index;
@@ -327,20 +297,22 @@ analyse_instruction(struct analysis_context *ctx,
analyse_tex(ctx, inst, LP_BLD_TEX_MODIFIER_PROJECTED);
break;
case TGSI_OPCODE_SAMPLE:
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_NONE, FALSE);
+ break;
case TGSI_OPCODE_SAMPLE_C:
- analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_NONE);
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_NONE, TRUE);
break;
case TGSI_OPCODE_SAMPLE_C_LZ:
- analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LOD_ZERO);
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LOD_ZERO, TRUE);
break;
case TGSI_OPCODE_SAMPLE_D:
- analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV);
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV, FALSE);
break;
case TGSI_OPCODE_SAMPLE_B:
- analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LOD_BIAS);
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LOD_BIAS, FALSE);
break;
case TGSI_OPCODE_SAMPLE_L:
- analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD);
+ analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD, FALSE);
break;
default:
break;
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 808e8168824..ae4a57731ee 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -1343,6 +1343,7 @@ static void
emit_sample(struct lp_build_tgsi_soa_context *bld,
const struct tgsi_full_instruction *inst,
enum lp_build_tex_modifier modifier,
+ boolean compare,
LLVMValueRef *texel)
{
LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
@@ -1354,7 +1355,6 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
struct lp_derivatives derivs;
unsigned num_coords, dims;
unsigned i;
- boolean compare = FALSE;
if (!bld->sampler) {
_debug_printf("warning: found texture instruction but no sampler generator supplied\n");
@@ -1364,37 +1364,35 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
return;
}
+ /*
+ * unlike old-style tex opcodes the texture/sampler indices
+ * always come from src1 and src2 respectively.
+ */
+ texture_unit = inst->Src[1].Register.Index;
+ sampler_unit = inst->Src[2].Register.Index;
+
derivs.ddx_ddy[0] = bld->bld_base.base.undef;
derivs.ddx_ddy[1] = bld->bld_base.base.undef;
- switch (inst->Texture.Texture) {
- case TGSI_TEXTURE_SHADOW1D:
- compare = TRUE;
- /* Fallthrough */
+ /*
+ * Note inst->Texture.Texture will contain the number of offsets,
+ * however the target information is NOT there and comes from the
+ * declared sampler views instead.
+ */
+ switch (bld->sv[texture_unit].Resource) {
case TGSI_TEXTURE_1D:
num_coords = 1;
dims = 1;
break;
- case TGSI_TEXTURE_SHADOW1D_ARRAY:
- compare = TRUE;
- /* Fallthrough */
case TGSI_TEXTURE_1D_ARRAY:
num_coords = 2;
dims = 1;
break;
- case TGSI_TEXTURE_SHADOW2D:
- case TGSI_TEXTURE_SHADOWRECT:
- compare = TRUE;
- /* Fallthrough */
case TGSI_TEXTURE_2D:
case TGSI_TEXTURE_RECT:
num_coords = 2;
dims = 2;
break;
- case TGSI_TEXTURE_SHADOW2D_ARRAY:
- case TGSI_TEXTURE_SHADOWCUBE:
- compare = TRUE;
- /* Fallthrough */
case TGSI_TEXTURE_2D_ARRAY:
case TGSI_TEXTURE_CUBE:
num_coords = 3;
@@ -1404,9 +1402,6 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
num_coords = 3;
dims = 3;
break;
- case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
- compare = TRUE;
- /* Fallthrough */
case TGSI_TEXTURE_CUBE_ARRAY:
num_coords = 4;
dims = 3;
@@ -1533,11 +1528,12 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
}
static void
-emit_txf( struct lp_build_tgsi_soa_context *bld,
- const struct tgsi_full_instruction *inst,
- LLVMValueRef *texel)
+emit_fetch_texels( struct lp_build_tgsi_soa_context *bld,
+ const struct tgsi_full_instruction *inst,
+ LLVMValueRef *texel,
+ boolean is_samplei)
{
- unsigned unit;
+ unsigned unit, target;
LLVMValueRef coord_undef = LLVMGetUndef(bld->bld_base.base.int_vec_type);
LLVMValueRef explicit_lod = NULL;
LLVMValueRef coords[3];
@@ -1555,10 +1551,19 @@ emit_txf( struct lp_build_tgsi_soa_context *bld,
return;
}
+ unit = inst->Src[1].Register.Index;
+
derivs.ddx_ddy[0] = coord_undef;
derivs.ddx_ddy[1] = coord_undef;
- switch (inst->Texture.Texture) {
+ if (is_samplei) {
+ target = bld->sv[unit].Resource;
+ }
+ else {
+ target = inst->Texture.Texture;
+ }
+
+ switch (target) {
case TGSI_TEXTURE_1D:
case TGSI_TEXTURE_BUFFER:
num_coords = 1;
@@ -1587,7 +1592,7 @@ emit_txf( struct lp_build_tgsi_soa_context *bld,
}
/* always have lod except for buffers ? */
- if (inst->Texture.Texture != TGSI_TEXTURE_BUFFER) {
+ if (target != TGSI_TEXTURE_BUFFER) {
explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 );
}
@@ -1598,8 +1603,6 @@ emit_txf( struct lp_build_tgsi_soa_context *bld,
coords[i] = coord_undef;
}
- unit = inst->Src[1].Register.Index;
-
if (inst->Texture.NumOffsets == 1) {
unsigned dim;
for (dim = 0; dim < dims; dim++) {
@@ -1628,8 +1631,16 @@ emit_size_query( struct lp_build_tgsi_soa_context *bld,
LLVMValueRef explicit_lod;
unsigned has_lod;
unsigned i;
+ unsigned unit = inst->Src[1].Register.Index;
+ unsigned target;
- switch (inst->Texture.Texture) {
+ if (is_sviewinfo) {
+ target = bld->sv[unit].Resource;
+ }
+ else {
+ target = inst->Texture.Texture;
+ }
+ switch (target) {
case TGSI_TEXTURE_BUFFER:
case TGSI_TEXTURE_RECT:
case TGSI_TEXTURE_SHADOWRECT:
@@ -1655,7 +1666,7 @@ emit_size_query( struct lp_build_tgsi_soa_context *bld,
bld->sampler->emit_size_query(bld->sampler,
bld->bld_base.base.gallivm,
bld->bld_base.int_bld.type,
- inst->Src[1].Register.Index,
+ unit,
is_sviewinfo,
explicit_lod,
sizes_out);
@@ -1881,6 +1892,15 @@ lp_emit_declaration_soa(
"predicate");
break;
+ case TGSI_FILE_SAMPLER_VIEW:
+ /*
+ * The target stored here MUST match whatever there actually
+ * is in the set sampler views (what about return type?).
+ */
+ assert(idx < PIPE_MAX_SHADER_SAMPLER_VIEWS);
+ bld->sv[idx] = decl->SamplerView;
+ break;
+
default:
/* don't need to declare other vars */
break;
@@ -2055,7 +2075,18 @@ txf_emit(
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
- emit_txf(bld, emit_data->inst, emit_data->output);
+ emit_fetch_texels(bld, emit_data->inst, emit_data->output, FALSE);
+}
+
+static void
+sample_i_emit(
+ const struct lp_build_tgsi_action * action,
+ struct lp_build_tgsi_context * bld_base,
+ struct lp_build_emit_data * emit_data)
+{
+ struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
+
+ emit_fetch_texels(bld, emit_data->inst, emit_data->output, TRUE);
}
static void
@@ -2067,7 +2098,7 @@ sample_emit(
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE,
- emit_data->output);
+ FALSE, emit_data->output);
}
static void
@@ -2079,7 +2110,7 @@ sample_b_emit(
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_BIAS,
- emit_data->output);
+ FALSE, emit_data->output);
}
static void
@@ -2089,12 +2120,9 @@ sample_c_emit(
struct lp_build_emit_data * emit_data)
{
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
- /*
- * note that we can ignore this is a comparison instruction here
- * since it should be encoded elsewhere (SHADOW target).
- */
+
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE,
- emit_data->output);
+ TRUE, emit_data->output);
}
static void
@@ -2106,7 +2134,7 @@ sample_c_lz_emit(
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_ZERO,
- emit_data->output);
+ TRUE, emit_data->output);
}
static void
@@ -2118,7 +2146,7 @@ sample_d_emit(
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV,
- emit_data->output);
+ FALSE, emit_data->output);
}
static void
@@ -2130,7 +2158,7 @@ sample_l_emit(
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD,
- emit_data->output);
+ FALSE, emit_data->output);
}
static void
@@ -2522,7 +2550,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_C].emit = sample_c_emit;
bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_C_LZ].emit = sample_c_lz_emit;
bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_D].emit = sample_d_emit;
- bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_I].emit = txf_emit;
+ bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_I].emit = sample_i_emit;
bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_L].emit = sample_l_emit;
bld.bld_base.op_actions[TGSI_OPCODE_SVIEWINFO].emit = sviewinfo_emit;