summaryrefslogtreecommitdiffstats
path: root/tests/manual/rhi/tessellation
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/rhi/tessellation')
-rw-r--r--tests/manual/rhi/tessellation/CMakeLists.txt5
-rw-r--r--tests/manual/rhi/tessellation/buildshaders.bat10
-rw-r--r--tests/manual/rhi/tessellation/tessellation.cpp78
-rw-r--r--tests/manual/rhi/tessellation/test.frag.qsbbin425 -> 729 bytes
-rw-r--r--tests/manual/rhi/tessellation/test.tesc6
-rw-r--r--tests/manual/rhi/tessellation/test.tesc.qsbbin840 -> 1765 bytes
-rw-r--r--tests/manual/rhi/tessellation/test.tese13
-rw-r--r--tests/manual/rhi/tessellation/test.tese.qsbbin1174 -> 2436 bytes
-rw-r--r--tests/manual/rhi/tessellation/test.vert.qsbbin527 -> 1106 bytes
-rw-r--r--tests/manual/rhi/tessellation/test_domain.hlsl38
-rw-r--r--tests/manual/rhi/tessellation/test_hull.hlsl40
11 files changed, 130 insertions, 60 deletions
diff --git a/tests/manual/rhi/tessellation/CMakeLists.txt b/tests/manual/rhi/tessellation/CMakeLists.txt
index 74752dbd96..bdb3d8d2f7 100644
--- a/tests/manual/rhi/tessellation/CMakeLists.txt
+++ b/tests/manual/rhi/tessellation/CMakeLists.txt
@@ -1,8 +1,11 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
qt_internal_add_manual_test(tessellation
GUI
SOURCES
tessellation.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
Qt::GuiPrivate
)
diff --git a/tests/manual/rhi/tessellation/buildshaders.bat b/tests/manual/rhi/tessellation/buildshaders.bat
index c44916067d..bc992dc28c 100644
--- a/tests/manual/rhi/tessellation/buildshaders.bat
+++ b/tests/manual/rhi/tessellation/buildshaders.bat
@@ -1,4 +1,6 @@
-qsb --glsl 320es,410 test.vert -o test.vert.qsb
-qsb --glsl 320es,410 test.tesc -o test.tesc.qsb
-qsb --glsl 320es,410 test.tese -o test.tese.qsb
-qsb --glsl 320es,410 test.frag -o test.frag.qsb
+qsb --glsl 320es,410 --hlsl 50 --msl 12 --msltess test.vert -o test.vert.qsb
+qsb --glsl 320es,410 --msl 12 --tess-mode triangles test.tesc -o test.tesc.qsb
+qsb -r hlsl,50,test_hull.hlsl test.tesc.qsb
+qsb --glsl 320es,410 --msl 12 --tess-vertex-count 3 test.tese -o test.tese.qsb
+qsb -r hlsl,50,test_domain.hlsl test.tese.qsb
+qsb --glsl 320es,410 --hlsl 50 --msl 12 test.frag -o test.frag.qsb
diff --git a/tests/manual/rhi/tessellation/tessellation.cpp b/tests/manual/rhi/tessellation/tessellation.cpp
index e8a031a1cf..a50ddeeeb2 100644
--- a/tests/manual/rhi/tessellation/tessellation.cpp
+++ b/tests/manual/rhi/tessellation/tessellation.cpp
@@ -1,52 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "../shared/examplefw.h"
@@ -56,9 +9,13 @@ static const float tri[] = {
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
};
+static const bool INDEXED = false;
+static const quint32 indices[] = { 0, 1, 2 };
+
struct {
QVector<QRhiResource *> releasePool;
QRhiBuffer *vbuf = nullptr;
+ QRhiBuffer *ibuf = nullptr;
QRhiBuffer *ubuf = nullptr;
QRhiShaderResourceBindings *srb = nullptr;
QRhiGraphicsPipeline *ps = nullptr;
@@ -76,6 +33,12 @@ void Window::customInit()
d.vbuf->create();
d.releasePool << d.vbuf;
+ if (INDEXED) {
+ d.ibuf = m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::IndexBuffer, sizeof(indices));
+ d.ibuf->create();
+ d.releasePool << d.ibuf;
+ }
+
d.ubuf = m_r->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, 64 + 4 + 4);
d.ubuf->create();
d.releasePool << d.ubuf;
@@ -100,6 +63,7 @@ void Window::customInit()
});
d.ps->setCullMode(QRhiGraphicsPipeline::Back);
+ d.ps->setPolygonMode(QRhiGraphicsPipeline::Line);
d.ps->setDepthTest(true);
d.ps->setDepthWrite(true);
QRhiVertexInputLayout inputLayout;
@@ -117,8 +81,12 @@ void Window::customInit()
d.initialUpdates = m_r->nextResourceUpdateBatch();
d.initialUpdates->uploadStaticBuffer(d.vbuf, tri);
+
const float amplitude = 0.5f;
d.initialUpdates->updateDynamicBuffer(d.ubuf, 68, 4, &amplitude);
+
+ if (INDEXED)
+ d.initialUpdates->uploadStaticBuffer(d.ibuf, indices);
}
void Window::customRelease()
@@ -142,14 +110,20 @@ void Window::customRender()
u->updateDynamicBuffer(d.ubuf, 0, 64, d.winProj.constData());
}
u->updateDynamicBuffer(d.ubuf, 64, 4, &d.time);
- d.time += 0.1f;
+ d.time += 0.01f;
cb->beginPass(m_sc->currentFrameRenderTarget(), m_clearColor, { 1.0f, 0 }, u);
cb->setGraphicsPipeline(d.ps);
cb->setViewport({ 0, 0, float(outputSizeInPixels.width()), float(outputSizeInPixels.height()) });
cb->setShaderResources();
QRhiCommandBuffer::VertexInput vbufBinding(d.vbuf, 0);
- cb->setVertexInput(0, 1, &vbufBinding);
- cb->draw(3);
+ if (INDEXED) {
+ cb->setVertexInput(0, 1, &vbufBinding, d.ibuf, 0, QRhiCommandBuffer::IndexUInt32);
+ cb->drawIndexed(3);
+ } else {
+ cb->setVertexInput(0, 1, &vbufBinding);
+ cb->draw(3);
+ }
+
cb->endPass();
}
diff --git a/tests/manual/rhi/tessellation/test.frag.qsb b/tests/manual/rhi/tessellation/test.frag.qsb
index d680373221..4d49ede3ff 100644
--- a/tests/manual/rhi/tessellation/test.frag.qsb
+++ b/tests/manual/rhi/tessellation/test.frag.qsb
Binary files differ
diff --git a/tests/manual/rhi/tessellation/test.tesc b/tests/manual/rhi/tessellation/test.tesc
index 9cbf9c12c7..54937967fa 100644
--- a/tests/manual/rhi/tessellation/test.tesc
+++ b/tests/manual/rhi/tessellation/test.tesc
@@ -6,6 +6,10 @@ layout(location = 0) in vec3 inColor[];
layout(location = 0) out vec3 outColor[];
+// these serve no purpose, just exist to test per-patch outputs
+layout(location = 1) patch out vec3 stuff;
+layout(location = 2) patch out float more_stuff;
+
void main()
{
if (gl_InvocationID == 0) {
@@ -18,4 +22,6 @@ void main()
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
outColor[gl_InvocationID] = inColor[gl_InvocationID];
+ stuff = vec3(1.0);
+ more_stuff = 1.0;
}
diff --git a/tests/manual/rhi/tessellation/test.tesc.qsb b/tests/manual/rhi/tessellation/test.tesc.qsb
index fc9dfbaea1..064e26040a 100644
--- a/tests/manual/rhi/tessellation/test.tesc.qsb
+++ b/tests/manual/rhi/tessellation/test.tesc.qsb
Binary files differ
diff --git a/tests/manual/rhi/tessellation/test.tese b/tests/manual/rhi/tessellation/test.tese
index c82344af8e..c50230f852 100644
--- a/tests/manual/rhi/tessellation/test.tese
+++ b/tests/manual/rhi/tessellation/test.tese
@@ -6,6 +6,10 @@ layout(location = 0) in vec3 inColor[];
layout(location = 0) out vec3 outColor;
+// these serve no purpose, just exist to test per-patch outputs
+layout(location = 1) patch in vec3 stuff;
+layout(location = 2) patch in float more_stuff;
+
layout(std140, binding = 0) uniform buf {
mat4 mvp;
float time;
@@ -14,7 +18,10 @@ layout(std140, binding = 0) uniform buf {
void main()
{
- gl_Position = mvp * ((gl_TessCoord.x * gl_in[0].gl_Position) + (gl_TessCoord.y * gl_in[1].gl_Position) + (gl_TessCoord.z * gl_in[2].gl_Position));
- gl_Position.x += sin(time + gl_Position.y) * amplitude;
- outColor = gl_TessCoord.x * inColor[0] + gl_TessCoord.y * inColor[1] + gl_TessCoord.z * inColor[2];
+ vec4 pos = (gl_TessCoord.x * gl_in[0].gl_Position) + (gl_TessCoord.y * gl_in[1].gl_Position) + (gl_TessCoord.z * gl_in[2].gl_Position);
+ gl_Position = mvp * pos;
+ gl_Position.x += sin(time + pos.y) * amplitude;
+ outColor = gl_TessCoord.x * inColor[0] + gl_TessCoord.y * inColor[1] + gl_TessCoord.z * inColor[2]
+ // these are all 1.0, just here to exercise the shader generation and the runtime pipeline setup
+ * stuff.x * more_stuff * (gl_TessLevelOuter[0] / 4.0) * (gl_TessLevelInner[0] / 4.0);
}
diff --git a/tests/manual/rhi/tessellation/test.tese.qsb b/tests/manual/rhi/tessellation/test.tese.qsb
index fe99cd5001..a6caab67c3 100644
--- a/tests/manual/rhi/tessellation/test.tese.qsb
+++ b/tests/manual/rhi/tessellation/test.tese.qsb
Binary files differ
diff --git a/tests/manual/rhi/tessellation/test.vert.qsb b/tests/manual/rhi/tessellation/test.vert.qsb
index 18f2e7b297..39734b6d5d 100644
--- a/tests/manual/rhi/tessellation/test.vert.qsb
+++ b/tests/manual/rhi/tessellation/test.vert.qsb
Binary files differ
diff --git a/tests/manual/rhi/tessellation/test_domain.hlsl b/tests/manual/rhi/tessellation/test_domain.hlsl
new file mode 100644
index 0000000000..a9697d32cf
--- /dev/null
+++ b/tests/manual/rhi/tessellation/test_domain.hlsl
@@ -0,0 +1,38 @@
+struct Input
+{
+ float edges[3] : SV_TessFactor;
+ float inside : SV_InsideTessFactor;
+};
+
+struct PatchInput
+{
+ float3 position : POSITION;
+ float3 color : COLOR;
+};
+
+struct PixelInput
+{
+ float3 color : TEXCOORD0;
+ float4 position : SV_POSITION;
+};
+
+cbuffer buf : register(b0)
+{
+ row_major float4x4 mvp : packoffset(c0);
+ float time : packoffset(c4);
+ float amplitude : packoffset(c4.y);
+};
+
+[domain("tri")]
+PixelInput main(Input input, float3 uvwCoord : SV_DomainLocation, const OutputPatch<PatchInput, 3> patch)
+{
+ PixelInput output;
+
+ float3 vertexPosition = uvwCoord.x * patch[0].position + uvwCoord.y * patch[1].position + uvwCoord.z * patch[2].position;
+ output.position = mul(float4(vertexPosition, 1.0f), mvp);
+ output.position.x += sin(time + vertexPosition.y) * amplitude;
+
+ output.color = uvwCoord.x * patch[0].color + uvwCoord.y * patch[1].color + uvwCoord.z * patch[2].color;
+
+ return output;
+}
diff --git a/tests/manual/rhi/tessellation/test_hull.hlsl b/tests/manual/rhi/tessellation/test_hull.hlsl
new file mode 100644
index 0000000000..3d09307159
--- /dev/null
+++ b/tests/manual/rhi/tessellation/test_hull.hlsl
@@ -0,0 +1,40 @@
+struct Input
+{
+ float3 color : TEXCOORD0;
+ float4 position : SV_Position;
+};
+
+struct Output
+{
+ float3 position : POSITION;
+ float3 color : COLOR;
+};
+
+struct ConstantData
+{
+ float edges[3] : SV_TessFactor;
+ float inside : SV_InsideTessFactor;
+};
+
+ConstantData patchConstFunc(InputPatch<Input, 3> ip, uint PatchID : SV_PrimitiveID )
+{
+ ConstantData d;
+ d.edges[0] = 4.0;
+ d.edges[1] = 4.0;
+ d.edges[2] = 4.0;
+ d.inside = 4.0;
+ return d;
+}
+
+[domain("tri")]
+[partitioning("integer")]
+[outputtopology("triangle_cw")]
+[outputcontrolpoints(3)]
+[patchconstantfunc("patchConstFunc")]
+Output main(InputPatch<Input, 3> patch, uint pointId : SV_OutputControlPointID, uint patchId : SV_PrimitiveID)
+{
+ Output output;
+ output.position = patch[pointId].position;
+ output.color = patch[pointId].color;
+ return output;
+}