summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2019-01-29 12:23:28 -0500
committerEmil Velikov <emil.l.velikov@gmail.com>2019-02-12 12:52:32 +0000
commit434f19a8dc5b24e69415e0a36ed067369ea8a8fe (patch)
tree79210ea6d9a21deee63a613566a2cae6f2dd70c1 /src
parent7475d7727f172387ac3d069887f3095dcb884649 (diff)
freedreno: stop frob'ing pipe_resource::nr_samples
Previously we tried to normalize nr_samples to MAX2(1, nr_samples) to avoid having to deal with 0 vs 1 everywhere. But this causes problems in mesa/st, for example st_finalize_texture() will think there is a nr_samples mismatch and recreate the texture. Somehow this manifests as corrupt x11 font rendering on generations that do not support MSAA (but apparently works fine on a5xx and a6xx which do support MSAA.) Fixes: cf0c7258ee0 freedreno/a5xx: MSAA Signed-off-by: Rob Clark <robdclark@gmail.com> (cherry picked from commit c3baa077bf6db9f9d46be62ed7cbbc3167e68c8f) [Emil Velikov: resolve trivial conflicts] Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Conflicts: src/gallium/drivers/freedreno/freedreno_batch_cache.c
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/freedreno/freedreno_resource.c7
-rw-r--r--src/gallium/drivers/freedreno/freedreno_resource.h9
-rw-r--r--src/gallium/drivers/freedreno/freedreno_texture.c3
3 files changed, 14 insertions, 5 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 54d73858962..eeeda1cf62c 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -839,8 +839,7 @@ fd_resource_create(struct pipe_screen *pscreen,
rsc->internal_format = format;
rsc->cpp = util_format_get_blocksize(format);
- prsc->nr_samples = MAX2(1, prsc->nr_samples);
- rsc->cpp *= prsc->nr_samples;
+ rsc->cpp *= fd_resource_nr_samples(prsc);
assert(rsc->cpp);
@@ -924,9 +923,9 @@ fd_resource_from_handle(struct pipe_screen *pscreen,
if (!rsc->bo)
goto fail;
- prsc->nr_samples = MAX2(1, prsc->nr_samples);
rsc->internal_format = tmpl->format;
- rsc->cpp = prsc->nr_samples * util_format_get_blocksize(tmpl->format);
+ rsc->cpp = util_format_get_blocksize(tmpl->format);
+ rsc->cpp *= fd_resource_nr_samples(prsc);
slice->pitch = handle->stride / rsc->cpp;
slice->offset = handle->offset;
slice->size0 = handle->stride * prsc->height0;
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
index 09abb512d7e..6790352f965 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -178,6 +178,15 @@ fd_resource_level_linear(struct pipe_resource *prsc, int level)
return false;
}
+/* access # of samples, with 0 normalized to 1 (which is what we care about
+ * most of the time)
+ */
+static inline unsigned
+fd_resource_nr_samples(struct pipe_resource *prsc)
+{
+ return MAX2(1, prsc->nr_samples);
+}
+
void fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond, bool discard,
enum fd_render_stage stage);
void fd_blitter_pipe_end(struct fd_context *ctx);
diff --git a/src/gallium/drivers/freedreno/freedreno_texture.c b/src/gallium/drivers/freedreno/freedreno_texture.c
index d92298d2ea5..84b4df6c1dc 100644
--- a/src/gallium/drivers/freedreno/freedreno_texture.c
+++ b/src/gallium/drivers/freedreno/freedreno_texture.c
@@ -31,6 +31,7 @@
#include "freedreno_texture.h"
#include "freedreno_context.h"
+#include "freedreno_resource.h"
#include "freedreno_util.h"
static void
@@ -83,7 +84,7 @@ static void set_sampler_views(struct fd_texture_stateobj *tex,
tex->num_textures = util_last_bit(tex->valid_textures);
for (i = 0; i < tex->num_textures; i++) {
- uint nr_samples = tex->textures[i]->texture->nr_samples;
+ uint nr_samples = fd_resource_nr_samples(tex->textures[i]->texture);
samplers |= (nr_samples >> 1) << (i * 2);
}