lima/ppir: add lod-bias support

Signed-off-by: Arno Messiaen <arnomessiaen@gmail.com>
Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
This commit is contained in:
Arno Messiaen
2019-11-02 22:09:21 +01:00
committed by Vasily Khoruzhick
parent 2fca325ea6
commit 721d82cf06
5 changed files with 33 additions and 5 deletions

View File

@@ -126,7 +126,11 @@ static void ppir_codegen_encode_texld(ppir_node *node, void *code)
ppir_load_texture_node *ldtex = ppir_node_to_load_texture(node);
f->index = ldtex->sampler;
f->lod_bias_en = 0;
f->lod_bias_en = ldtex->lod_bias_en;
f->explicit_lod = ldtex->explicit_lod;
if (ldtex->lod_bias_en)
ppir_target_get_src_reg_index(&ldtex->lod_bias);
switch (ldtex->sampler_dim) {
case GLSL_SAMPLER_DIM_2D:

View File

@@ -111,7 +111,8 @@ typedef enum {
typedef struct __attribute__((__packed__)) {
unsigned lod_bias : 6;
unsigned index_offset : 6;
unsigned unknown_0 : 6; /* = 000000 */
unsigned unknown_0 : 5; /* = 00000 */
bool explicit_lod : 1;
bool lod_bias_en : 1;
unsigned unknown_1 : 5; /* = 00000 */
ppir_codegen_sampler_type type : 5;

View File

@@ -106,8 +106,15 @@ static void ppir_node_add_src(ppir_compiler *comp, ppir_node *node,
case ppir_op_const:
child = ppir_node_clone(node->block, child);
break;
case ppir_op_load_varying:
if ((node->op != ppir_op_load_texture)) {
case ppir_op_load_varying: {
bool is_load_coords = false;
if (node->op == ppir_op_load_texture) {
nir_tex_src *nts = (nir_tex_src *)ns;
if (nts->src_type == nir_tex_src_coord)
is_load_coords = true;
}
if (!is_load_coords) {
/* Clone varying loads for each block */
if (child->block != node->block) {
child = ppir_node_clone(node->block, child);
@@ -118,6 +125,7 @@ static void ppir_node_add_src(ppir_compiler *comp, ppir_node *node,
/* At least one successor is load_texture, promote it to load_coords
* to ensure that is has exactly one successor */
child->op = ppir_op_load_coords;
}
/* Fallthrough */
case ppir_op_load_uniform:
case ppir_op_load_coords:
@@ -444,7 +452,12 @@ static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
nir_tex_instr *instr = nir_instr_as_tex(ni);
ppir_load_texture_node *node;
if (instr->op != nir_texop_tex) {
switch (instr->op) {
case nir_texop_tex:
case nir_texop_txb:
case nir_texop_txl:
break;
default:
ppir_error("unsupported texop %d\n", instr->op);
return NULL;
}
@@ -481,6 +494,12 @@ static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
ppir_node_add_src(block->comp, &node->node, &node->src_coords, &instr->src[i].src,
u_bit_consecutive(0, instr->coord_components));
break;
case nir_tex_src_bias:
case nir_tex_src_lod:
node->lod_bias_en = true;
node->explicit_lod = (instr->src[i].src_type == nir_tex_src_lod);
ppir_node_add_src(block->comp, &node->node, &node->lod_bias, &instr->src[i].src, 1);
break;
default:
ppir_error("unsupported texture source type\n");
assert(0);

View File

@@ -273,6 +273,9 @@ typedef struct {
ppir_src src_coords; /* not to be used after lowering */
int sampler;
int sampler_dim;
bool lod_bias_en;
bool explicit_lod;
ppir_src lod_bias;
} ppir_load_texture_node;
typedef struct {

View File

@@ -104,6 +104,7 @@ lima_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_ACCELERATED:
case PIPE_CAP_UMA:
case PIPE_CAP_NATIVE_FENCE_FD:
case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
return 1;
/* Unimplemented, but for exporting OpenGL 2.0 */