Browse Source

pan/midgard: Implement shadow cubemaps

We need to reshuffle to sync up the shadow coordinate temporary with the
cubemap coordinate temporary. Once that's in place, it's simple enough
(we load the shadow coordinate into .z like 2D).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
master
Alyssa Rosenzweig 6 years ago
parent
commit
6b7243f28f
1 changed files with 22 additions and 26 deletions
  1. 22
    26
      src/panfrost/midgard/midgard_compile.c

+ 22
- 26
src/panfrost/midgard/midgard_compile.c View File



bool needs_temp_coord = bool needs_temp_coord =
(midgard_texop == TEXTURE_OP_TEXEL_FETCH) || (midgard_texop == TEXTURE_OP_TEXEL_FETCH) ||
(instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) ||
(instr->is_shadow); (instr->is_shadow);


unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0; unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0;


unsigned coord_mask = mask_of(instr->coord_components); unsigned coord_mask = mask_of(instr->coord_components);


if (needs_temp_coord) {
if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
/* texelFetch is undefined on samplerCube */
assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH);

/* For cubemaps, we use a special ld/st op to
* select the face and copy the xy into the
* texture register */

midgard_instruction ld = m_ld_cubemap_coords(coords, 0);
ld.src[1] = index;
ld.mask = 0x3; /* xy */
ld.load_store.arg_1 = 0x20;
ld.swizzle[1][3] = COMPONENT_X;
emit_mir_instruction(ctx, ld);

/* xyzw -> xyxx */
ins.swizzle[1][2] = instr->is_shadow ? COMPONENT_Z : COMPONENT_X;
ins.swizzle[1][3] = COMPONENT_X;
} else if (needs_temp_coord) {
/* mov coord_temp, coords */ /* mov coord_temp, coords */
midgard_instruction mov = v_mov(index, coords); midgard_instruction mov = v_mov(index, coords);
mov.mask = coord_mask; mov.mask = coord_mask;
coords = index; coords = index;
} }


ins.src[1] = coords;

/* Texelfetch coordinates uses all four elements /* Texelfetch coordinates uses all four elements
* (xyz/index) regardless of texture dimensionality, * (xyz/index) regardless of texture dimensionality,
* which means it's necessary to zero the unused * which means it's necessary to zero the unused
emit_mir_instruction(ctx, mov); emit_mir_instruction(ctx, mov);
} }


if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
/* texelFetch is undefined on samplerCube */
assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH);

/* For cubemaps, we use a special ld/st op to
* select the face and copy the xy into the
* texture register */

unsigned temp = make_compiler_temp(ctx);
midgard_instruction ld = m_ld_cubemap_coords(temp, 0);
ld.src[1] = coords;
ld.mask = 0x3; /* xy */
ld.load_store.arg_1 = 0x20;
ld.swizzle[1][3] = COMPONENT_X;
emit_mir_instruction(ctx, ld);

ins.src[1] = temp;
/* xyzw -> xyxx */
ins.swizzle[1][2] = COMPONENT_X;
ins.swizzle[1][3] = COMPONENT_X;
} else {
ins.src[1] = coords;
}

if (instr->sampler_dim == GLSL_SAMPLER_DIM_2D) { if (instr->sampler_dim == GLSL_SAMPLER_DIM_2D) {
/* Array component in w but NIR wants it in z */ /* Array component in w but NIR wants it in z */
if (nr_components == 3) { if (nr_components == 3) {
}; };


case nir_tex_src_comparator: { case nir_tex_src_comparator: {
/* TODO: generalize */
unsigned comp = COMPONENT_Z; unsigned comp = COMPONENT_Z;


/* mov coord_temp.foo, coords */ /* mov coord_temp.foo, coords */

Loading…
Cancel
Save