|
@@ -16,26 +16,43 @@ const U WIDTH = 1024;
|
|
|
const U HEIGHT = 768;
|
|
const U HEIGHT = 768;
|
|
|
|
|
|
|
|
static const char* VERT_SRC = R"(
|
|
static const char* VERT_SRC = R"(
|
|
|
|
|
+out gl_PerVertex
|
|
|
|
|
+{
|
|
|
|
|
+ vec4 gl_Position;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-#if defined(ANKI_GL)
|
|
|
|
|
-#define gl_VertexIndex gl_VertexID
|
|
|
|
|
-#elif defined(ANKI_VK)
|
|
|
|
|
-// Do nothing
|
|
|
|
|
-#else
|
|
|
|
|
-#error See file
|
|
|
|
|
|
|
+void main()
|
|
|
|
|
+{
|
|
|
|
|
+ const vec2 POSITIONS[3] =
|
|
|
|
|
+ vec2[](vec2(-1.0, 1.0), vec2(0.0, -1.0), vec2(1.0, 1.0));
|
|
|
|
|
+
|
|
|
|
|
+ gl_Position = vec4(POSITIONS[gl_VertexID % 3], 0.0, 1.0);
|
|
|
|
|
+#if defined(ANKI_VK)
|
|
|
|
|
+ gl_Position.y = -gl_Position.y;
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+})";
|
|
|
|
|
|
|
|
|
|
+static const char* VERT_UBO_SRC = R"(
|
|
|
out gl_PerVertex
|
|
out gl_PerVertex
|
|
|
{
|
|
{
|
|
|
vec4 gl_Position;
|
|
vec4 gl_Position;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+layout(ANKI_UBO_BINDING(0, 0)) uniform u0_
|
|
|
|
|
+{
|
|
|
|
|
+ vec4 u_color[3];
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+out vec3 out_color;
|
|
|
|
|
+
|
|
|
void main()
|
|
void main()
|
|
|
{
|
|
{
|
|
|
const vec2 POSITIONS[3] =
|
|
const vec2 POSITIONS[3] =
|
|
|
vec2[](vec2(-1.0, 1.0), vec2(0.0, -1.0), vec2(1.0, 1.0));
|
|
vec2[](vec2(-1.0, 1.0), vec2(0.0, -1.0), vec2(1.0, 1.0));
|
|
|
|
|
+
|
|
|
|
|
+ out_color = u_color[gl_VertexID].rgb;
|
|
|
|
|
|
|
|
- gl_Position = vec4(POSITIONS[gl_VertexIndex % 3], 0.0, 1.0);
|
|
|
|
|
|
|
+ gl_Position = vec4(POSITIONS[gl_VertexID % 3], 0.0, 1.0);
|
|
|
#if defined(ANKI_VK)
|
|
#if defined(ANKI_VK)
|
|
|
gl_Position.y = -gl_Position.y;
|
|
gl_Position.y = -gl_Position.y;
|
|
|
#endif
|
|
#endif
|
|
@@ -48,6 +65,15 @@ void main()
|
|
|
out_color = vec4(0.5);
|
|
out_color = vec4(0.5);
|
|
|
})";
|
|
})";
|
|
|
|
|
|
|
|
|
|
+static const char* FRAG_UBO_SRC = R"(layout (location = 0) out vec4 out_color;
|
|
|
|
|
+
|
|
|
|
|
+in vec3 in_color;
|
|
|
|
|
+
|
|
|
|
|
+void main()
|
|
|
|
|
+{
|
|
|
|
|
+ out_color = vec4(in_color, 1.0);
|
|
|
|
|
+})";
|
|
|
|
|
+
|
|
|
#define COMMON_BEGIN() \
|
|
#define COMMON_BEGIN() \
|
|
|
NativeWindow* win = nullptr; \
|
|
NativeWindow* win = nullptr; \
|
|
|
GrManager* gr = nullptr; \
|
|
GrManager* gr = nullptr; \
|
|
@@ -201,12 +227,123 @@ ANKI_TEST(Gr, Buffer)
|
|
|
BufferPtr a = gr->newInstance<Buffer>(
|
|
BufferPtr a = gr->newInstance<Buffer>(
|
|
|
512, BufferUsageBit::UNIFORM, BufferAccessBit::NONE);
|
|
512, BufferUsageBit::UNIFORM, BufferAccessBit::NONE);
|
|
|
|
|
|
|
|
- BufferPtr b = gr->newInstance<Buffer>(
|
|
|
|
|
- 64, BufferUsageBit::STORAGE, BufferAccessBit::CLIENT_MAP_WRITE);
|
|
|
|
|
|
|
+ BufferPtr b = gr->newInstance<Buffer>(64,
|
|
|
|
|
+ BufferUsageBit::STORAGE,
|
|
|
|
|
+ BufferAccessBit::CLIENT_MAP_WRITE
|
|
|
|
|
+ | BufferAccessBit::CLIENT_MAP_READ);
|
|
|
|
|
|
|
|
void* ptr = b->map(0, 64, BufferAccessBit::CLIENT_MAP_WRITE);
|
|
void* ptr = b->map(0, 64, BufferAccessBit::CLIENT_MAP_WRITE);
|
|
|
ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
|
|
|
+ U8 ptr2[64];
|
|
|
|
|
+ memset(ptr, 0xCC, 64);
|
|
|
|
|
+ memset(ptr2, 0xCC, 64);
|
|
|
|
|
+ b->unmap();
|
|
|
|
|
+
|
|
|
|
|
+ ptr = b->map(0, 64, BufferAccessBit::CLIENT_MAP_READ);
|
|
|
|
|
+ ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
|
|
|
+ ANKI_TEST_EXPECT_EQ(memcmp(ptr, ptr2, 64), 0);
|
|
|
|
|
+ b->unmap();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ COMMON_END();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//==============================================================================
|
|
|
|
|
+ANKI_TEST(Gr, ResourceGroup)
|
|
|
|
|
+{
|
|
|
|
|
+ COMMON_BEGIN();
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ BufferPtr b = gr->newInstance<Buffer>(sizeof(F32) * 4,
|
|
|
|
|
+ BufferUsageBit::UNIFORM,
|
|
|
|
|
+ BufferAccessBit::CLIENT_MAP_WRITE);
|
|
|
|
|
+
|
|
|
|
|
+ ResourceGroupInitInfo rcinit;
|
|
|
|
|
+ rcinit.m_uniformBuffers[0].m_buffer = b;
|
|
|
|
|
+ ResourceGroupPtr rc = gr->newInstance<ResourceGroup>(rcinit);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ COMMON_END();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//==============================================================================
|
|
|
|
|
+ANKI_TEST(Gr, DrawWithUniforms)
|
|
|
|
|
+{
|
|
|
|
|
+ COMMON_BEGIN();
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ // The buffer
|
|
|
|
|
+ BufferPtr b = gr->newInstance<Buffer>(sizeof(Vec4) * 3,
|
|
|
|
|
+ BufferUsageBit::UNIFORM,
|
|
|
|
|
+ BufferAccessBit::CLIENT_MAP_WRITE);
|
|
|
|
|
+
|
|
|
|
|
+ Vec4* ptr = static_cast<Vec4*>(
|
|
|
|
|
+ b->map(0, sizeof(Vec4) * 3, BufferAccessBit::CLIENT_MAP_WRITE));
|
|
|
|
|
+ ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
|
|
|
+ ptr[0] = Vec4(1.0, 0.0, 0.0, 0.0);
|
|
|
|
|
+ ptr[1] = Vec4(0.0, 1.0, 0.0, 0.0);
|
|
|
|
|
+ ptr[2] = Vec4(0.0, 0.0, 1.0, 0.0);
|
|
|
b->unmap();
|
|
b->unmap();
|
|
|
|
|
+
|
|
|
|
|
+ // Resource group
|
|
|
|
|
+ ResourceGroupInitInfo rcinit;
|
|
|
|
|
+ rcinit.m_uniformBuffers[0].m_buffer = b;
|
|
|
|
|
+ ResourceGroupPtr rc = gr->newInstance<ResourceGroup>(rcinit);
|
|
|
|
|
+
|
|
|
|
|
+ // Shaders
|
|
|
|
|
+ ShaderPtr vert =
|
|
|
|
|
+ gr->newInstance<Shader>(ShaderType::VERTEX, VERT_UBO_SRC);
|
|
|
|
|
+ ShaderPtr frag =
|
|
|
|
|
+ gr->newInstance<Shader>(ShaderType::FRAGMENT, FRAG_UBO_SRC);
|
|
|
|
|
+
|
|
|
|
|
+ // Ppline
|
|
|
|
|
+ PipelineInitInfo init;
|
|
|
|
|
+ init.m_shaders[ShaderType::VERTEX] = vert;
|
|
|
|
|
+ init.m_shaders[ShaderType::FRAGMENT] = frag;
|
|
|
|
|
+ init.m_color.m_drawsToDefaultFramebuffer = true;
|
|
|
|
|
+ init.m_color.m_attachmentCount = 1;
|
|
|
|
|
+ init.m_depthStencil.m_depthWriteEnabled = false;
|
|
|
|
|
+
|
|
|
|
|
+ PipelinePtr ppline = gr->newInstance<Pipeline>(init);
|
|
|
|
|
+
|
|
|
|
|
+ // FB
|
|
|
|
|
+ FramebufferInitInfo fbinit;
|
|
|
|
|
+ fbinit.m_colorAttachmentCount = 1;
|
|
|
|
|
+ fbinit.m_colorAttachments[0].m_clearValue.m_colorf = {
|
|
|
|
|
+ 1.0, 0.0, 1.0, 1.0};
|
|
|
|
|
+ FramebufferPtr fb = gr->newInstance<Framebuffer>(fbinit);
|
|
|
|
|
+
|
|
|
|
|
+ U iterations = 100;
|
|
|
|
|
+ while(--iterations)
|
|
|
|
|
+ {
|
|
|
|
|
+ HighRezTimer timer;
|
|
|
|
|
+ timer.start();
|
|
|
|
|
+
|
|
|
|
|
+ gr->beginFrame();
|
|
|
|
|
+
|
|
|
|
|
+ CommandBufferInitInfo cinit;
|
|
|
|
|
+ cinit.m_frameFirstCommandBuffer = true;
|
|
|
|
|
+ cinit.m_frameLastCommandBuffer = true;
|
|
|
|
|
+ CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit);
|
|
|
|
|
+
|
|
|
|
|
+ cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
+ cmdb->setPolygonOffset(0.0, 0.0);
|
|
|
|
|
+ cmdb->bindPipeline(ppline);
|
|
|
|
|
+ cmdb->beginRenderPass(fb);
|
|
|
|
|
+ cmdb->bindResourceGroup(rc, 0, nullptr);
|
|
|
|
|
+ cmdb->drawArrays(3);
|
|
|
|
|
+ cmdb->endRenderPass();
|
|
|
|
|
+ cmdb->flush();
|
|
|
|
|
+
|
|
|
|
|
+ gr->swapBuffers();
|
|
|
|
|
+
|
|
|
|
|
+ timer.stop();
|
|
|
|
|
+ const F32 TICK = 1.0 / 30.0;
|
|
|
|
|
+ if(timer.getElapsedTime() < TICK)
|
|
|
|
|
+ {
|
|
|
|
|
+ HighRezTimer::sleep(TICK - timer.getElapsedTime());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
COMMON_END();
|
|
COMMON_END();
|