aboutsummaryrefslogtreecommitdiff
path: root/include/NvFlowShader.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/NvFlowShader.h')
-rw-r--r--include/NvFlowShader.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/include/NvFlowShader.h b/include/NvFlowShader.h
new file mode 100644
index 0000000..083af8e
--- /dev/null
+++ b/include/NvFlowShader.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2014-2017, NVIDIA CORPORATION. All rights reserved.
+ *
+ * NVIDIA CORPORATION and its licensors retain all intellectual property
+ * and proprietary rights in and to this software, related documentation
+ * and any modifications thereto. Any use, reproduction, disclosure or
+ * distribution of this software and related documentation without an express
+ * license agreement from NVIDIA CORPORATION is strictly prohibited.
+ */
+
+#ifndef NV_FLOW_SHADER_H
+#define NV_FLOW_SHADER_H
+
+// --------------------------- NvFlow Shader Parameters -------------------------------
+///@defgroup NvFlowContext
+///@{
+
+#if (NV_FLOW_SHADER_UTILS != 0)
+
+int3 NvFlow_tableVal_to_coord(uint val)
+{
+ uint valInv = ~val;
+ return int3(
+ (valInv >> 0) & 0x3FF,
+ (valInv >> 10) & 0x3FF,
+ (valInv >> 20) & 0x3FF);
+}
+
+#define NV_FLOW_DISPATCH_ID_TO_VIRTUAL(blockListSRV, params) \
+ int3 DispatchIDToVirtual(uint3 tidx) \
+ { \
+ uint blockID = tidx.x >> params.blockDimBits.x; \
+ int3 vBlockIdx = NvFlow_tableVal_to_coord(blockListSRV[blockID]); \
+ int3 vidx = (vBlockIdx << params.blockDimBits.xyz) | (tidx & (params.blockDim.xyz - int3(1,1,1))); \
+ return vidx; \
+ }
+
+#define NV_FLOW_VIRTUAL_TO_REAL(name, blockTableSRV, params) \
+ int3 name(int3 vidx) \
+ { \
+ if(params.isVTR.x != 0) \
+ { \
+ return vidx; \
+ } \
+ else \
+ { \
+ int3 vBlockIdx = vidx >> params.blockDimBits.xyz; \
+ int3 rBlockIdx = NvFlow_tableVal_to_coord(blockTableSRV[vBlockIdx]); \
+ int3 ridx = (rBlockIdx << params.blockDimBits.xyz) | (vidx & (params.blockDim.xyz - int3(1, 1, 1))); \
+ return ridx; \
+ } \
+ }
+
+#define NV_FLOW_VIRTUAL_TO_REAL_LINEAR(name, blockTableSRV, params) \
+ float3 name(float3 vidx) \
+ { \
+ if(params.isVTR.x != 0) \
+ { \
+ return vidx; \
+ } \
+ else \
+ { \
+ float3 vBlockIdxf = params.blockDimInv.xyz * vidx; \
+ int3 vBlockIdx = int3(floor(vBlockIdxf)); \
+ int3 rBlockIdx = NvFlow_tableVal_to_coord(blockTableSRV[vBlockIdx]); \
+ float3 rBlockIdxf = float3(rBlockIdx); \
+ float3 ridx = float3(params.linearBlockDim.xyz * rBlockIdx) + float3(params.blockDim.xyz) * (vBlockIdxf - float3(vBlockIdx)) + float3(params.linearBlockOffset.xyz); \
+ return ridx; \
+ } \
+ }
+
+#endif
+
+//! Parameters for shaders using the point format (no linear interpolation)
+struct NvFlowShaderPointParams
+{
+ NvFlowUint4 isVTR;
+ NvFlowUint4 blockDim;
+ NvFlowUint4 blockDimBits;
+ NvFlowUint4 poolGridDim;
+ NvFlowUint4 gridDim;
+};
+
+//! Parameters for shaders using the linear format (linear interpolation)
+struct NvFlowShaderLinearParams
+{
+ NvFlowUint4 isVTR;
+ NvFlowUint4 blockDim;
+ NvFlowUint4 blockDimBits;
+ NvFlowUint4 poolGridDim;
+ NvFlowUint4 gridDim;
+
+ NvFlowFloat4 blockDimInv;
+ NvFlowUint4 linearBlockDim;
+ NvFlowUint4 linearBlockOffset;
+ NvFlowFloat4 dimInv;
+ NvFlowFloat4 vdim;
+ NvFlowFloat4 vdimInv;
+};
+
+///@}
+
+#endif \ No newline at end of file