rhi: Update the docs and manual test for geometry shaders
Task-number: QTBUG-137521 Change-Id: Ic9256eaaa55aef20c622429058fda9235c1f73c1 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
7dd952667c
commit
fdbc8079c9
@ -936,16 +936,17 @@ Q_LOGGING_CATEGORY(QRHI_LOG_RUB, "qt.rhi.rub")
|
|||||||
avoided as it will not be supported by all backends. The maximum patch
|
avoided as it will not be supported by all backends. The maximum patch
|
||||||
control point count portable between backends is 32.
|
control point count portable between backends is 32.
|
||||||
|
|
||||||
\value GeometryShader Indicates that the geometry shader stage is
|
\value GeometryShader Indicates that the geometry shader stage is supported.
|
||||||
supported. When supported, a geometry shader can be specified in the
|
When supported, a geometry shader can be specified in the QRhiShaderStage
|
||||||
QRhiShaderStage list. Geometry Shaders are considered an experimental
|
list. Geometry Shaders are considered an experimental feature in QRhi and
|
||||||
feature in QRhi and can only be expected to be supported with Vulkan,
|
can only be expected to be supported with Vulkan, Direct 3D 11 and 12,
|
||||||
Direct 3D, OpenGL (3.2+) and OpenGL ES (3.2+), assuming the implementation
|
OpenGL (3.2+) and OpenGL ES (3.2+), assuming the implementation reports it
|
||||||
reports it as supported at run time. Geometry shaders have portability
|
as supported at run time. Starting with Qt 6.11 geometry shaders are
|
||||||
issues between APIs, and therefore no guarantees can be given for a
|
automatically translated to HLSL, and therefore no injection of handwritten
|
||||||
universal solution. They will never be supported with Metal. Whereas with
|
HLSL geometry shaders is necessary anymore (but note that gl_in and
|
||||||
Direct 3D a handwritten HLSL geometry shader must be injected into each
|
expressions such as gl_in[0].gl_Position are not supported; rather, pass the
|
||||||
QShader for the geometry stage since qsb cannot generate this from SPIR-V.
|
position as an output variable from the vertex shader). Geometry shaders are
|
||||||
|
not supported with Metal.
|
||||||
|
|
||||||
\value TextureArrayRange Indicates that for
|
\value TextureArrayRange Indicates that for
|
||||||
\l{QRhi::newTextureArray()}{texture arrays} it is possible to specify a
|
\l{QRhi::newTextureArray()}{texture arrays} it is possible to specify a
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
:: Copyright (C) 2024 The Qt Company Ltd.
|
:: Copyright (C) 2024 The Qt Company Ltd.
|
||||||
:: SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
:: SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
qsb --glsl 320es,410 --hlsl 50 test.vert -o test.vert.qsb
|
qsb --glsl 320es,410 --hlsl 50 test.vert -o test.vert.qsb
|
||||||
qsb --glsl 320es,410 test.geom -o test.geom.qsb
|
qsb --glsl 320es,410 --hlsl 50 test.geom -o test.geom.qsb
|
||||||
qsb -r hlsl,50,test_geom.hlsl test.geom.qsb
|
|
||||||
qsb --glsl 320es,410 --hlsl 50 test.frag -o test.frag.qsb
|
qsb --glsl 320es,410 --hlsl 50 test.frag -o test.frag.qsb
|
||||||
|
Binary file not shown.
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
layout(points) in;
|
layout(points) in;
|
||||||
layout(line_strip, max_vertices = 7) out;
|
layout(line_strip, max_vertices = 7) out;
|
||||||
|
layout(location = 0) in vec4 v_position[];
|
||||||
|
|
||||||
layout(std140, binding = 0) uniform buf {
|
layout(std140, binding = 0) uniform buf {
|
||||||
float radius;
|
float radius;
|
||||||
@ -16,7 +17,7 @@ void main(void)
|
|||||||
{
|
{
|
||||||
float theta = float(i) / 6.0f * 2.0 * M_PI;
|
float theta = float(i) / 6.0f * 2.0 * M_PI;
|
||||||
|
|
||||||
gl_Position = gl_in[0].gl_Position;
|
gl_Position = v_position[0];
|
||||||
gl_Position.xy += radius * vec2(cos(theta), sin(theta));
|
gl_Position.xy += radius * vec2(cos(theta), sin(theta));
|
||||||
|
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
Binary file not shown.
@ -1,8 +1,10 @@
|
|||||||
#version 440
|
#version 440
|
||||||
|
|
||||||
layout(location = 0) in vec3 position;
|
layout(location = 0) in vec3 position;
|
||||||
|
layout(location = 0) out vec4 v_position;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = vec4(position, 1.0);
|
v_position = vec4(position, 1.0);
|
||||||
|
gl_Position = v_position;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
@ -1,26 +0,0 @@
|
|||||||
struct VertexOutput
|
|
||||||
{
|
|
||||||
float4 position : SV_Position;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PixelInput
|
|
||||||
{
|
|
||||||
float4 position : SV_POSITION;
|
|
||||||
};
|
|
||||||
|
|
||||||
cbuffer buf : register(b0)
|
|
||||||
{
|
|
||||||
float radius : packoffset(c0);
|
|
||||||
};
|
|
||||||
|
|
||||||
[maxvertexcount(7)]
|
|
||||||
void main(point VertexOutput input[1], inout LineStream<PixelInput> OutputStream)
|
|
||||||
{
|
|
||||||
PixelInput output;
|
|
||||||
for (int i = 0; i < 7; ++i) {
|
|
||||||
float theta = float(i) / 6.0f * 2.0 * 3.14159265;
|
|
||||||
output.position = input[0].position;
|
|
||||||
output.position.xy += radius * float2(cos(theta), sin(theta));
|
|
||||||
OutputStream.Append(output);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user