v3d: Add support for requesting the sample offsets.
authorEric Anholt <eric@anholt.net>
Fri, 28 Dec 2018 07:20:53 +0000 (23:20 -0800)
committerEric Anholt <eric@anholt.net>
Sun, 30 Dec 2018 16:05:11 +0000 (08:05 -0800)
src/gallium/drivers/v3d/v3d_context.c

index 1b148ecda2a0d2b6f61f241e590850f62341c7d9..b9eaf7e67ec3fa3557be818b78649cef00a9ace6 100644 (file)
@@ -123,6 +123,27 @@ v3d_context_destroy(struct pipe_context *pctx)
         ralloc_free(v3d);
 }
 
+static void
+v3d_get_sample_position(struct pipe_context *pctx,
+                        unsigned sample_count, unsigned sample_index,
+                        float *xy)
+{
+        struct v3d_context *v3d = v3d_context(pctx);
+
+        if (sample_count <= 1) {
+                xy[0] = 0.5;
+                xy[1] = 0.5;
+        } else {
+                static const int xoffsets_v33[] = { 1, -3, 3, -1 };
+                static const int xoffsets_v42[] = { -1, 3, -3, 1 };
+                const int *xoffsets = (v3d->screen->devinfo.ver >= 42 ?
+                                       xoffsets_v42 : xoffsets_v33);
+
+                xy[0] = 0.5 + xoffsets[sample_index] * .125;
+                xy[1] = .125 + sample_index * .25;
+        }
+}
+
 struct pipe_context *
 v3d_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 {
@@ -153,6 +174,7 @@ v3d_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
         pctx->flush = v3d_pipe_flush;
         pctx->set_debug_callback = v3d_set_debug_callback;
         pctx->invalidate_resource = v3d_invalidate_resource;
+        pctx->get_sample_position = v3d_get_sample_position;
 
         if (screen->devinfo.ver >= 41) {
                 v3d41_draw_init(pctx);