llvmpipe/cs: migrate to generic jit texture from pipe code.
authorDave Airlie <airlied@redhat.com>
Wed, 27 Sep 2023 05:26:47 +0000 (15:26 +1000)
committerMarge Bot <emma+marge@anholt.net>
Thu, 28 Sep 2023 00:41:04 +0000 (00:41 +0000)
This moves some cs specific bits to the generic code and uses it.

Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25416>

src/gallium/drivers/llvmpipe/lp_jit.c
src/gallium/drivers/llvmpipe/lp_state_cs.c

index 50131e8..7dcea53 100644 (file)
@@ -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 {
index 45ca968..413ab80 100644 (file)
@@ -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);
       }