Skip to content

Commit

Permalink
Add depth clamping unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
Chainsawkitten committed May 5, 2023
1 parent d7c3c44 commit d600613
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 1 deletion.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2015-2022 Albin Bernhardsson
Copyright (c) 2015-2023 Albin Bernhardsson

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ set(IMAGES
Video/references/ComputeClearBuffer.png
Video/references/ComputeSetBuffer.png
Video/references/ConservativeRasterization.png
Video/references/DepthClamping.png
Video/references/DepthPrePass.png
Video/references/DrawLines.png
Video/references/DrawMipmappedTriangle.png
Expand Down
121 changes: 121 additions & 0 deletions tests/Video/DrawTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@

#include "ConservativeRasterization.png.hpp"

#include "DepthClamping.png.hpp"

using namespace Video;

static const unsigned int imageSize = 64;
Expand Down Expand Up @@ -1298,3 +1300,122 @@ bool ConservativeRasterization(void* data) {

return result;
}

bool DepthClamping(void* data) {
assert(data != nullptr);

LowLevelRenderer* lowLevelRenderer = *static_cast<LowLevelRenderer**>(data);

// Create render texture.
Texture* renderTexture = lowLevelRenderer->CreateRenderTarget(glm::uvec2(imageSize, imageSize), Texture::Format::R8G8B8A8);

// Create shaders.
Shader* vertexShader = lowLevelRenderer->CreateShader(DRAWVERTEXTRIANGLE_VERT, Shader::Type::VERTEX_SHADER);
Shader* fragmentShader = lowLevelRenderer->CreateShader(DRAWTRIANGLE_FRAG, Shader::Type::FRAGMENT_SHADER);
ShaderProgram* shaderProgram = lowLevelRenderer->CreateShaderProgram({ vertexShader, fragmentShader });

// Create vertex description.
VertexDescription* vertexDescription;
{
// Position.
VertexDescription::Attribute attributes[2];
attributes[0].size = 3;
attributes[0].type = VertexDescription::AttributeType::FLOAT;
attributes[0].normalized = false;

// Color.
attributes[1].size = 3;
attributes[1].type = VertexDescription::AttributeType::FLOAT;
attributes[1].normalized = false;

vertexDescription = lowLevelRenderer->CreateVertexDescription(2, attributes);
}

// Create graphics pipeline.
GraphicsPipeline::Configuration configuration = {};
configuration.primitiveType = PrimitiveType::TRIANGLE;
configuration.polygonMode = PolygonMode::FILL;
configuration.cullFace = CullFace::BACK;
configuration.blendMode = BlendMode::NONE;
configuration.depthMode = DepthMode::NONE;

GraphicsPipeline* graphicsPipeline[2];
graphicsPipeline[0] = lowLevelRenderer->CreateGraphicsPipeline(shaderProgram, configuration, vertexDescription);

configuration.depthClamp = true;

graphicsPipeline[1] = lowLevelRenderer->CreateGraphicsPipeline(shaderProgram, configuration, vertexDescription);

// Create vertex buffer.
Buffer* vertexBuffer[2];
{
// x, y, z, r, g, b
float vertexData[] = {
-0.5f, -0.5f, 2.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.5f, 2.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.5f, 2.0f, 1.0f, 0.0f, 0.0f
};

vertexBuffer[0] = lowLevelRenderer->CreateBuffer(Buffer::BufferUsage::VERTEX_BUFFER, sizeof(vertexData), vertexData);
}

{
// x, y, z, r, g, b
float vertexData[] = {
0.5f, -0.5f, 2.0f, 0.0f, 1.0f, 0.0f,
1.0f, 0.5f, 2.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.5f, 2.0f, 0.0f, 1.0f, 0.0f
};

vertexBuffer[1] = lowLevelRenderer->CreateBuffer(Buffer::BufferUsage::VERTEX_BUFFER, sizeof(vertexData), vertexData);
}

// Create geometry binding.
GeometryBinding* geometryBinding[2];
geometryBinding[0] = lowLevelRenderer->CreateGeometryBinding(vertexDescription, vertexBuffer[0]);
geometryBinding[1] = lowLevelRenderer->CreateGeometryBinding(vertexDescription, vertexBuffer[1]);

// Create command buffer.
CommandBuffer* commandBuffer = lowLevelRenderer->CreateCommandBuffer();

// Record command buffer.
commandBuffer->BeginRenderPass(renderTexture);
commandBuffer->BindGraphicsPipeline(graphicsPipeline[0]);
commandBuffer->SetViewportAndScissor(glm::uvec2(0, 0), glm::uvec2(imageSize, imageSize));
commandBuffer->BindGeometry(geometryBinding[0]);
commandBuffer->Draw(3);
commandBuffer->BindGraphicsPipeline(graphicsPipeline[1]);
commandBuffer->SetViewportAndScissor(glm::uvec2(0, 0), glm::uvec2(imageSize, imageSize));
commandBuffer->BindGeometry(geometryBinding[1]);
commandBuffer->Draw(3);
commandBuffer->EndRenderPass();

// Submit the command buffer.
lowLevelRenderer->Submit(commandBuffer);

// Wait for rendering to finish.
lowLevelRenderer->Wait();

// Image verification.
ImageVerification imageVerification(lowLevelRenderer, renderTexture);
bool result = imageVerification.Compare(DEPTHCLAMPING_PNG, DEPTHCLAMPING_PNG_LENGTH);
if (!result) {
imageVerification.WritePNG("DepthClamping.png");
}

// Cleanup
delete commandBuffer;
delete geometryBinding[0];
delete geometryBinding[1];
delete vertexBuffer[0];
delete vertexBuffer[1];
delete graphicsPipeline[0];
delete graphicsPipeline[1];
delete vertexDescription;
lowLevelRenderer->FreeRenderTarget(renderTexture);
delete shaderProgram;
delete vertexShader;
delete fragmentShader;

return result;
}
1 change: 1 addition & 0 deletions tests/Video/VideoSuite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ VideoSuite::VideoSuite(Video::Renderer::GraphicsAPI graphicsAPI) : TestSuite("Vi
AddTest("DrawLines", DrawLines, &lowLevelRenderer);
AddTest("Attachmentless", Attachmentless, &lowLevelRenderer);
AddTest("ConservativeRasterization", ConservativeRasterization, &lowLevelRenderer);
AddTest("DepthClamping", DepthClamping, &lowLevelRenderer);

AddTest("MultipleFrames", MultipleFrames, &lowLevelRenderer);

Expand Down
8 changes: 8 additions & 0 deletions tests/Video/VideoSuite.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,14 @@ bool Attachmentless(void* data);
*/
bool ConservativeRasterization(void* data);

/// Test depth clamping.
/**
* @param data The low-level renderer.
*
* @return Whether the test was successful.
*/
bool DepthClamping(void* data);

/// Test rendering multiple frames.
/**
* @param data The low-level renderer.
Expand Down
Binary file added tests/Video/references/DepthClamping.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit d600613

Please sign in to comment.