freedreno/ir3: lower TXP as needed
authorRob Clark <robclark@freedesktop.org>
Sat, 6 Dec 2014 20:24:23 +0000 (15:24 -0500)
committerRob Clark <robclark@freedesktop.org>
Tue, 9 Dec 2014 23:03:01 +0000 (18:03 -0500)
On a3xx, lower TXP for 3D textures, on a4xx lower all TXP.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/ir3/ir3_compiler.c
src/gallium/drivers/freedreno/ir3/ir3_shader.c
src/gallium/drivers/freedreno/ir3/ir3_shader.h

index 6cc21acaf3f2f2476d608f382c703616e0b41c2c..ade4b1cdc56d3c28f7e45f51eb38bdc408ff3223 100644 (file)
@@ -170,6 +170,14 @@ compile_init(struct ir3_compile_context *ctx, struct ir3_shader_variant *so,
                break;
        }
 
+       if (ir3_shader_gpuid(so->shader) >= 400) {
+               /* a4xx seems to have *no* sam.p */
+               lconfig.lower_TXP = ~0;  /* lower all txp */
+       } else {
+               /* a3xx just needs to avoid sam.p for 3d tex */
+               lconfig.lower_TXP = (1 << TGSI_TEXTURE_3D);
+       }
+
        ctx->tokens = tgsi_transform_lowering(&lconfig, tokens, &ctx->info);
        ctx->free_tokens = !!ctx->tokens;
        if (!ctx->tokens) {
index 0c74f2f26f27171a2c78a9815be2c7f88160dc4c..c21d0a2d5764000c1a2bfdd2d6ae765b11c58cc1 100644 (file)
@@ -54,9 +54,10 @@ static void
 assemble_variant(struct ir3_shader_variant *v)
 {
        struct fd_context *ctx = fd_context(v->shader->pctx);
+       uint32_t gpu_id = ir3_shader_gpuid(v->shader);
        uint32_t sz, *bin;
 
-       bin = ir3_assemble(v->ir, &v->info, ctx->screen->gpu_id);
+       bin = ir3_assemble(v->ir, &v->info, gpu_id);
        sz = v->info.sizedwords * 4;
 
        v->bo = fd_bo_new(ctx->dev, sz,
@@ -67,7 +68,7 @@ assemble_variant(struct ir3_shader_variant *v)
 
        free(bin);
 
-       if (ctx->screen->gpu_id >= 400) {
+       if (gpu_id >= 400) {
                v->instrlen = v->info.sizedwords / (2 * 16);
        } else {
                v->instrlen = v->info.sizedwords / (2 * 4);
@@ -177,6 +178,13 @@ fail:
        return NULL;
 }
 
+uint32_t
+ir3_shader_gpuid(struct ir3_shader *shader)
+{
+       struct fd_context *ctx = fd_context(shader->pctx);
+       return ctx->screen->gpu_id;
+}
+
 struct ir3_shader_variant *
 ir3_shader_variant(struct ir3_shader *shader, struct ir3_shader_key key)
 {
index 89442cec1286c402309c44a1a198266b653456b5..fcd589534a2e9324bbc50819572b98f204d31fba 100644 (file)
@@ -214,7 +214,7 @@ struct ir3_shader {
 struct ir3_shader * ir3_shader_create(struct pipe_context *pctx,
                const struct tgsi_token *tokens, enum shader_t type);
 void ir3_shader_destroy(struct ir3_shader *shader);
-
+uint32_t ir3_shader_gpuid(struct ir3_shader *shader);
 struct ir3_shader_variant * ir3_shader_variant(struct ir3_shader *shader,
                struct ir3_shader_key key);