st/mesa: handle lowered IO in st_nir_assign_vs_in_locations
[mesa.git] / src / mesa / state_tracker / st_cb_msaa.c
index 3399a0c9e0d322080d954a0a083e808cea5043d6..ff4de881410f683b024e20ab5e6e7fbe958b484e 100644 (file)
@@ -1,8 +1,8 @@
 /**************************************************************************
- * 
+ *
  * Copyright 2013 Red Hat
  * All Rights Reserved.
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
  * "Software"), to deal in the Software without restriction, including
  * distribute, sub license, and/or sell copies of the Software, and to
  * permit persons to whom the Software is furnished to do so, subject to
  * the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice (including the
  * next paragraph) shall be included in all copies or substantial portions
  * of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
+ *
  **************************************************************************/
 
-#include "main/mfeatures.h"
 #include "main/bufferobj.h"
-#include "main/imports.h"
+
+#include "main/framebuffer.h"
 
 #include "state_tracker/st_cb_msaa.h"
 #include "state_tracker/st_context.h"
 #include "state_tracker/st_cb_fbo.h"
 
 #include "pipe/p_context.h"
-static void st_GetSamplePosition(struct gl_context *ctx,
-                                 struct gl_framebuffer *fb,
-                                 GLuint index,
-                                 GLfloat *outValue)
+
+
+static void
+st_GetSamplePosition(struct gl_context *ctx,
+                     struct gl_framebuffer *fb,
+                     GLuint index,
+                     GLfloat *outPos)
 {
    struct st_context *st = st_context(ctx);
-   st_validate_state(st);
+
+   st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
 
    if (st->pipe->get_sample_position)
-      st->pipe->get_sample_position(st->pipe, (unsigned)fb->Visual.samples, index, outValue);
+      st->pipe->get_sample_position(st->pipe,
+                                    _mesa_geometric_samples(fb),
+                                    index, outPos);
+   else
+      outPos[0] = outPos[1] = 0.5f;
+}
+
+
+static void
+st_GetProgrammableSampleCaps(struct gl_context *ctx, const struct gl_framebuffer *fb,
+                             GLuint *outBits, GLuint *outWidth, GLuint *outHeight)
+{
+   struct st_context *st = st_context(ctx);
+   struct pipe_screen *screen = st->pipe->screen;
+
+   st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
+
+   *outBits = 4;
+   *outWidth = 1;
+   *outHeight = 1;
+
+   if (ctx->Extensions.ARB_sample_locations)
+      screen->get_sample_pixel_grid(screen, st->state.fb_num_samples,
+                                    outWidth, outHeight);
+
+   /* We could handle this better in some circumstances,
+    * but it's not really an issue */
+   if (*outWidth > MAX_SAMPLE_LOCATION_GRID_SIZE ||
+       *outHeight > MAX_SAMPLE_LOCATION_GRID_SIZE) {
+      *outWidth = 1;
+      *outHeight = 1;
+   }
 }
 
-void st_init_msaa_functions(struct dd_function_table *functions)
+void
+st_init_msaa_functions(struct dd_function_table *functions)
 {
    functions->GetSamplePosition = st_GetSamplePosition;
+   functions->GetProgrammableSampleCaps = st_GetProgrammableSampleCaps;
 }