diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/drivers/nvc0/nvc0_pc_emit.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/nvc0/nvc0_screen.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c | 11 | ||||
| -rw-r--r-- | src/gallium/drivers/nvc0/nvc0_transfer.c | 38 | 
4 files changed, 34 insertions, 19 deletions
| diff --git a/src/gallium/drivers/nvc0/nvc0_pc_emit.c b/src/gallium/drivers/nvc0/nvc0_pc_emit.c index 88a59cfb51..644b9ef61a 100644 --- a/src/gallium/drivers/nvc0/nvc0_pc_emit.c +++ b/src/gallium/drivers/nvc0/nvc0_pc_emit.c @@ -393,6 +393,8 @@ emit_tex(struct nv_pc *pc, struct nv_instruction *i)  {     int src1 = i->tex_array + i->tex_dim + i->tex_cube; +   assert(src1 < 6); +     pc->emit[0] = 0x00000086;     pc->emit[1] = 0x80000000; diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c index 68f3867fd0..88daf31d46 100644 --- a/src/gallium/drivers/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nvc0/nvc0_screen.c @@ -75,6 +75,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)        return 10;     case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:        return 13; +   case PIPE_CAP_ARRAY_TEXTURES: +      return 1;     case PIPE_CAP_TEXTURE_MIRROR_CLAMP:     case PIPE_CAP_TEXTURE_MIRROR_REPEAT:     case PIPE_CAP_TEXTURE_SWIZZLE: diff --git a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c index be1bb44931..9b5d429078 100644 --- a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c +++ b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c @@ -1198,11 +1198,6 @@ describe_texture_target(unsigned target, int *dim,        *dim = 2;        *cube = 1;        break; -      /* -   case TGSI_TEXTURE_CUBE_ARRAY: -      *dim = 2; -      *cube = *array = 1; -      break;     case TGSI_TEXTURE_1D_ARRAY:        *dim = *array = 1;        break; @@ -1210,6 +1205,7 @@ describe_texture_target(unsigned target, int *dim,        *dim = 2;        *array = 1;        break; +      /*     case TGSI_TEXTURE_SHADOW1D_ARRAY:        *dim = *array = *shadow = 1;        break; @@ -1219,7 +1215,7 @@ describe_texture_target(unsigned target, int *dim,        break;     case TGSI_TEXTURE_CUBE_ARRAY:        *dim = 2; -      *array = *cube = 1; +      *cube = *array = 1;        break;        */     default: @@ -1382,6 +1378,7 @@ emit_tex(struct bld_context *bld, uint opcode, int tic, int tsc,     nvi->tex_dim = dim;     nvi->tex_cube = cube;     nvi->tex_shadow = shadow; +   nvi->tex_array = array;     nvi->tex_live = 0;     return nvi; @@ -1402,7 +1399,7 @@ bld_tex(struct bld_context *bld, struct nv_value *dst0[4],     assert(dim + array + shadow + lodbias <= 5); -   if (!cube && insn->Instruction.Opcode == TGSI_OPCODE_TXP) +   if (!cube && !array && insn->Instruction.Opcode == TGSI_OPCODE_TXP)        load_proj_tex_coords(bld, t, dim, shadow, insn);     else {        for (c = 0; c < dim + cube + array; ++c) diff --git a/src/gallium/drivers/nvc0/nvc0_transfer.c b/src/gallium/drivers/nvc0/nvc0_transfer.c index 286b382f58..92e006cba4 100644 --- a/src/gallium/drivers/nvc0/nvc0_transfer.c +++ b/src/gallium/drivers/nvc0/nvc0_transfer.c @@ -10,7 +10,8 @@ struct nvc0_transfer {     struct pipe_transfer base;     struct nvc0_m2mf_rect rect[2];     uint32_t nblocksx; -   uint32_t nblocksy; +   uint16_t nblocksy; +   uint16_t nlayers;  };  static void @@ -242,23 +243,36 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx,     struct nvc0_miptree_level *lvl = &mt->level[level];     struct nvc0_transfer *tx;     uint32_t size; -   uint32_t w, h, d, z, layer; +   uint32_t w, h, d, z, layer, box_h, box_y;     int ret; +   tx = CALLOC_STRUCT(nvc0_transfer); +   if (!tx) +      return NULL; + +   box_y = box->y; +   box_h = box->height; +     if (mt->layout_3d) {        z = box->z;        d = u_minify(res->depth0, level);        layer = 0; +      tx->nlayers = box->depth;     } else {        z = 0;        d = 1; -      layer = box->z; +      if (res->target == PIPE_TEXTURE_1D || +          res->target == PIPE_TEXTURE_1D_ARRAY) { +         box_y = 0; +         box_h = 1; +         layer = box->y; +         tx->nlayers = box->height; +      } else { +         layer = box->z; +         tx->nlayers = box->depth; +      }     } -   tx = CALLOC_STRUCT(nvc0_transfer); -   if (!tx) -      return NULL; -     pipe_resource_reference(&tx->base.resource, res);     tx->base.level = level; @@ -266,7 +280,7 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx,     tx->base.box = *box;     tx->nblocksx = util_format_get_nblocksx(res->format, box->width); -   tx->nblocksy = util_format_get_nblocksy(res->format, box->height); +   tx->nblocksy = util_format_get_nblocksy(res->format, box_h);     tx->base.stride = tx->nblocksx * util_format_get_blocksize(res->format);     tx->base.layer_stride = tx->nblocksy * tx->base.stride; @@ -280,7 +294,7 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx,     tx->rect[0].base = lvl->offset + layer * mt->layer_stride;     tx->rect[0].tile_mode = lvl->tile_mode;     tx->rect[0].x = util_format_get_nblocksx(res->format, box->x); -   tx->rect[0].y = util_format_get_nblocksy(res->format, box->y); +   tx->rect[0].y = util_format_get_nblocksy(res->format, box_y);     tx->rect[0].z = z;     tx->rect[0].width = util_format_get_nblocksx(res->format, w);     tx->rect[0].height = util_format_get_nblocksy(res->format, h); @@ -291,7 +305,7 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx,     size = tx->base.layer_stride;     ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, -                        size * tx->base.box.depth, &tx->rect[1].bo); +                        size * tx->nlayers, &tx->rect[1].bo);     if (ret) {        FREE(tx);        return NULL; @@ -305,7 +319,7 @@ nvc0_miptree_transfer_new(struct pipe_context *pctx,     if (usage & PIPE_TRANSFER_READ) {        unsigned i; -      for (i = 0; i < box->depth; ++i) { +      for (i = 0; i < tx->nlayers; ++i) {           nvc0_m2mf_transfer_rect(pscreen, &tx->rect[1], &tx->rect[0],                                   tx->nblocksx, tx->nblocksy);           if (mt->layout_3d) @@ -331,7 +345,7 @@ nvc0_miptree_transfer_del(struct pipe_context *pctx,     unsigned i;     if (tx->base.usage & PIPE_TRANSFER_WRITE) { -      for (i = 0; i < tx->base.box.depth; ++i) { +      for (i = 0; i < tx->nlayers; ++i) {           nvc0_m2mf_transfer_rect(pscreen, &tx->rect[0], &tx->rect[1],                                   tx->nblocksx, tx->nblocksy);           if (mt->layout_3d) | 
