summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp')
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/Makefile28
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.comp29
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.cpp90
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.comp22
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.cpp91
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.comp36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.cpp89
7 files changed, 385 insertions, 0 deletions
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/Makefile b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/Makefile
new file mode 100644
index 00000000000..225bb3d57d1
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/Makefile
@@ -0,0 +1,28 @@
+SOURCES := $(wildcard *.comp)
+SPIRV := $(SOURCES:.comp=.spv)
+CPP_INTERFACE := $(SOURCES:.comp=.spv.cpp)
+CPP_DRIVER := $(SOURCES:.comp=.cpp)
+EXECUTABLES := $(SOURCES:.comp=.shader)
+OBJECTS := $(CPP_DRIVER:.cpp=.o) $(CPP_INTERFACE:.cpp=.o)
+
+CXXFLAGS += -std=c++11 -I../../include -I.
+LDFLAGS += -pthread -lm
+
+all: $(EXECUTABLES)
+
+%.spv: %.comp
+ glslangValidator -V -o $@ $<
+
+%.spv.cpp: %.spv
+ ../../spirv-cross --cpp --output $@ $<
+
+%.o: %.cpp
+ $(CXX) -c -o $@ $< $(CXXFLAGS)
+
+%.shader: %.o %.spv.o
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+clean:
+ $(RM) -f $(EXECUTABLES) $(SPIRV) $(CPP_INTERFACE) $(OBJECTS)
+
+.PHONY: clean
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.comp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.comp
new file mode 100644
index 00000000000..0bf6d2ad011
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.comp
@@ -0,0 +1,29 @@
+#version 310 es
+layout(local_size_x = 64) in;
+
+layout(set = 0, binding = 0, std430) readonly buffer SSBO0
+{
+ float inputs[];
+};
+
+layout(set = 0, binding = 1, std430) writeonly buffer SSBO1
+{
+ float outputs[];
+};
+
+layout(set = 0, binding = 2, std430) buffer SSBO2
+{
+ uint counter;
+};
+
+void main()
+{
+ // Builds a tightly packed list of all values less than 10.0.
+ // The output order is random.
+ float value = inputs[gl_GlobalInvocationID.x];
+ if (value < 10.0)
+ {
+ uint output_index = atomicAdd(counter, 1u);
+ outputs[output_index] = value;
+ }
+}
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.cpp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.cpp
new file mode 100644
index 00000000000..89351a5ae5f
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/atomics.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015-2017 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "spirv_cross/external_interface.h"
+#include <stdio.h>
+
+#ifndef GLM_SWIZZLE
+#define GLM_SWIZZLE
+#endif
+
+#ifndef GLM_FORCE_RADIANS
+#define GLM_FORCE_RADIANS
+#endif
+
+#include <glm/glm.hpp>
+using namespace glm;
+
+int main()
+{
+ // First, we get the C interface to the shader.
+ // This can be loaded from a dynamic library, or as here,
+ // linked in as a static library.
+ auto *iface = spirv_cross_get_interface();
+
+ // Create an instance of the shader interface.
+ auto *shader = iface->construct();
+
+// Build some input data for our compute shader.
+#define NUM_WORKGROUPS 4
+ float a[64 * NUM_WORKGROUPS];
+ float b[64 * NUM_WORKGROUPS] = {};
+ uint32_t counter = 0;
+
+ for (int i = 0; i < 64 * NUM_WORKGROUPS; i++)
+ {
+ a[i] = i * 0.46f;
+ }
+
+ void *aptr = a;
+ void *bptr = b;
+ void *cptr = &counter;
+
+ // Bind resources to the shader.
+ // For resources like samplers and buffers, we provide a list of pointers,
+ // since UBOs, SSBOs and samplers can be arrays, and can point to different types,
+ // which is especially true for samplers.
+ spirv_cross_set_resource(shader, 0, 0, &aptr, sizeof(aptr));
+ spirv_cross_set_resource(shader, 0, 1, &bptr, sizeof(bptr));
+ spirv_cross_set_resource(shader, 0, 2, &cptr, sizeof(cptr));
+
+ // We also have to set builtins.
+ // The relevant builtins will depend on the shader,
+ // but for compute, there are few builtins, which are gl_NumWorkGroups and gl_WorkGroupID.
+ // LocalInvocationID and GlobalInvocationID are inferred when executing the invocation.
+ uvec3 num_workgroups(NUM_WORKGROUPS, 1, 1);
+ uvec3 work_group_id(0, 0, 0);
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_NUM_WORK_GROUPS, &num_workgroups, sizeof(num_workgroups));
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_WORK_GROUP_ID, &work_group_id, sizeof(work_group_id));
+
+ // Execute 4 work groups.
+ for (unsigned i = 0; i < NUM_WORKGROUPS; i++)
+ {
+ work_group_id.x = i;
+ iface->invoke(shader);
+ }
+
+ // Call destructor.
+ iface->destruct(shader);
+
+ // Verify our output.
+ // TODO: Implement a test framework that asserts results computed.
+ fprintf(stderr, "Counter = %u\n", counter);
+ for (unsigned i = 0; i < counter; i++)
+ {
+ fprintf(stderr, "[%3u] = %.1f\n", i, b[i]);
+ }
+}
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.comp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.comp
new file mode 100644
index 00000000000..1ac7869ad05
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.comp
@@ -0,0 +1,22 @@
+#version 310 es
+layout(local_size_x = 64) in;
+
+layout(set = 0, binding = 0, std430) readonly buffer SSBO0
+{
+ vec4 a[];
+};
+
+layout(set = 0, binding = 1, std430) readonly buffer SSBO1
+{
+ vec4 b[];
+};
+
+layout(set = 0, binding = 2, std430) buffer SSBO2
+{
+ vec4 c[];
+};
+
+void main()
+{
+ c[gl_GlobalInvocationID.x] = a[gl_GlobalInvocationID.x] * b[gl_GlobalInvocationID.x];
+}
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.cpp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.cpp
new file mode 100644
index 00000000000..daa1fc6477d
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/multiply.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015-2017 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "spirv_cross/external_interface.h"
+#include <stdio.h>
+
+#ifndef GLM_SWIZZLE
+#define GLM_SWIZZLE
+#endif
+
+#ifndef GLM_FORCE_RADIANS
+#define GLM_FORCE_RADIANS
+#endif
+
+#include <glm/glm.hpp>
+using namespace glm;
+
+int main()
+{
+ // First, we get the C interface to the shader.
+ // This can be loaded from a dynamic library, or as here,
+ // linked in as a static library.
+ auto *iface = spirv_cross_get_interface();
+
+ // Create an instance of the shader interface.
+ auto *shader = iface->construct();
+
+// Build some input data for our compute shader.
+#define NUM_WORKGROUPS 4
+ vec4 a[64 * NUM_WORKGROUPS];
+ vec4 b[64 * NUM_WORKGROUPS];
+ vec4 c[64 * NUM_WORKGROUPS] = {};
+
+ for (int i = 0; i < 64 * NUM_WORKGROUPS; i++)
+ {
+ a[i] = vec4(100 + i, 101 + i, 102 + i, 103 + i);
+ b[i] = vec4(100 - i, 99 - i, 98 - i, 97 - i);
+ }
+
+ void *aptr = a;
+ void *bptr = b;
+ void *cptr = c;
+
+ // Bind resources to the shader.
+ // For resources like samplers and buffers, we provide a list of pointers,
+ // since UBOs, SSBOs and samplers can be arrays, and can point to different types,
+ // which is especially true for samplers.
+ spirv_cross_set_resource(shader, 0, 0, &aptr, sizeof(aptr));
+ spirv_cross_set_resource(shader, 0, 1, &bptr, sizeof(bptr));
+ spirv_cross_set_resource(shader, 0, 2, &cptr, sizeof(cptr));
+
+ // We also have to set builtins.
+ // The relevant builtins will depend on the shader,
+ // but for compute, there are few builtins, which are gl_NumWorkGroups and gl_WorkGroupID.
+ // LocalInvocationID and GlobalInvocationID are inferred when executing the invocation.
+ uvec3 num_workgroups(NUM_WORKGROUPS, 1, 1);
+ uvec3 work_group_id(0, 0, 0);
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_NUM_WORK_GROUPS, &num_workgroups, sizeof(num_workgroups));
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_WORK_GROUP_ID, &work_group_id, sizeof(work_group_id));
+
+ // Execute 4 work groups.
+ for (unsigned i = 0; i < NUM_WORKGROUPS; i++)
+ {
+ work_group_id.x = i;
+ iface->invoke(shader);
+ }
+
+ // Call destructor.
+ iface->destruct(shader);
+
+ // Verify our output.
+ // TODO: Implement a test framework that asserts results computed.
+ for (unsigned i = 0; i < 64 * NUM_WORKGROUPS; i++)
+ {
+ fprintf(stderr, "(%.1f, %.1f, %.1f, %.1f) * (%.1f, %.1f, %.1f, %.1f) => (%.1f, %.1f, %.1f, %.1f)\n", a[i].x,
+ a[i].y, a[i].z, a[i].w, b[i].x, b[i].y, b[i].z, b[i].w, c[i].x, c[i].y, c[i].z, c[i].w);
+ }
+}
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.comp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.comp
new file mode 100644
index 00000000000..7d59060aa98
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.comp
@@ -0,0 +1,36 @@
+#version 310 es
+layout(local_size_x = 64) in;
+
+layout(set = 0, binding = 0, std430) readonly buffer SSBO0
+{
+ float inputs[];
+};
+
+layout(set = 0, binding = 1, std430) writeonly buffer SSBO1
+{
+ float outputs[];
+};
+
+shared float tmp[gl_WorkGroupSize.x];
+
+void main()
+{
+ uint local = gl_LocalInvocationIndex;
+ uint work_group = gl_WorkGroupID.x;
+
+ // Does a trivial parallel reduction through shared memory.
+ tmp[local] = inputs[work_group * gl_WorkGroupSize.x * 2u + local] + inputs[work_group * gl_WorkGroupSize.x * 2u + local + gl_WorkGroupSize.x];
+ memoryBarrierShared();
+ barrier();
+
+ for (uint limit = 32u; limit > 1u; limit >>= 1u)
+ {
+ if (local < limit)
+ tmp[local] = tmp[local] + tmp[local + limit];
+ memoryBarrierShared();
+ barrier();
+ }
+
+ if (local == 0u)
+ outputs[work_group] = tmp[0] + tmp[1];
+}
diff --git a/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.cpp b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.cpp
new file mode 100644
index 00000000000..5be62d681fc
--- /dev/null
+++ b/3rdparty/bgfx/3rdparty/spirv-cross/samples/cpp/shared.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015-2017 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "spirv_cross/external_interface.h"
+#include <stdio.h>
+
+#ifndef GLM_SWIZZLE
+#define GLM_SWIZZLE
+#endif
+
+#ifndef GLM_FORCE_RADIANS
+#define GLM_FORCE_RADIANS
+#endif
+
+#include <glm/glm.hpp>
+using namespace glm;
+
+int main()
+{
+ // First, we get the C interface to the shader.
+ // This can be loaded from a dynamic library, or as here,
+ // linked in as a static library.
+ auto *iface = spirv_cross_get_interface();
+
+ // Create an instance of the shader interface.
+ auto *shader = iface->construct();
+
+// Build some input data for our compute shader.
+#define NUM_WORKGROUPS 4
+ float a[128 * NUM_WORKGROUPS];
+ float b[NUM_WORKGROUPS] = {};
+
+ for (int i = 0; i < 128 * NUM_WORKGROUPS; i++)
+ {
+ a[i] = float(i);
+ }
+
+ void *aptr = a;
+ void *bptr = b;
+
+ // Bind resources to the shader.
+ // For resources like samplers and buffers, we provide a list of pointers,
+ // since UBOs, SSBOs and samplers can be arrays, and can point to different types,
+ // which is especially true for samplers.
+ spirv_cross_set_resource(shader, 0, 0, &aptr, sizeof(aptr));
+ spirv_cross_set_resource(shader, 0, 1, &bptr, sizeof(bptr));
+
+ // We also have to set builtins.
+ // The relevant builtins will depend on the shader,
+ // but for compute, there are few builtins, which are gl_NumWorkGroups and gl_WorkGroupID.
+ // LocalInvocationID and GlobalInvocationID are inferred when executing the invocation.
+ uvec3 num_workgroups(NUM_WORKGROUPS, 1, 1);
+ uvec3 work_group_id(0, 0, 0);
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_NUM_WORK_GROUPS, &num_workgroups, sizeof(num_workgroups));
+ spirv_cross_set_builtin(shader, SPIRV_CROSS_BUILTIN_WORK_GROUP_ID, &work_group_id, sizeof(work_group_id));
+
+ // Execute 4 work groups.
+ for (unsigned i = 0; i < NUM_WORKGROUPS; i++)
+ {
+ work_group_id.x = i;
+ iface->invoke(shader);
+ }
+
+ // Call destructor.
+ iface->destruct(shader);
+
+ // Verify our output.
+ // TODO: Implement a test framework that asserts results computed.
+ for (unsigned i = 0; i < NUM_WORKGROUPS; i++)
+ {
+ float expected_sum = 0.0f;
+ for (unsigned j = i * 128; j < (i + 1) * 128; j++)
+ expected_sum += a[j];
+ fprintf(stderr, "Sum in workgroup #%u = %.1f, expected %.1f\n", i, b[i], expected_sum);
+ }
+}