OSDN Git Service

freedreno: stop frob'ing pipe_resource::nr_samples
authorRob Clark <robdclark@gmail.com>
Tue, 29 Jan 2019 17:23:28 +0000 (12:23 -0500)
committerEmil Velikov <emil.l.velikov@gmail.com>
Tue, 12 Feb 2019 12:52:32 +0000 (12:52 +0000)
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

src/gallium/drivers/freedreno/freedreno_resource.c
src/gallium/drivers/freedreno/freedreno_resource.h
src/gallium/drivers/freedreno/freedreno_texture.c

index 54d7385..eeeda1c 100644 (file)
@@ -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;
index 09abb51..6790352 100644 (file)
@@ -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);
index d92298d..84b4df6 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);
        }