3 #include "testing/testing.h"
26 std::cout <<
"Skipping compute shader test: platform not supported";
33 const char *compute_glsl = R
"(
35 layout(local_size_x = 1, local_size_y = 1) in;
36 layout(rgba32f, binding = 0) uniform image2D img_output;
39 vec4 pixel = vec4(1.0, 0.5, 0.2, 1.0);
40 imageStore(img_output, ivec2(gl_GlobalInvocationID.xy), pixel);
46 compute_glsl, nullptr,
nullptr,
"gpu_shader_compute_2d");
47 EXPECT_NE(shader,
nullptr);
52 EXPECT_NE(texture,
nullptr);
63 EXPECT_NE(
data,
nullptr);
64 for (
int index = 0; index <
SIZE *
SIZE; index++) {
65 EXPECT_FLOAT_EQ(
data[index * 4 + 0], 1.0f);
66 EXPECT_FLOAT_EQ(
data[index * 4 + 1], 0.5f);
67 EXPECT_FLOAT_EQ(
data[index * 4 + 2], 0.2f);
68 EXPECT_FLOAT_EQ(
data[index * 4 + 3], 1.0f);
85 std::cout <<
"Skipping compute shader test: platform not supported";
92 const char *compute_glsl = R
"(
94 layout(local_size_x = 1) in;
96 layout(rgba32f, binding = 1) uniform image1D outputVboData;
99 int index = int(gl_GlobalInvocationID.x);
100 vec4 pos = vec4(gl_GlobalInvocationID.x);
101 imageStore(outputVboData, index, pos);
107 compute_glsl, nullptr,
nullptr,
"gpu_shader_compute_1d");
108 EXPECT_NE(shader,
nullptr);
113 EXPECT_NE(texture,
nullptr);
126 EXPECT_NE(
data,
nullptr);
127 for (
int index = 0; index <
SIZE; index++) {
128 float expected_value = index;
129 EXPECT_FLOAT_EQ(
data[index * 4 + 0], expected_value);
130 EXPECT_FLOAT_EQ(
data[index * 4 + 1], expected_value);
131 EXPECT_FLOAT_EQ(
data[index * 4 + 2], expected_value);
132 EXPECT_FLOAT_EQ(
data[index * 4 + 3], expected_value);
149 std::cout <<
"Skipping compute shader test: platform not supported";
156 const char *compute_glsl = R
"(
158 layout(local_size_x = 1) in;
160 layout(std430, binding = 0) writeonly buffer outputVboData
162 vec4 out_positions[];
166 uint index = gl_GlobalInvocationID.x;
167 vec4 pos = vec4(gl_GlobalInvocationID.x);
168 out_positions[index] = pos;
174 compute_glsl, nullptr,
nullptr,
"gpu_shader_compute_vbo");
175 EXPECT_NE(shader,
nullptr);
193 ASSERT_NE(
data,
nullptr);
194 for (
int index = 0; index <
SIZE; index++) {
195 float expected_value = index;
196 EXPECT_FLOAT_EQ(
data[index * 4 + 0], expected_value);
197 EXPECT_FLOAT_EQ(
data[index * 4 + 1], expected_value);
198 EXPECT_FLOAT_EQ(
data[index * 4 + 2], expected_value);
199 EXPECT_FLOAT_EQ(
data[index * 4 + 3], expected_value);
214 std::cout <<
"Skipping compute shader test: platform not supported";
221 const char *compute_glsl = R
"(
223 layout(local_size_x = 1) in;
225 layout(std430, binding = 1) writeonly buffer outputIboData
231 uint store_index = int(gl_GlobalInvocationID.x);
232 out_indexes[store_index] = store_index;
238 compute_glsl, nullptr,
nullptr,
"gpu_shader_compute_vbo");
239 EXPECT_NE(shader,
nullptr);
254 ASSERT_NE(
data,
nullptr);
255 for (
int index = 0; index <
SIZE; index++) {
271 std::cout <<
"Skipping compute shader test: platform not supported";
276 const char *compute_glsl = R
"(
278 layout(local_size_x = 1) in;
280 layout(std430, binding = 0) buffer ssboBinding0
284 layout(std430, binding = 1) buffer ssboBinding1
295 EXPECT_NE(shader,
nullptr);
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
bool GPU_compute_shader_support(void)
void GPU_compute_dispatch(GPUShader *shader, uint groups_x_len, uint groups_y_len, uint groups_z_len)
struct GPUIndexBuf GPUIndexBuf
GPUIndexBuf * GPU_indexbuf_build_on_device(uint index_len)
void GPU_indexbuf_bind_as_ssbo(GPUIndexBuf *elem, int binding)
const uint32_t * GPU_indexbuf_read(GPUIndexBuf *elem)
void GPU_indexbuf_discard(GPUIndexBuf *elem)
void GPU_shader_unbind(void)
struct GPUShader GPUShader
void GPU_shader_bind(GPUShader *shader)
GPUShader * GPU_shader_create_compute(const char *computecode, const char *libcode, const char *defines, const char *shname)
int GPU_shader_get_texture_binding(GPUShader *shader, const char *name)
void GPU_shader_free(GPUShader *shader)
int GPU_shader_get_ssbo(GPUShader *shader, const char *name)
void GPU_memory_barrier(eGPUBarrier barrier)
@ GPU_BARRIER_SHADER_STORAGE
@ GPU_BARRIER_TEXTURE_FETCH
void GPU_texture_image_bind(GPUTexture *tex, int unit)
GPUTexture * GPU_texture_create_1d(const char *name, int w, int mip_len, eGPUTextureFormat format, const float *data)
struct GPUTexture GPUTexture
void * GPU_texture_read(GPUTexture *tex, eGPUDataFormat data_format, int miplvl)
void GPU_texture_free(GPUTexture *tex)
void GPU_texture_unbind(GPUTexture *tex)
GPUTexture * GPU_texture_create_2d(const char *name, int w, int h, int mip_len, eGPUTextureFormat format, const float *data)
void GPU_vertbuf_discard(GPUVertBuf *)
struct GPUVertBuf GPUVertBuf
void GPU_vertbuf_data_alloc(GPUVertBuf *, uint v_len)
void GPU_vertbuf_bind_as_ssbo(struct GPUVertBuf *verts, int binding)
const void * GPU_vertbuf_read(GPUVertBuf *verts)
GPUVertBuf * GPU_vertbuf_create_with_format_ex(const GPUVertFormat *, GPUUsageType)
Read Guarded memory(de)allocation.
#define GPU_TEST(test_name)
void(* MEM_freeN)(void *vmemh)
static void test_gpu_shader_compute_vbo()
static void test_gpu_shader_ssbo_binding()
static void test_gpu_shader_compute_2d()
static void test_gpu_shader_compute_1d()
static void test_gpu_shader_compute_ibo()