Module: Mesa
Branch: master
Commit: 46cd91bb45aa99b1fd95466cbe83e02bb4f2c258
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=46cd91bb45aa99b1fd95466cbe83e02bb4f2c258

Author: Jason Ekstrand <[email protected]>
Date:   Wed May 13 13:56:03 2020 -0500

spirv,nir: Add support for ray-tracing built-ins

Missing in this commit are NIR intrinsics for the ObjectToWorld and
WorldToObject built-ins.  Those are matrices and so they take a bit more
work and justify a separate commit.  For now, we add the enums and leave
the SYSTEM_VALUE <-> nir_intrinsic conversion commented out.

Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6479>

---

 src/compiler/nir/nir.c             | 48 ++++++++++++++++++++++++++++++++
 src/compiler/nir/nir_intrinsics.py | 14 ++++++++++
 src/compiler/shader_enums.c        | 13 +++++++++
 src/compiler/shader_enums.h        | 20 +++++++++++++
 src/compiler/spirv/vtn_variables.c | 57 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 152 insertions(+)

diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index bf1315abeae..f261711517f 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -2216,6 +2216,30 @@ nir_intrinsic_from_system_value(gl_system_value val)
       return nir_intrinsic_load_work_dim;
    case SYSTEM_VALUE_USER_DATA_AMD:
       return nir_intrinsic_load_user_data_amd;
+   case SYSTEM_VALUE_RAY_LAUNCH_ID:
+      return nir_intrinsic_load_ray_launch_id;
+   case SYSTEM_VALUE_RAY_LAUNCH_SIZE:
+      return nir_intrinsic_load_ray_launch_size;
+   case SYSTEM_VALUE_RAY_WORLD_ORIGIN:
+      return nir_intrinsic_load_ray_world_origin;
+   case SYSTEM_VALUE_RAY_WORLD_DIRECTION:
+      return nir_intrinsic_load_ray_world_direction;
+   case SYSTEM_VALUE_RAY_OBJECT_ORIGIN:
+      return nir_intrinsic_load_ray_object_origin;
+   case SYSTEM_VALUE_RAY_OBJECT_DIRECTION:
+      return nir_intrinsic_load_ray_object_direction;
+   case SYSTEM_VALUE_RAY_T_MIN:
+      return nir_intrinsic_load_ray_t_min;
+   case SYSTEM_VALUE_RAY_T_MAX:
+      return nir_intrinsic_load_ray_t_max;
+   case SYSTEM_VALUE_RAY_HIT_KIND:
+      return nir_intrinsic_load_ray_hit_kind;
+   case SYSTEM_VALUE_RAY_FLAGS:
+      return nir_intrinsic_load_ray_flags;
+   case SYSTEM_VALUE_RAY_GEOMETRY_INDEX:
+      return nir_intrinsic_load_ray_geometry_index;
+   case SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX:
+      return nir_intrinsic_load_ray_instance_custom_index;
    default:
       unreachable("system value does not directly correspond to intrinsic");
    }
@@ -2323,6 +2347,30 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
       return SYSTEM_VALUE_GS_HEADER_IR3;
    case nir_intrinsic_load_tcs_header_ir3:
       return SYSTEM_VALUE_TCS_HEADER_IR3;
+   case nir_intrinsic_load_ray_launch_id:
+      return SYSTEM_VALUE_RAY_LAUNCH_ID;
+   case nir_intrinsic_load_ray_launch_size:
+      return SYSTEM_VALUE_RAY_LAUNCH_SIZE;
+   case nir_intrinsic_load_ray_world_origin:
+      return SYSTEM_VALUE_RAY_WORLD_ORIGIN;
+   case nir_intrinsic_load_ray_world_direction:
+      return SYSTEM_VALUE_RAY_WORLD_DIRECTION;
+   case nir_intrinsic_load_ray_object_origin:
+      return SYSTEM_VALUE_RAY_OBJECT_ORIGIN;
+   case nir_intrinsic_load_ray_object_direction:
+      return SYSTEM_VALUE_RAY_OBJECT_DIRECTION;
+   case nir_intrinsic_load_ray_t_min:
+      return SYSTEM_VALUE_RAY_T_MIN;
+   case nir_intrinsic_load_ray_t_max:
+      return SYSTEM_VALUE_RAY_T_MAX;
+   case nir_intrinsic_load_ray_hit_kind:
+      return SYSTEM_VALUE_RAY_HIT_KIND;
+   case nir_intrinsic_load_ray_flags:
+      return SYSTEM_VALUE_RAY_FLAGS;
+   case nir_intrinsic_load_ray_geometry_index:
+      return SYSTEM_VALUE_RAY_GEOMETRY_INDEX;
+   case nir_intrinsic_load_ray_instance_custom_index:
+      return SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX;
    default:
       unreachable("intrinsic doesn't produce a system value");
    }
diff --git a/src/compiler/nir/nir_intrinsics.py 
b/src/compiler/nir/nir_intrinsics.py
index dc5bcaac74c..d136687e19f 100644
--- a/src/compiler/nir/nir_intrinsics.py
+++ b/src/compiler/nir/nir_intrinsics.py
@@ -658,6 +658,20 @@ system_value("scratch_base_ptr", 0, bit_sizes=[32,64], 
indices=[BASE])
 system_value("constant_base_ptr", 0, bit_sizes=[32,64])
 system_value("shared_base_ptr", 0, bit_sizes=[32,64])
 
