freedreno: stop frob'ing pipe_resource::nr_samples
authorRob Clark <robdclark@gmail.com>
Tue, 29 Jan 2019 17:23:28 +0000 (12:23 -0500)
committerRob Clark <robdclark@gmail.com>
Tue, 29 Jan 2019 17:30:50 +0000 (12:30 -0500)
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>
src/gallium/drivers/freedreno/freedreno_batch_cache.c
src/gallium/drivers/freedreno/freedreno_resource.c
src/gallium/drivers/freedreno/freedreno_resource.h
src/gallium/drivers/freedreno/freedreno_texture.c

index 45cd9c172d3e5522d13ae1448a9194ad13da616e..ec3aab128a87bd7f46a6f669d71d8c2fd29a97f2 100644 (file)
@@ -402,7 +402,7 @@ key_surf(struct key *key, unsigned idx, unsigned pos, struct pipe_surface *psurf
        key->surf[idx].texture = psurf->texture;
        key->surf[idx].u = psurf->u;
        key->surf[idx].pos = pos;
-       key->surf[idx].samples = psurf->nr_samples;
+       key->surf[idx].samples = MAX2(1, psurf->nr_samples);
        key->surf[idx].format = psurf->format;
 }
 
index 11319a44bb73a23f4dcd4fd3482f930d8d396acf..9adc3ce1d11bfbaa2b6ae0131b7234aa02839402 100644 (file)
@@ -927,8 +927,7 @@ fd_resource_create_with_modifiers(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);
 
@@ -1053,9 +1052,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;
index 10ab8bfa2252ff4fe39b9bdf9989b641536f8dea..9fc93d3c9a5f5e817ad8e4737741e771c2c79d26 100644 (file)
@@ -179,6 +179,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);
index d92298d2ea50625c8119d5b8872455a4aa1bb5c9..84b4df6c1dcd81732a53c71c57c3ff3e7303f8e7 100644 (file)
@@ -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);
        }