diff options
author | Ben Fletcher <ben.fletcher@me.com> | 2022-01-25 16:59:03 -0800 |
---|---|---|
committer | Ben Fletcher <ben.fletcher@me.com> | 2022-01-31 08:52:05 -0800 |
commit | 1c3ae79ad36f77a044adb6264396e46575ee8757 (patch) | |
tree | ebcc8710d9a67ca8f426991cb1f7d2c17c92af7b /tests/manual | |
parent | 1d28fd7a9c4720289f3d41db2ed8e6fcb07d5a30 (diff) |
rhi: Add support for polygon fill mode
Support for Polygon Mode (Triangle Fill Mode in Metal, Fill Mode in D3D)
in the RHI graphics pipeline.
Options are Fill and Line
Status:
OpenGL - ok
Vulkan - ok
Metal - ok
D3D11 - ok
OpenGL ES - does not support glPolygonMode.
Change-Id: I20b7ef416624700c3dc8d1cbe6474f4ca3889db8
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'tests/manual')
-rw-r--r-- | tests/manual/rhi/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/manual/rhi/polygonmode/CMakeLists.txt | 20 | ||||
-rwxr-xr-x | tests/manual/rhi/polygonmode/buildshaders.bat | 2 | ||||
-rw-r--r-- | tests/manual/rhi/polygonmode/polygonmode.cpp | 148 | ||||
-rw-r--r-- | tests/manual/rhi/polygonmode/test.frag | 10 | ||||
-rw-r--r-- | tests/manual/rhi/polygonmode/test.frag.qsb | bin | 0 -> 769 bytes | |||
-rw-r--r-- | tests/manual/rhi/polygonmode/test.vert | 12 | ||||
-rw-r--r-- | tests/manual/rhi/polygonmode/test.vert.qsb | bin | 0 -> 930 bytes | |||
-rw-r--r-- | tests/manual/rhi/tessellation/tessellation.cpp | 1 |
9 files changed, 194 insertions, 0 deletions
diff --git a/tests/manual/rhi/CMakeLists.txt b/tests/manual/rhi/CMakeLists.txt index 5b756dbee3..b3bb4581c3 100644 --- a/tests/manual/rhi/CMakeLists.txt +++ b/tests/manual/rhi/CMakeLists.txt @@ -23,4 +23,5 @@ add_subdirectory(instancing) add_subdirectory(noninstanced) add_subdirectory(tex3d) add_subdirectory(texturearray) +add_subdirectory(polygonmode) add_subdirectory(tessellation) diff --git a/tests/manual/rhi/polygonmode/CMakeLists.txt b/tests/manual/rhi/polygonmode/CMakeLists.txt new file mode 100644 index 0000000000..ff2125d3a7 --- /dev/null +++ b/tests/manual/rhi/polygonmode/CMakeLists.txt @@ -0,0 +1,20 @@ +qt_internal_add_manual_test(polygonmode + GUI + SOURCES + polygonmode.cpp + PUBLIC_LIBRARIES + Qt::Gui + Qt::GuiPrivate +) + +set(polygonmode_resource_files + "test.vert.qsb" + "test.frag.qsb" +) + +qt_internal_add_resource(polygonmode "polygonmode" + PREFIX + "/" + FILES + ${polygonmode_resource_files} +) diff --git a/tests/manual/rhi/polygonmode/buildshaders.bat b/tests/manual/rhi/polygonmode/buildshaders.bat new file mode 100755 index 0000000000..3cd87ed7a2 --- /dev/null +++ b/tests/manual/rhi/polygonmode/buildshaders.bat @@ -0,0 +1,2 @@ +qsb --glsl 320es,410,120 test.vert --msl 12 --hlsl 50 -o test.vert.qsb +qsb --glsl 320es,410,120 test.frag --msl 12 --hlsl 50 -o test.frag.qsb diff --git a/tests/manual/rhi/polygonmode/polygonmode.cpp b/tests/manual/rhi/polygonmode/polygonmode.cpp new file mode 100644 index 0000000000..0fbca228a0 --- /dev/null +++ b/tests/manual/rhi/polygonmode/polygonmode.cpp @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#include "../shared/examplefw.h" + +static const float geom[] = { + -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, + 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, + 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, + +}; + +struct { + QVector<QRhiResource *> releasePool; + QRhiBuffer *vbuf = nullptr; + QRhiShaderResourceBindings *srb = nullptr; + QRhiGraphicsPipeline *ps = nullptr; + QRhiResourceUpdateBatch *initialUpdates = nullptr; + int count = 0; +} d; + +void Window::customInit() +{ + m_clearColor = QColor("black"); + + d.vbuf = m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(geom)); + d.vbuf->create(); + d.releasePool << d.vbuf; + + d.srb = m_r->newShaderResourceBindings(); + d.releasePool << d.srb; + d.srb->create(); + + d.ps = m_r->newGraphicsPipeline(); + d.releasePool << d.ps; + + d.ps->setTopology(QRhiGraphicsPipeline::TriangleStrip); + + d.ps->setShaderStages({ + { QRhiShaderStage::Vertex, getShader(QLatin1String(":/test.vert.qsb")) }, + { QRhiShaderStage::Fragment, getShader(QLatin1String(":/test.frag.qsb")) } + }); + + d.ps->setCullMode(QRhiGraphicsPipeline::None); + d.ps->setPolygonMode(QRhiGraphicsPipeline::Line); + d.ps->setDepthTest(true); + d.ps->setDepthWrite(true); + QRhiVertexInputLayout inputLayout; + inputLayout.setBindings({ + { 6 * sizeof(float) } + }); + inputLayout.setAttributes({ + { 0, 0, QRhiVertexInputAttribute::Float3, 0 }, + { 0, 1, QRhiVertexInputAttribute::Float3, 3 * sizeof(float) } + }); + d.ps->setVertexInputLayout(inputLayout); + d.ps->setShaderResourceBindings(d.srb); + d.ps->setRenderPassDescriptor(m_rp); + d.ps->create(); + + d.initialUpdates = m_r->nextResourceUpdateBatch(); + d.initialUpdates->uploadStaticBuffer(d.vbuf, geom); +} + +void Window::customRelease() +{ + qDeleteAll(d.releasePool); + d.releasePool.clear(); +} + +void Window::customRender() +{ + const QSize outputSizeInPixels = m_sc->currentPixelSize(); + QRhiCommandBuffer *cb = m_sc->currentFrameCommandBuffer(); + QRhiResourceUpdateBatch *u = m_r->nextResourceUpdateBatch(); + if (d.initialUpdates) { + u->merge(d.initialUpdates); + d.initialUpdates->release(); + d.initialUpdates = nullptr; + } + + QRhiGraphicsPipeline::PolygonMode polygonMode = + (++d.count / 60) % 2 ? QRhiGraphicsPipeline::Fill : QRhiGraphicsPipeline::Line; + + if (d.ps->polygonMode() != polygonMode) { + d.ps->setPolygonMode(polygonMode); + d.ps->create(); + } + + 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(6); + cb->endPass(); +} diff --git a/tests/manual/rhi/polygonmode/test.frag b/tests/manual/rhi/polygonmode/test.frag new file mode 100644 index 0000000000..375587662f --- /dev/null +++ b/tests/manual/rhi/polygonmode/test.frag @@ -0,0 +1,10 @@ +#version 440 + +layout(location = 0) in vec3 v_color; + +layout(location = 0) out vec4 fragColor; + +void main() +{ + fragColor = vec4(v_color, 1.0); +} diff --git a/tests/manual/rhi/polygonmode/test.frag.qsb b/tests/manual/rhi/polygonmode/test.frag.qsb Binary files differnew file mode 100644 index 0000000000..4c52be820b --- /dev/null +++ b/tests/manual/rhi/polygonmode/test.frag.qsb diff --git a/tests/manual/rhi/polygonmode/test.vert b/tests/manual/rhi/polygonmode/test.vert new file mode 100644 index 0000000000..3838d2f3bb --- /dev/null +++ b/tests/manual/rhi/polygonmode/test.vert @@ -0,0 +1,12 @@ +#version 440 + +layout(location = 0) in vec3 position; +layout(location = 1) in vec3 color; + +layout(location = 0) out vec3 v_color; + +void main() +{ + gl_Position = vec4(position, 1.0); + v_color = color; +} diff --git a/tests/manual/rhi/polygonmode/test.vert.qsb b/tests/manual/rhi/polygonmode/test.vert.qsb Binary files differnew file mode 100644 index 0000000000..de4e434354 --- /dev/null +++ b/tests/manual/rhi/polygonmode/test.vert.qsb diff --git a/tests/manual/rhi/tessellation/tessellation.cpp b/tests/manual/rhi/tessellation/tessellation.cpp index e8a031a1cf..f92671b0e9 100644 --- a/tests/manual/rhi/tessellation/tessellation.cpp +++ b/tests/manual/rhi/tessellation/tessellation.cpp @@ -100,6 +100,7 @@ void Window::customInit() }); d.ps->setCullMode(QRhiGraphicsPipeline::Back); + d.ps->setPolygonMode(QRhiGraphicsPipeline::Line); d.ps->setDepthTest(true); d.ps->setDepthWrite(true); QRhiVertexInputLayout inputLayout; |