|
@@ -1,3 +1,4 @@
|
|
|
|
|
+
|
|
|
// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
|
|
// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
|
|
|
// All rights reserved.
|
|
// All rights reserved.
|
|
|
// Code licensed under the BSD License.
|
|
// Code licensed under the BSD License.
|
|
@@ -6,6 +7,7 @@
|
|
|
#include <Tests/Framework/Framework.h>
|
|
#include <Tests/Framework/Framework.h>
|
|
|
#include <AnKi/Gr.h>
|
|
#include <AnKi/Gr.h>
|
|
|
#include <AnKi/Core/NativeWindow.h>
|
|
#include <AnKi/Core/NativeWindow.h>
|
|
|
|
|
+#include <AnKi/Input/Input.h>
|
|
|
#include <AnKi/Core/ConfigSet.h>
|
|
#include <AnKi/Core/ConfigSet.h>
|
|
|
#include <AnKi/Util/HighRezTimer.h>
|
|
#include <AnKi/Util/HighRezTimer.h>
|
|
|
#include <AnKi/Core/StagingGpuMemoryManager.h>
|
|
#include <AnKi/Core/StagingGpuMemoryManager.h>
|
|
@@ -174,43 +176,6 @@ void main()
|
|
|
out_color = texture(u_tex0, in_uv);
|
|
out_color = texture(u_tex0, in_uv);
|
|
|
})";
|
|
})";
|
|
|
|
|
|
|
|
-static const char* FRAG_2TEX_SRC = R"(layout (location = 0) out vec4 out_color;
|
|
|
|
|
-
|
|
|
|
|
-layout(location = 0) in vec2 in_uv;
|
|
|
|
|
-
|
|
|
|
|
-layout(set = 0, binding = 0) uniform sampler2D u_tex0;
|
|
|
|
|
-layout(set = 0, binding = 1) uniform sampler2D u_tex1;
|
|
|
|
|
-
|
|
|
|
|
-void main()
|
|
|
|
|
-{
|
|
|
|
|
- if(gl_FragCoord.x < 1024 / 2)
|
|
|
|
|
- {
|
|
|
|
|
- if(gl_FragCoord.y < 768 / 2)
|
|
|
|
|
- {
|
|
|
|
|
- vec2 uv = in_uv * 2.0;
|
|
|
|
|
- out_color = textureLod(u_tex0, uv, 0.0);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- vec2 uv = in_uv * 2.0 - vec2(0.0, 1.0);
|
|
|
|
|
- out_color = textureLod(u_tex0, uv, 1.0);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- if(gl_FragCoord.y < 768 / 2)
|
|
|
|
|
- {
|
|
|
|
|
- vec2 uv = in_uv * 2.0 - vec2(1.0, 0.0);
|
|
|
|
|
- out_color = textureLod(u_tex1, uv, 0.0);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- vec2 uv = in_uv * 2.0 - vec2(1.0, 1.0);
|
|
|
|
|
- out_color = textureLod(u_tex1, uv, 1.0);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-})";
|
|
|
|
|
-
|
|
|
|
|
static const char* FRAG_TEX3D_SRC = R"(layout (location = 0) out vec4 out_color;
|
|
static const char* FRAG_TEX3D_SRC = R"(layout (location = 0) out vec4 out_color;
|
|
|
|
|
|
|
|
layout(set = 0, binding = 0) uniform u0_
|
|
layout(set = 0, binding = 0) uniform u0_
|
|
@@ -288,6 +253,7 @@ void main()
|
|
|
static NativeWindow* win = nullptr;
|
|
static NativeWindow* win = nullptr;
|
|
|
static GrManager* gr = nullptr;
|
|
static GrManager* gr = nullptr;
|
|
|
static StagingGpuMemoryManager* stagingMem = nullptr;
|
|
static StagingGpuMemoryManager* stagingMem = nullptr;
|
|
|
|
|
+static Input* input = nullptr;
|
|
|
|
|
|
|
|
#define COMMON_BEGIN() \
|
|
#define COMMON_BEGIN() \
|
|
|
stagingMem = new StagingGpuMemoryManager(); \
|
|
stagingMem = new StagingGpuMemoryManager(); \
|
|
@@ -299,6 +265,8 @@ static StagingGpuMemoryManager* stagingMem = nullptr;
|
|
|
cfg.set("gr_rayTracing", true); \
|
|
cfg.set("gr_rayTracing", true); \
|
|
|
cfg.set("gr_debugMarkers", true); \
|
|
cfg.set("gr_debugMarkers", true); \
|
|
|
win = createWindow(cfg); \
|
|
win = createWindow(cfg); \
|
|
|
|
|
+ input = new Input(); \
|
|
|
|
|
+ ANKI_TEST_EXPECT_NO_ERR(input->init(win)); \
|
|
|
gr = createGrManager(cfg, win); \
|
|
gr = createGrManager(cfg, win); \
|
|
|
ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg)); \
|
|
ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg)); \
|
|
|
TransferGpuAllocator* transfAlloc = new TransferGpuAllocator(); \
|
|
TransferGpuAllocator* transfAlloc = new TransferGpuAllocator(); \
|
|
@@ -313,6 +281,7 @@ static StagingGpuMemoryManager* stagingMem = nullptr;
|
|
|
delete transfAlloc; \
|
|
delete transfAlloc; \
|
|
|
delete stagingMem; \
|
|
delete stagingMem; \
|
|
|
GrManager::deleteInstance(gr); \
|
|
GrManager::deleteInstance(gr); \
|
|
|
|
|
+ delete input; \
|
|
|
delete win; \
|
|
delete win; \
|
|
|
win = nullptr; \
|
|
win = nullptr; \
|
|
|
gr = nullptr; \
|
|
gr = nullptr; \
|
|
@@ -510,7 +479,7 @@ ANKI_TEST(Gr, SimpleDrawcall)
|
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK;
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK;
|
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
|
|
|
|
|
|
- cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
|
|
+ cmdb->setViewport(0, 0, win->getWidth(), win->getHeight());
|
|
|
cmdb->bindShaderProgram(prog);
|
|
cmdb->bindShaderProgram(prog);
|
|
|
presentBarrierA(cmdb, presentTex);
|
|
presentBarrierA(cmdb, presentTex);
|
|
|
cmdb->beginRenderPass(fb, {{TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}}, {});
|
|
cmdb->beginRenderPass(fb, {{TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}}, {});
|
|
@@ -703,8 +672,8 @@ ANKI_TEST(Gr, ViewportAndScissorOffscreen)
|
|
|
cmdb->endRenderPass();
|
|
cmdb->endRenderPass();
|
|
|
|
|
|
|
|
// Draw onscreen
|
|
// Draw onscreen
|
|
|
- cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
- cmdb->setScissor(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
|
|
+ cmdb->setViewport(0, 0, win->getWidth(), win->getHeight());
|
|
|
|
|
+ cmdb->setScissor(0, 0, win->getWidth(), win->getHeight());
|
|
|
cmdb->bindShaderProgram(blitProg);
|
|
cmdb->bindShaderProgram(blitProg);
|
|
|
cmdb->setTextureSurfaceBarrier(rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
cmdb->setTextureSurfaceBarrier(rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
TextureUsageBit::SAMPLED_FRAGMENT, TextureSurfaceInfo(0, 0, 0, 0));
|
|
TextureUsageBit::SAMPLED_FRAGMENT, TextureSurfaceInfo(0, 0, 0, 0));
|
|
@@ -734,10 +703,17 @@ ANKI_TEST(Gr, Buffer)
|
|
|
{
|
|
{
|
|
|
COMMON_BEGIN()
|
|
COMMON_BEGIN()
|
|
|
|
|
|
|
|
- BufferPtr a = gr->newBuffer(BufferInitInfo(512, BufferUsageBit::ALL_UNIFORM, BufferMapAccessBit::NONE));
|
|
|
|
|
|
|
+ BufferInitInfo buffInit("a");
|
|
|
|
|
+ buffInit.m_size = 512;
|
|
|
|
|
+ buffInit.m_usage = BufferUsageBit::ALL_UNIFORM;
|
|
|
|
|
+ buffInit.m_mapAccess = BufferMapAccessBit::NONE;
|
|
|
|
|
+ BufferPtr a = gr->newBuffer(buffInit);
|
|
|
|
|
|
|
|
- BufferPtr b = gr->newBuffer(
|
|
|
|
|
- BufferInitInfo(64, BufferUsageBit::ALL_STORAGE, BufferMapAccessBit::WRITE | BufferMapAccessBit::READ));
|
|
|
|
|
|
|
+ buffInit.setName("b");
|
|
|
|
|
+ buffInit.m_size = 64;
|
|
|
|
|
+ buffInit.m_usage = BufferUsageBit::ALL_STORAGE;
|
|
|
|
|
+ buffInit.m_mapAccess = BufferMapAccessBit::WRITE | BufferMapAccessBit::READ;
|
|
|
|
|
+ BufferPtr b = gr->newBuffer(buffInit);
|
|
|
|
|
|
|
|
void* ptr = b->map(0, 64, BufferMapAccessBit::WRITE);
|
|
void* ptr = b->map(0, 64, BufferMapAccessBit::WRITE);
|
|
|
ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
|
|
@@ -785,7 +761,7 @@ ANKI_TEST(Gr, DrawWithUniforms)
|
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK;
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK;
|
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
|
|
|
|
|
|
- cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
|
|
+ cmdb->setViewport(0, 0, win->getWidth(), win->getHeight());
|
|
|
cmdb->bindShaderProgram(prog);
|
|
cmdb->bindShaderProgram(prog);
|
|
|
presentBarrierA(cmdb, presentTex);
|
|
presentBarrierA(cmdb, presentTex);
|
|
|
cmdb->beginRenderPass(fb, {TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}, {});
|
|
cmdb->beginRenderPass(fb, {TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}, {});
|
|
@@ -875,7 +851,7 @@ ANKI_TEST(Gr, DrawWithVertex)
|
|
|
cmdb->setVertexAttribute(1, 0, Format::R8G8B8_UNORM, sizeof(Vec3));
|
|
cmdb->setVertexAttribute(1, 0, Format::R8G8B8_UNORM, sizeof(Vec3));
|
|
|
cmdb->setVertexAttribute(2, 1, Format::R32G32B32_SFLOAT, 0);
|
|
cmdb->setVertexAttribute(2, 1, Format::R32G32B32_SFLOAT, 0);
|
|
|
|
|
|
|
|
- cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
|
|
+ cmdb->setViewport(0, 0, win->getWidth(), win->getHeight());
|
|
|
cmdb->setPolygonOffset(0.0, 0.0);
|
|
cmdb->setPolygonOffset(0.0, 0.0);
|
|
|
cmdb->bindShaderProgram(prog);
|
|
cmdb->bindShaderProgram(prog);
|
|
|
presentBarrierA(cmdb, presentTex);
|
|
presentBarrierA(cmdb, presentTex);
|
|
@@ -1040,6 +1016,47 @@ ANKI_TEST(Gr, DrawWithTexture)
|
|
|
//
|
|
//
|
|
|
// Create prog
|
|
// Create prog
|
|
|
//
|
|
//
|
|
|
|
|
+ static const char* FRAG_2TEX_SRC = R"(layout (location = 0) out vec4 out_color;
|
|
|
|
|
+
|
|
|
|
|
+layout(location = 0) in vec2 in_uv;
|
|
|
|
|
+
|
|
|
|
|
+layout(set = 0, binding = 0) uniform sampler2D u_tex0;
|
|
|
|
|
+layout(set = 0, binding = 1) uniform sampler2D u_tex1;
|
|
|
|
|
+
|
|
|
|
|
+layout(push_constant) uniform b_pc
|
|
|
|
|
+{
|
|
|
|
|
+ Vec4 u_viewport;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+void main()
|
|
|
|
|
+{
|
|
|
|
|
+ if(gl_FragCoord.x < u_viewport.x / 2.0)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(gl_FragCoord.y < u_viewport.y / 2.0)
|
|
|
|
|
+ {
|
|
|
|
|
+ vec2 uv = in_uv * 2.0;
|
|
|
|
|
+ out_color = textureLod(u_tex0, uv, 0.0);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ vec2 uv = in_uv * 2.0 - vec2(0.0, 1.0);
|
|
|
|
|
+ out_color = textureLod(u_tex0, uv, 1.0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if(gl_FragCoord.y < u_viewport.y / 2.0)
|
|
|
|
|
+ {
|
|
|
|
|
+ vec2 uv = in_uv * 2.0 - vec2(1.0, 0.0);
|
|
|
|
|
+ out_color = textureLod(u_tex1, uv, 0.0);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ vec2 uv = in_uv * 2.0 - vec2(1.0, 1.0);
|
|
|
|
|
+ out_color = textureLod(u_tex1, uv, 1.0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+})";
|
|
|
ShaderProgramPtr prog = createProgram(VERT_QUAD_SRC, FRAG_2TEX_SRC, *gr);
|
|
ShaderProgramPtr prog = createProgram(VERT_QUAD_SRC, FRAG_2TEX_SRC, *gr);
|
|
|
|
|
|
|
|
//
|
|
//
|
|
@@ -1059,11 +1076,14 @@ ANKI_TEST(Gr, DrawWithTexture)
|
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK | CommandBufferFlag::SMALL_BATCH;
|
|
cinit.m_flags = CommandBufferFlag::GENERAL_WORK | CommandBufferFlag::SMALL_BATCH;
|
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
|
|
|
|
|
|
|
|
- cmdb->setViewport(0, 0, WIDTH, HEIGHT);
|
|
|
|
|
|
|
+ cmdb->setViewport(0, 0, win->getWidth(), win->getHeight());
|
|
|
cmdb->bindShaderProgram(prog);
|
|
cmdb->bindShaderProgram(prog);
|
|
|
presentBarrierA(cmdb, presentTex);
|
|
presentBarrierA(cmdb, presentTex);
|
|
|
cmdb->beginRenderPass(fb, {TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}, {});
|
|
cmdb->beginRenderPass(fb, {TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}, {});
|
|
|
|
|
|
|
|
|
|
+ Vec4 pc(F32(win->getWidth()), F32(win->getHeight()), 0.0f, 0.0f);
|
|
|
|
|
+ cmdb->setPushConstants(&pc, sizeof(pc));
|
|
|
|
|
+
|
|
|
cmdb->bindTextureAndSampler(0, 0, aView, sampler);
|
|
cmdb->bindTextureAndSampler(0, 0, aView, sampler);
|
|
|
cmdb->bindTextureAndSampler(0, 1, bView, sampler);
|
|
cmdb->bindTextureAndSampler(0, 1, bView, sampler);
|
|
|
cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 6);
|
|
cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 6);
|
|
@@ -2537,7 +2557,7 @@ void main()
|
|
|
}
|
|
}
|
|
|
)";
|
|
)";
|
|
|
|
|
|
|
|
- StringAuto fragSrc(HeapAllocator<U8>{allocAligned, nullptr});
|
|
|
|
|
|
|
+ StringAuto fragSrc(HeapAllocator<U8>(allocAligned, nullptr));
|
|
|
if(useRayTracing)
|
|
if(useRayTracing)
|
|
|
{
|
|
{
|
|
|
fragSrc.append("#define USE_RAY_TRACING 1\n");
|
|
fragSrc.append("#define USE_RAY_TRACING 1\n");
|