anv/meta: Use NIR directly for clear shaders
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:18:32 +0000 (16:18 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:18:32 +0000 (16:18 -0700)
src/vulkan/anv_meta.c

index fb18033c44d29b5981db7320bc1f25c84ea7bec7..0c0f889ed149d3f9b3479363bb3faa608b42397b 100644 (file)
 
 #include "anv_private.h"
 #include "anv_meta_spirv_autogen.h"
+#include "anv_nir_builder.h"
+
+static nir_shader *
+build_nir_vertex_shader(bool attr_flat)
+{
+   nir_builder b;
+
+   const struct glsl_type *vertex_type = glsl_vec4_type();
+
+   nir_builder_init_simple_shader(&b, MESA_SHADER_VERTEX);
+
+   nir_variable *pos_in = nir_variable_create(b.shader, "a_pos",
+                                              vertex_type,
+                                              nir_var_shader_in);
+   pos_in->data.location = VERT_ATTRIB_GENERIC0;
+   nir_variable *pos_out = nir_variable_create(b.shader, "gl_Position",
+                                               vertex_type,
+                                               nir_var_shader_out);
+   pos_in->data.location = VARYING_SLOT_POS;
+   nir_copy_var(&b, pos_out, pos_in);
+
+   /* Add one more pass-through attribute.  For clear shaders, this is used
+    * to store the color and for blit shaders it's the texture coordinate.
+    */
+   const struct glsl_type *attr_type = glsl_vec4_type();
+   nir_variable *attr_in = nir_variable_create(b.shader, "a_attr", attr_type,
+                                               nir_var_shader_in);
+   attr_in->data.location = VERT_ATTRIB_GENERIC1;
+   nir_variable *attr_out = nir_variable_create(b.shader, "v_attr", attr_type,
+                                                nir_var_shader_out);
+   attr_out->data.location = VARYING_SLOT_VAR0;
+   attr_out->data.interpolation = attr_flat ? INTERP_QUALIFIER_FLAT :
+                                              INTERP_QUALIFIER_SMOOTH;
+   nir_copy_var(&b, attr_out, attr_in);
+
+   return b.shader;
+}
+
+static nir_shader *
+build_nir_clear_fragment_shader()
+{
+   nir_builder b;
+
+   const struct glsl_type *color_type = glsl_vec4_type();
+
+   nir_builder_init_simple_shader(&b, MESA_SHADER_FRAGMENT);
+
+   nir_variable *color_in = nir_variable_create(b.shader, "v_attr",
+                                                color_type,
+                                                nir_var_shader_in);
+   color_in->data.location = VARYING_SLOT_VAR0;
+   color_in->data.interpolation = INTERP_QUALIFIER_FLAT;
+   nir_variable *color_out = nir_variable_create(b.shader, "f_color",
+                                                 color_type,
+                                                 nir_var_shader_out);
+   color_out->data.location = FRAG_RESULT_DATA0;
+   nir_copy_var(&b, color_out, color_in);
+
+   return b.shader;
+}
 
 static void
 anv_device_init_meta_clear_state(struct anv_device *device)
 {
-   /* We don't use a vertex shader for clearing, but instead build and pass
-    * the VUEs directly to the rasterization backend.  However, we do need
-    * to provide GLSL source for the vertex shader so that the compiler
-    * does not dead-code our inputs.
-    */
-   VkShaderModule vsm = GLSL_VK_SHADER_MODULE(device, VERTEX,
-      layout(location = 0) in vec3 a_pos;
-      layout(location = 1) in vec4 a_color;
-      layout(location = 0) flat out vec4 v_color;
-      void main()
-      {
-         v_color = a_color;
-         gl_Position = vec4(a_pos, 1);
-      }
-   );
+   struct anv_shader_module vsm = {
+      .nir = build_nir_vertex_shader(true),
+   };
 
-   VkShaderModule fsm = GLSL_VK_SHADER_MODULE(device, FRAGMENT,
-      layout(location = 0) out vec4 f_color;
-      layout(location = 0) flat in vec4 v_color;
-      void main()
-      {
-         f_color = v_color;
-      }
-   );
+   struct anv_shader_module fsm = {
+      .nir = build_nir_clear_fragment_shader(),
+   };
 
    VkShader vs;
    anv_CreateShader(anv_device_to_handle(device),
       &(VkShaderCreateInfo) {
          .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
-         .module = vsm,
+         .module = anv_shader_module_to_handle(&vsm),
          .pName = "main",
       }, &vs);
 
@@ -70,7 +113,7 @@ anv_device_init_meta_clear_state(struct anv_device *device)
    anv_CreateShader(anv_device_to_handle(device),
       &(VkShaderCreateInfo) {
          .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
-         .module = fsm,
+         .module = anv_shader_module_to_handle(&fsm),
          .pName = "main",
       }, &fs);
 
@@ -187,10 +230,10 @@ anv_device_init_meta_clear_state(struct anv_device *device)
       },
       &device->meta_state.clear.pipeline);
 
-   anv_DestroyShaderModule(anv_device_to_handle(device), vsm);
-   anv_DestroyShaderModule(anv_device_to_handle(device), fsm);
    anv_DestroyShader(anv_device_to_handle(device), vs);
    anv_DestroyShader(anv_device_to_handle(device), fs);
+   ralloc_free(vsm.nir);
+   ralloc_free(fsm.nir);
 }
 
 #define NUM_VB_USED 2