+# System values for ray tracing.
+system_value("ray_launch_id", 3)
+system_value("ray_launch_size", 3)
+system_value("ray_world_origin", 3)
+system_value("ray_world_direction", 3)
+system_value("ray_object_origin", 3)
+system_value("ray_object_direction", 3)
+system_value("ray_t_min", 1)
+system_value("ray_t_max", 1)
+system_value("ray_hit_kind", 1)
+system_value("ray_flags", 1)
+system_value("ray_geometry_index", 1)
+system_value("ray_instance_custom_index", 1)
+
 # Driver-specific viewport scale/offset parameters.
 #
 # VC4 and V3D need to emit a scaled version of the position in the vertex
diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c
index ccea8692833..7114877f73b 100644
--- a/src/compiler/shader_enums.c
+++ b/src/compiler/shader_enums.c
@@ -289,6 +289,19 @@ gl_system_value_name(gl_system_value sysval)
      ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID),
      ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE),
      ENUM(SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL),
+     ENUM(SYSTEM_VALUE_RAY_LAUNCH_ID),
+     ENUM(SYSTEM_VALUE_RAY_LAUNCH_SIZE),
+     ENUM(SYSTEM_VALUE_RAY_WORLD_ORIGIN),
+     ENUM(SYSTEM_VALUE_RAY_WORLD_DIRECTION),
+     ENUM(SYSTEM_VALUE_RAY_OBJECT_ORIGIN),
+     ENUM(SYSTEM_VALUE_RAY_OBJECT_DIRECTION),
+     ENUM(SYSTEM_VALUE_RAY_T_MIN),
+     ENUM(SYSTEM_VALUE_RAY_T_MAX),
+     ENUM(SYSTEM_VALUE_RAY_OBJECT_TO_WORLD),
+     ENUM(SYSTEM_VALUE_RAY_WORLD_TO_OBJECT),
+     ENUM(SYSTEM_VALUE_RAY_HIT_KIND),
+     ENUM(SYSTEM_VALUE_RAY_FLAGS),
+     ENUM(SYSTEM_VALUE_RAY_GEOMETRY_INDEX),
      ENUM(SYSTEM_VALUE_GS_HEADER_IR3),
      ENUM(SYSTEM_VALUE_TCS_HEADER_IR3),
    };
diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h
index ced516ff57f..5bab7fed120 100644
--- a/src/compiler/shader_enums.h
+++ b/src/compiler/shader_enums.h
@@ -669,6 +669,26 @@ typedef enum
    SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE,
    SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL,
 
+   /**
+    * \name Ray tracing shader system values
+    */
+   /*@{*/
+   SYSTEM_VALUE_RAY_LAUNCH_ID,
+   SYSTEM_VALUE_RAY_LAUNCH_SIZE,
+   SYSTEM_VALUE_RAY_WORLD_ORIGIN,
+   SYSTEM_VALUE_RAY_WORLD_DIRECTION,
+   SYSTEM_VALUE_RAY_OBJECT_ORIGIN,
+   SYSTEM_VALUE_RAY_OBJECT_DIRECTION,
+   SYSTEM_VALUE_RAY_T_MIN,
+   SYSTEM_VALUE_RAY_T_MAX,
+   SYSTEM_VALUE_RAY_OBJECT_TO_WORLD,
+   SYSTEM_VALUE_RAY_WORLD_TO_OBJECT,
+   SYSTEM_VALUE_RAY_HIT_KIND,
+   SYSTEM_VALUE_RAY_FLAGS,
+   SYSTEM_VALUE_RAY_GEOMETRY_INDEX,
+   SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX,
+   /*@}*/
+
    /**
     * IR3 specific geometry shader and tesselation control shader system
     * values that packs invocation id, thread id and vertex id.  Having this
diff --git a/src/compiler/spirv/vtn_variables.c 
b/src/compiler/spirv/vtn_variables.c
index 5149d37b77e..33118d0a228 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1039,6 +1039,63 @@ vtn_get_builtin_location(struct vtn_builder *b,
       *location = SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL;
       set_mode_system_value(b, mode);
       break;
+   case SpvBuiltInLaunchIdKHR:
+      *location = SYSTEM_VALUE_RAY_LAUNCH_ID;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInLaunchSizeKHR:
+      *location = SYSTEM_VALUE_RAY_LAUNCH_SIZE;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInWorldRayOriginKHR:
+      *location = SYSTEM_VALUE_RAY_WORLD_ORIGIN;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInWorldRayDirectionKHR:
+      *location = SYSTEM_VALUE_RAY_WORLD_DIRECTION;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInObjectRayOriginKHR:
+      *location = SYSTEM_VALUE_RAY_OBJECT_ORIGIN;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInObjectRayDirectionKHR:
+      *location = SYSTEM_VALUE_RAY_OBJECT_DIRECTION;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInObjectToWorldKHR:
+      *location = SYSTEM_VALUE_RAY_OBJECT_TO_WORLD;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInWorldToObjectKHR:
+      *location = SYSTEM_VALUE_RAY_WORLD_TO_OBJECT;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInRayTminKHR:
+      *location = SYSTEM_VALUE_RAY_T_MIN;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInRayTmaxKHR:
+   case SpvBuiltInHitTNV:
+      *location = SYSTEM_VALUE_RAY_T_MAX;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInInstanceCustomIndexKHR:
+      *location = SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInHitKindKHR:
+      *location = SYSTEM_VALUE_RAY_HIT_KIND;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInIncomingRayFlagsKHR:
+      *location = SYSTEM_VALUE_RAY_FLAGS;
+      set_mode_system_value(b, mode);
+      break;
+   case SpvBuiltInRayGeometryIndexKHR:
+      *location = SYSTEM_VALUE_RAY_GEOMETRY_INDEX;
+      set_mode_system_value(b, mode);
+      break;
    default:
       vtn_fail("Unsupported builtin: %s (%u)",
                spirv_builtin_to_string(builtin), builtin);

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to