diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_resource.c | 24 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_resource.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_texture.c | 27 |
3 files changed, 28 insertions, 26 deletions
diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 4608ad0361c..b252be1ba33 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -147,3 +147,27 @@ void virgl_resource_layout(struct pipe_resource *pt, else /* don't create guest backing store for MSAA */ metadata->total_size = 0; } + +unsigned virgl_resource_offset(struct pipe_resource *pres, + struct virgl_resource_metadata *metadata, + unsigned level, unsigned layer) +{ + const unsigned hgt = u_minify(pres->height0, level); + const unsigned nblocksy = util_format_get_nblocksy(pres->format, hgt); + unsigned offset = metadata->level_offset[level]; + + if (pres->target == PIPE_TEXTURE_CUBE || + pres->target == PIPE_TEXTURE_CUBE_ARRAY || + pres->target == PIPE_TEXTURE_3D || + pres->target == PIPE_TEXTURE_2D_ARRAY) { + offset += layer * nblocksy * metadata->stride[level]; + } + else if (pres->target == PIPE_TEXTURE_1D_ARRAY) { + offset += layer * metadata->stride[level]; + } + else { + assert(layer == 0); + } + + return offset; +} diff --git a/src/gallium/drivers/virgl/virgl_resource.h b/src/gallium/drivers/virgl/virgl_resource.h index df534652518..1a43e5ddc5d 100644 --- a/src/gallium/drivers/virgl/virgl_resource.h +++ b/src/gallium/drivers/virgl/virgl_resource.h @@ -154,4 +154,7 @@ bool virgl_res_needs_readback(struct virgl_context *vctx, void virgl_resource_layout(struct pipe_resource *pt, struct virgl_resource_metadata *metadata); +unsigned virgl_resource_offset(struct pipe_resource *pres, + struct virgl_resource_metadata *metadata, + unsigned level, unsigned layer); #endif diff --git a/src/gallium/drivers/virgl/virgl_texture.c b/src/gallium/drivers/virgl/virgl_texture.c index 7eba476ff3a..c9d8e541f7d 100644 --- a/src/gallium/drivers/virgl/virgl_texture.c +++ b/src/gallium/drivers/virgl/virgl_texture.c @@ -94,31 +94,6 @@ static void virgl_init_temp_resource_from_box(struct pipe_resource *res, } } -static unsigned -vrend_get_tex_image_offset(const struct virgl_texture *res, - unsigned level, unsigned layer) -{ - const struct pipe_resource *pres = &res->base.u.b; - const unsigned hgt = u_minify(pres->height0, level); - const unsigned nblocksy = util_format_get_nblocksy(pres->format, hgt); - unsigned offset = res->metadata.level_offset[level]; - - if (pres->target == PIPE_TEXTURE_CUBE || - pres->target == PIPE_TEXTURE_CUBE_ARRAY || - pres->target == PIPE_TEXTURE_3D || - pres->target == PIPE_TEXTURE_2D_ARRAY) { - offset += layer * nblocksy * res->metadata.stride[level]; - } - else if (pres->target == PIPE_TEXTURE_1D_ARRAY) { - offset += layer * res->metadata.stride[level]; - } - else { - assert(layer == 0); - } - - return offset; -} - static void *virgl_texture_transfer_map(struct pipe_context *ctx, struct pipe_resource *resource, unsigned level, @@ -179,7 +154,7 @@ static void *virgl_texture_transfer_map(struct pipe_context *ctx, trans->base.stride = ((struct virgl_texture*)trans->resolve_tmp)->metadata.stride[level]; trans->base.layer_stride = trans->base.stride * nblocksy; } else { - offset = vrend_get_tex_image_offset(vtex, level, box->z); + offset = virgl_resource_offset(&vtex->base.u.b, &vtex->metadata, level, box->z); offset += box->y / util_format_get_blockheight(format) * trans->base.stride + box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); |