From: Dave Airlie Date: Wed, 27 Sep 2023 05:26:47 +0000 (+1000) Subject: llvmpipe/cs: migrate to generic jit texture from pipe code. X-Git-Tag: upstream/23.3.3~1515 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c74f825f41039613697b1e3c3e2d6475d2b4976;p=platform%2Fupstream%2Fmesa.git llvmpipe/cs: migrate to generic jit texture from pipe code. This moves some cs specific bits to the generic code and uses it. Reviewed-by: Emma Anholt Part-of: --- diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c index 50131e8..7dcea53 100644 --- a/src/gallium/drivers/llvmpipe/lp_jit.c +++ b/src/gallium/drivers/llvmpipe/lp_jit.c @@ -444,21 +444,34 @@ lp_jit_texture_from_pipe(struct lp_jit_texture *jit, const struct pipe_sampler_v } } else { /* - * For buffers, we don't have "offset", instead adjust - * the size (stored as width) plus the base pointer. + * For tex2d_from_buf, adjust width and height with application + * values. If is_tex2d_from_buf is false (1D images), + * adjust using size value (stored as width). */ - const unsigned view_blocksize = - util_format_get_blocksize(view->format); - /* probably don't really need to fill that out */ + unsigned view_blocksize = util_format_get_blocksize(view->format); + jit->mip_offsets[0] = 0; - jit->row_stride[0] = 0; jit->img_stride[0] = 0; - /* everything specified in number of elements here. */ - jit->width = view->u.buf.size / view_blocksize; - jit->base = (uint8_t *)jit->base + view->u.buf.offset; - /* XXX Unsure if we need to sanitize parameters? */ - assert(view->u.buf.offset + view->u.buf.size <= res->width0); + /* If it's not a 2D texture view of a buffer, adjust using size. */ + if (!view->is_tex2d_from_buf) { + /* everything specified in number of elements here. */ + jit->width = view->u.buf.size / view_blocksize; + jit->row_stride[0] = 0; + + /* Adjust base pointer with offset. */ + jit->base = (uint8_t *)jit->base + view->u.buf.offset; + + /* XXX Unsure if we need to sanitize parameters? */ + assert(view->u.buf.offset + view->u.buf.size <= res->width0); + } else { + jit->width = view->u.tex2d_from_buf.width; + jit->height = view->u.tex2d_from_buf.height; + jit->row_stride[0] = view->u.tex2d_from_buf.row_stride * view_blocksize; + + jit->base = (uint8_t *)jit->base + + view->u.tex2d_from_buf.offset * view_blocksize; + } } } } else { diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c index 45ca968..413ab80 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_cs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c @@ -1459,7 +1459,6 @@ lp_csctx_set_sampler_views(struct lp_cs_context *csctx, if (view) { struct pipe_resource *res = view->texture; - struct llvmpipe_resource *lp_tex = llvmpipe_resource(res); struct lp_jit_texture *jit_tex; jit_tex = &csctx->cs.current.jit_resources.textures[i]; @@ -1468,123 +1467,7 @@ lp_csctx_set_sampler_views(struct lp_cs_context *csctx, */ pipe_resource_reference(&csctx->cs.current_tex[i], res); - if (!lp_tex->dt) { - /* regular texture - csctx array of mipmap level offsets */ - int j; - unsigned first_level = 0; - unsigned last_level = 0; - - if (llvmpipe_resource_is_texture(res)) { - first_level = view->u.tex.first_level; - last_level = view->u.tex.last_level; - assert(first_level <= last_level); - assert(last_level <= res->last_level); - jit_tex->base = lp_tex->tex_data; - } else { - jit_tex->base = lp_tex->data; - } - if (LP_PERF & PERF_TEX_MEM) { - /* use dummy tile memory */ - jit_tex->base = lp_dummy_tile; - jit_tex->width = TILE_SIZE/8; - jit_tex->height = TILE_SIZE/8; - jit_tex->depth = 1; - jit_tex->first_level = 0; - jit_tex->last_level = 0; - jit_tex->mip_offsets[0] = 0; - jit_tex->row_stride[0] = 0; - jit_tex->img_stride[0] = 0; - jit_tex->num_samples = 0; - jit_tex->sample_stride = 0; - } else { - jit_tex->width = res->width0; - jit_tex->height = res->height0; - jit_tex->depth = res->depth0; - jit_tex->first_level = first_level; - jit_tex->last_level = last_level; - jit_tex->num_samples = res->nr_samples; - jit_tex->sample_stride = 0; - - if (llvmpipe_resource_is_texture(res)) { - for (j = first_level; j <= last_level; j++) { - jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j]; - jit_tex->row_stride[j] = lp_tex->row_stride[j]; - jit_tex->img_stride[j] = lp_tex->img_stride[j]; - } - jit_tex->sample_stride = lp_tex->sample_stride; - - if (res->target == PIPE_TEXTURE_1D_ARRAY || - res->target == PIPE_TEXTURE_2D_ARRAY || - res->target == PIPE_TEXTURE_CUBE || - res->target == PIPE_TEXTURE_CUBE_ARRAY || - (res->target == PIPE_TEXTURE_3D && view->target == PIPE_TEXTURE_2D)) { - /* - * For array textures, we don't have first_layer, instead - * adjust last_layer (stored as depth) plus the mip level offsets - * (as we have mip-first layout can't just adjust base ptr). - * XXX For mip levels, could do something similar. - */ - jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; - for (j = first_level; j <= last_level; j++) { - jit_tex->mip_offsets[j] += view->u.tex.first_layer * - lp_tex->img_stride[j]; - } - if (view->target == PIPE_TEXTURE_CUBE || - view->target == PIPE_TEXTURE_CUBE_ARRAY) { - assert(jit_tex->depth % 6 == 0); - } - assert(view->u.tex.first_layer <= view->u.tex.last_layer); - if (res->target == PIPE_TEXTURE_3D) - assert(view->u.tex.last_layer < res->depth0); - else - assert(view->u.tex.last_layer < res->array_size); - } - } else { - /* - * For tex2d_from_buf, adjust width and height with application - * values. If is_tex2d_from_buf is false (1D images), - * adjust using size value (stored as width). - */ - unsigned view_blocksize = util_format_get_blocksize(view->format); - - jit_tex->mip_offsets[0] = 0; - jit_tex->img_stride[0] = 0; - - /* If it's not a 2D texture view of a buffer, adjust using size. */ - if (!view->is_tex2d_from_buf) { - /* everything specified in number of elements here. */ - jit_tex->width = view->u.buf.size / view_blocksize; - jit_tex->row_stride[0] = 0; - - /* Adjust base pointer with offset. */ - jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.offset; - - /* XXX Unsure if we need to sanitize parameters? */ - assert(view->u.buf.offset + view->u.buf.size <= res->width0); - } else { - jit_tex->width = view->u.tex2d_from_buf.width; - jit_tex->height = view->u.tex2d_from_buf.height; - jit_tex->row_stride[0] = view->u.tex2d_from_buf.row_stride * view_blocksize; - - jit_tex->base = (uint8_t *)jit_tex->base + - view->u.tex2d_from_buf.offset * view_blocksize; - } - } - } - } else { - /* display target texture/surface */ - jit_tex->base = llvmpipe_resource_map(res, 0, 0, LP_TEX_USAGE_READ); - jit_tex->row_stride[0] = lp_tex->row_stride[0]; - jit_tex->img_stride[0] = lp_tex->img_stride[0]; - jit_tex->mip_offsets[0] = 0; - jit_tex->width = res->width0; - jit_tex->height = res->height0; - jit_tex->depth = res->depth0; - jit_tex->first_level = jit_tex->last_level = 0; - jit_tex->num_samples = res->nr_samples; - jit_tex->sample_stride = 0; - assert(jit_tex->base); - } + lp_jit_texture_from_pipe(jit_tex, view); } else { pipe_resource_reference(&csctx->cs.current_tex[i], NULL); }