summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_pbo.c
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2020-12-14 11:48:39 -0500
committerDylan Baker <dylan.c.baker@intel.com>2020-12-29 21:06:56 -0800
commite8a6bf6e1032ea62082ca303446f46a47ae3604c (patch)
tree553bf2fd40542ccf976d9f7c50850f988983f3be /src/mesa/state_tracker/st_pbo.c
parentf892a46cc5481edc14c2e4bf3f18e20f74545123 (diff)
st/pbo: fix pbo uploads without PIPE_CAP_TGSI_VS_LAYER_VIEWPORT and skip gs
the previous commit handling this forced geometry shader usage for all cases, but this is not ideal, so instead there are now fragment shader variants for both depth==1 and depth!=1, corresponding to the existence of gl_Layer in the shader Fixes: 614c77772ac ("st/pbo: fix pbo uploads without PIPE_CAP_TGSI_VS_LAYER_VIEWPORT") Acked-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8089> (cherry picked from commit 36097fc7ef70471ecfecd428f990233276e9c45b)
Diffstat (limited to 'src/mesa/state_tracker/st_pbo.c')
-rw-r--r--src/mesa/state_tracker/st_pbo.c49
1 files changed, 28 insertions, 21 deletions
diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
index e4464bd8438..65a1ce8862a 100644
--- a/src/mesa/state_tracker/st_pbo.c
+++ b/src/mesa/state_tracker/st_pbo.c
@@ -202,7 +202,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr,
return false;
}
- if (st->pbo.use_gs && !st->pbo.gs) {
+ if (addr->depth != 1 && st->pbo.use_gs && !st->pbo.gs) {
st->pbo.gs = st_pbo_create_gs(st);
if (!st->pbo.gs)
return false;
@@ -403,7 +403,8 @@ sampler_type_for_target(enum pipe_texture_target target)
static void *
create_fs(struct st_context *st, bool download,
enum pipe_texture_target target,
- enum st_pbo_conversion conversion)
+ enum st_pbo_conversion conversion,
+ bool need_layer)
{
struct pipe_screen *screen = st->pipe->screen;
struct nir_builder b;
@@ -430,11 +431,11 @@ create_fs(struct st_context *st, bool download,
nir_ssa_def *coord = nir_load_var(&b, fragcoord);
nir_ssa_def *layer = NULL;
- if (st->pbo.layers && (!download || target == PIPE_TEXTURE_1D_ARRAY ||
- target == PIPE_TEXTURE_2D_ARRAY ||
- target == PIPE_TEXTURE_3D ||
- target == PIPE_TEXTURE_CUBE ||
- target == PIPE_TEXTURE_CUBE_ARRAY)) {
+ if (st->pbo.layers && need_layer && (!download || target == PIPE_TEXTURE_1D_ARRAY ||
+ target == PIPE_TEXTURE_2D_ARRAY ||
+ target == PIPE_TEXTURE_3D ||
+ target == PIPE_TEXTURE_CUBE ||
+ target == PIPE_TEXTURE_CUBE_ARRAY)) {
nir_variable *var = nir_variable_create(b.shader, nir_var_shader_in,
glsl_int_type(), "gl_Layer");
var->data.location = VARYING_SLOT_LAYER;
@@ -563,32 +564,34 @@ get_pbo_conversion(enum pipe_format src_format, enum pipe_format dst_format)
void *
st_pbo_get_upload_fs(struct st_context *st,
enum pipe_format src_format,
- enum pipe_format dst_format)
+ enum pipe_format dst_format,
+ bool need_layer)
{
STATIC_ASSERT(ARRAY_SIZE(st->pbo.upload_fs) == ST_NUM_PBO_CONVERSIONS);
enum st_pbo_conversion conversion = get_pbo_conversion(src_format, dst_format);
- if (!st->pbo.upload_fs[conversion])
- st->pbo.upload_fs[conversion] = create_fs(st, false, 0, conversion);
+ if (!st->pbo.upload_fs[conversion][need_layer])
+ st->pbo.upload_fs[conversion][need_layer] = create_fs(st, false, 0, conversion, need_layer);
- return st->pbo.upload_fs[conversion];
+ return st->pbo.upload_fs[conversion][need_layer];
}
void *
st_pbo_get_download_fs(struct st_context *st, enum pipe_texture_target target,
enum pipe_format src_format,
- enum pipe_format dst_format)
+ enum pipe_format dst_format,
+ bool need_layer)
{
STATIC_ASSERT(ARRAY_SIZE(st->pbo.download_fs) == ST_NUM_PBO_CONVERSIONS);
assert(target < PIPE_MAX_TEXTURE_TYPES);
enum st_pbo_conversion conversion = get_pbo_conversion(src_format, dst_format);
- if (!st->pbo.download_fs[conversion][target])
- st->pbo.download_fs[conversion][target] = create_fs(st, true, target, conversion);
+ if (!st->pbo.download_fs[conversion][target][need_layer])
+ st->pbo.download_fs[conversion][target][need_layer] = create_fs(st, true, target, conversion, need_layer);
- return st->pbo.download_fs[conversion][target];
+ return st->pbo.download_fs[conversion][target][need_layer];
}
void
@@ -638,17 +641,21 @@ st_destroy_pbo_helpers(struct st_context *st)
unsigned i;
for (i = 0; i < ARRAY_SIZE(st->pbo.upload_fs); ++i) {
- if (st->pbo.upload_fs[i]) {
- st->pipe->delete_fs_state(st->pipe, st->pbo.upload_fs[i]);
- st->pbo.upload_fs[i] = NULL;
+ for (unsigned j = 0; j < ARRAY_SIZE(st->pbo.upload_fs[0]); j++) {
+ if (st->pbo.upload_fs[i][j]) {
+ st->pipe->delete_fs_state(st->pipe, st->pbo.upload_fs[i][j]);
+ st->pbo.upload_fs[i][j] = NULL;
+ }
}
}
for (i = 0; i < ARRAY_SIZE(st->pbo.download_fs); ++i) {
for (unsigned j = 0; j < ARRAY_SIZE(st->pbo.download_fs[0]); ++j) {
- if (st->pbo.download_fs[i][j]) {
- st->pipe->delete_fs_state(st->pipe, st->pbo.download_fs[i][j]);
- st->pbo.download_fs[i][j] = NULL;
+ for (unsigned k = 0; k < ARRAY_SIZE(st->pbo.download_fs[0][0]); k++) {
+ if (st->pbo.download_fs[i][j][k]) {
+ st->pipe->delete_fs_state(st->pipe, st->pbo.download_fs[i][j][k]);
+ st->pbo.download_fs[i][j][k] = NULL;
+ }
}
}
}