From 3169744ab415268a9b6ff544d1bd49031ef3c08a Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 28 Apr 2016 15:49:26 +0200 Subject: D3D12: Fix 'ShaderEffect in a ShaderEffectSource as property value' Import (and clean up) the dropshadow from the shadereffects example. This is very useful since it tests a lot more paths and cases than the wobble. To overcome the issue of not having some of functionality available before the item is added to a window, make QQuickGenericShaderEffect smarter and enhance the documentation. The handling of vertical mirroring is revised. The GLSL and HLSL version of the dropshadow shaders produce correct, identical output now. Change-Id: I94800997bfba781140d80720eb6f340cda480747 Reviewed-by: Andy Nichols --- tests/manual/nodetypes/Effects.qml | 119 +++++++++++++++++++++++++++++---- tests/manual/nodetypes/effects.hlsl | 32 --------- tests/manual/nodetypes/hlslcompile.bat | 6 +- tests/manual/nodetypes/nodetypes.pro | 3 +- tests/manual/nodetypes/nodetypes.qrc | 2 + tests/manual/nodetypes/ps_shadow1.cso | Bin 0 -> 1600 bytes tests/manual/nodetypes/ps_shadow2.cso | Bin 0 -> 1436 bytes tests/manual/nodetypes/shadow1.hlsl | 18 +++++ tests/manual/nodetypes/shadow2.hlsl | 22 ++++++ tests/manual/nodetypes/wobble.hlsl | 32 +++++++++ 10 files changed, 187 insertions(+), 47 deletions(-) delete mode 100644 tests/manual/nodetypes/effects.hlsl create mode 100644 tests/manual/nodetypes/ps_shadow1.cso create mode 100644 tests/manual/nodetypes/ps_shadow2.cso create mode 100644 tests/manual/nodetypes/shadow1.hlsl create mode 100644 tests/manual/nodetypes/shadow2.hlsl create mode 100644 tests/manual/nodetypes/wobble.hlsl (limited to 'tests/manual') diff --git a/tests/manual/nodetypes/Effects.qml b/tests/manual/nodetypes/Effects.qml index 8af9a5eb95..4503c49df1 100644 --- a/tests/manual/nodetypes/Effects.qml +++ b/tests/manual/nodetypes/Effects.qml @@ -47,26 +47,39 @@ Item { anchors.margins: 10 anchors.fill: parent Image { - id: image + id: image1 source: "qrc:/qt.png" } ShaderEffectSource { - id: effectSource - sourceItem: image + id: effectSource1 + sourceItem: image1 hideSource: true } - ShaderEffect { - width: image.width - height: image.height + ShaderEffect { // wobble + id: eff + width: image1.width + height: image1.height anchors.centerIn: parent - property variant source: effectSource + property variant source: effectSource1 property real amplitude: 0.04 * 0.2 property real frequency: 20 property real time: 0 NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 } + property bool customVertexShader: false // the effect is fine with the default vs, but toggle this to test + + property string glslVertexShader: + "uniform highp mat4 qt_Matrix;" + + "attribute highp vec4 qt_Vertex;" + + "attribute highp vec2 qt_MultiTexCoord0;" + + "varying highp vec2 qt_TexCoord0;" + + "void main() {" + + " qt_TexCoord0 = qt_MultiTexCoord0;" + + " gl_Position = qt_Matrix * qt_Vertex;" + + "}" + property string glslFragmentShader: "uniform sampler2D source;" + "uniform highp float amplitude;" + @@ -82,11 +95,93 @@ Item { property string hlslVertexShaderByteCode: "qrc:/vs_wobble.cso" property string hlslPixelShaderByteCode: "qrc:/ps_wobble.cso" - // This effect does not need a custom vertex shader but have one with HLSL just to test that path as well. - vertexShader: shaderType === ShaderEffect.GLSL ? "" - : (shaderType === ShaderEffect.HLSL ? hlslVertexShaderByteCode : "") - fragmentShader: shaderType === ShaderEffect.GLSL ? glslFragmentShader - : (shaderType === ShaderEffect.HLSL ? hlslPixelShaderByteCode : "") + vertexShader: customVertexShader ? (shaderType === ShaderEffect.HLSL ? hlslVertexShaderByteCode : (shaderType === ShaderEffect.GLSL ? glslVertexShader : "")) : "" + + fragmentShader: shaderType === ShaderEffect.HLSL ? hlslPixelShaderByteCode : (shaderType === ShaderEffect.GLSL ? glslFragmentShader : "") + } + + Image { + id: image2 + source: "qrc:/face-smile.png" + } + ShaderEffectSource { + id: effectSource2 + sourceItem: image2 + hideSource: true + } + ShaderEffect { // dropshadow + id: eff2 + width: image2.width + height: image2.height + scale: 2 + x: 40 + y: 40 + + property variant source: effectSource2 + + property string glslShaderPass1: " + uniform lowp float qt_Opacity; + uniform sampler2D source; + uniform highp vec2 delta; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = (0.0538 * texture2D(source, qt_TexCoord0 - 3.182 * delta) + + 0.3229 * texture2D(source, qt_TexCoord0 - 1.364 * delta) + + 0.2466 * texture2D(source, qt_TexCoord0) + + 0.3229 * texture2D(source, qt_TexCoord0 + 1.364 * delta) + + 0.0538 * texture2D(source, qt_TexCoord0 + 3.182 * delta)) * qt_Opacity; + }" + property string glslShaderPass2: " + uniform lowp float qt_Opacity; + uniform highp vec2 offset; + uniform sampler2D source; + uniform sampler2D shadow; + uniform highp float darkness; + uniform highp vec2 delta; + varying highp vec2 qt_TexCoord0; + void main() { + lowp vec4 fg = texture2D(source, qt_TexCoord0); + lowp vec4 bg = texture2D(shadow, qt_TexCoord0 + delta); + gl_FragColor = (fg + vec4(0., 0., 0., darkness * bg.a) * (1. - fg.a)) * qt_Opacity; + }" + + property variant shadow: ShaderEffectSource { + sourceItem: ShaderEffect { + width: eff2.width + height: eff2.height + property variant delta: Qt.size(0.0, 1.0 / height) + property variant source: ShaderEffectSource { + sourceItem: ShaderEffect { + id: innerEff + width: eff2.width + height: eff2.height + property variant delta: Qt.size(1.0 / width, 0.0) + property variant source: effectSource2 + fragmentShader: shaderType === ShaderEffect.HLSL ? "qrc:/ps_shadow1.cso" : (shaderType === ShaderEffect.GLSL ? eff2.glslShaderPass1 : "") + } + } + fragmentShader: shaderType === ShaderEffect.HLSL ? "qrc:/ps_shadow1.cso" : (shaderType === ShaderEffect.GLSL ? eff2.glslShaderPass1: "") + } + } + property real angle: 0 + property variant offset: Qt.point(5.0 * Math.cos(angle), 5.0 * Math.sin(angle)) + NumberAnimation on angle { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 6000 } + property variant delta: Qt.size(offset.x / width, offset.y / height) + property real darkness: 0.5 + fragmentShader: shaderType === ShaderEffect.HLSL ? "qrc:/ps_shadow2.cso" : (shaderType === ShaderEffect.GLSL ? glslShaderPass2 : "") + } + + Column { + anchors.bottom: parent.bottom + Text { + color: "yellow" + font.pointSize: 24 + text: "Shader effect is " + (eff.shaderType === ShaderEffect.HLSL ? "HLSL" : (eff.shaderType === ShaderEffect.GLSL ? "GLSL" : "UNKNOWN")) + " based"; + } + Text { + // check the inner shader effect's properties as those only get updated later on, once a window gets associated + text: innerEff.shaderType + " " + innerEff.shaderCompilationType + " " + innerEff.shaderSourceType + } } } } diff --git a/tests/manual/nodetypes/effects.hlsl b/tests/manual/nodetypes/effects.hlsl deleted file mode 100644 index 203dbda7f2..0000000000 --- a/tests/manual/nodetypes/effects.hlsl +++ /dev/null @@ -1,32 +0,0 @@ -cbuffer ConstantBuffer : register(b0) -{ - float4x4 qt_Matrix; - float qt_Opacity; - - float amplitude; - float frequency; - float time; -}; - -struct PSInput -{ - float4 position : SV_POSITION; - float2 coord : TEXCOORD0; -}; - -PSInput VS_Wobble(float4 position : POSITION, float2 coord : TEXCOORD0) -{ - PSInput result; - result.position = mul(qt_Matrix, position); - result.coord = coord; - return result; -} - -Texture2D source : register(t0); -SamplerState sourceSampler : register(s0); - -float4 PS_Wobble(PSInput input) : SV_TARGET -{ - float2 p = sin(time + frequency * input.coord); - return source.Sample(sourceSampler, input.coord + amplitude * float2(p.y, -p.x)) * qt_Opacity; -} diff --git a/tests/manual/nodetypes/hlslcompile.bat b/tests/manual/nodetypes/hlslcompile.bat index 8f7ca86069..b24824e324 100644 --- a/tests/manual/nodetypes/hlslcompile.bat +++ b/tests/manual/nodetypes/hlslcompile.bat @@ -1,2 +1,4 @@ -fxc /E VS_Wobble /T vs_5_0 /Fo vs_wobble.cso effects.hlsl -fxc /E PS_Wobble /T ps_5_0 /Fo ps_wobble.cso effects.hlsl +fxc /E VS_Wobble /T vs_5_0 /Fo vs_wobble.cso wobble.hlsl +fxc /E PS_Wobble /T ps_5_0 /Fo ps_wobble.cso wobble.hlsl +fxc /E PS_Shadow1 /T ps_5_0 /Fo ps_shadow1.cso shadow1.hlsl +fxc /E PS_Shadow2 /T ps_5_0 /Fo ps_shadow2.cso shadow2.hlsl diff --git a/tests/manual/nodetypes/nodetypes.pro b/tests/manual/nodetypes/nodetypes.pro index 51a6ac3e5a..43b79323a8 100644 --- a/tests/manual/nodetypes/nodetypes.pro +++ b/tests/manual/nodetypes/nodetypes.pro @@ -5,4 +5,5 @@ SOURCES += nodetypes.cpp RESOURCES += nodetypes.qrc OTHER_FILES += main.qml Rects.qml LotsOfRects.qml \ - Images.qml Text.qml Animators.qml Layers.qml Effects.qml effects.hlsl + Images.qml Text.qml Animators.qml Layers.qml Effects.qml \ + wobble.hlsl shadow1.hlsl shadow2.hlsl diff --git a/tests/manual/nodetypes/nodetypes.qrc b/tests/manual/nodetypes/nodetypes.qrc index f6c007e3f3..64bd503319 100644 --- a/tests/manual/nodetypes/nodetypes.qrc +++ b/tests/manual/nodetypes/nodetypes.qrc @@ -13,5 +13,7 @@ shadow.png vs_wobble.cso ps_wobble.cso + ps_shadow1.cso + ps_shadow2.cso diff --git a/tests/manual/nodetypes/ps_shadow1.cso b/tests/manual/nodetypes/ps_shadow1.cso new file mode 100644 index 0000000000..b6fbe3f3c2 Binary files /dev/null and b/tests/manual/nodetypes/ps_shadow1.cso differ diff --git a/tests/manual/nodetypes/ps_shadow2.cso b/tests/manual/nodetypes/ps_shadow2.cso new file mode 100644 index 0000000000..ab8cb63f34 Binary files /dev/null and b/tests/manual/nodetypes/ps_shadow2.cso differ diff --git a/tests/manual/nodetypes/shadow1.hlsl b/tests/manual/nodetypes/shadow1.hlsl new file mode 100644 index 0000000000..ff3f4b6fd5 --- /dev/null +++ b/tests/manual/nodetypes/shadow1.hlsl @@ -0,0 +1,18 @@ +cbuffer ConstantBuffer : register(b0) +{ + float4x4 qt_Matrix; + float qt_Opacity; + float2 delta; +}; + +Texture2D source : register(t0); +SamplerState sourceSampler : register(s0); + +float4 PS_Shadow1(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET +{ + return (0.0538 * source.Sample(sourceSampler, coord - 3.182 * delta) + + 0.3229 * source.Sample(sourceSampler, coord - 1.364 * delta) + + 0.2466 * source.Sample(sourceSampler, coord) + + 0.3229 * source.Sample(sourceSampler, coord + 1.364 * delta) + + 0.0538 * source.Sample(sourceSampler, coord + 3.182 * delta)) * qt_Opacity; +} diff --git a/tests/manual/nodetypes/shadow2.hlsl b/tests/manual/nodetypes/shadow2.hlsl new file mode 100644 index 0000000000..eaa30cd988 --- /dev/null +++ b/tests/manual/nodetypes/shadow2.hlsl @@ -0,0 +1,22 @@ +cbuffer ConstantBuffer : register(b0) +{ + float4x4 qt_Matrix; + float qt_Opacity; + float2 offset; + float darkness; + float2 delta; +}; + +Texture2D source : register(t0); +Texture2D shadow : register(t1); +SamplerState samp : register(s0); +// Use the same sampler for both textures. In fact the engine will create an extra static sampler +// in any case (to match the number of textures) due to some internals, but that won't hurt, the +// shader works either way. + +float4 PS_Shadow2(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET +{ + float4 fg = source.Sample(samp, coord); + float4 bg = shadow.Sample(samp, coord + delta); + return (fg + float4(0.0, 0.0, 0.0, darkness * bg.a) * (1.0 - fg.a)) * qt_Opacity; +} diff --git a/tests/manual/nodetypes/wobble.hlsl b/tests/manual/nodetypes/wobble.hlsl new file mode 100644 index 0000000000..203dbda7f2 --- /dev/null +++ b/tests/manual/nodetypes/wobble.hlsl @@ -0,0 +1,32 @@ +cbuffer ConstantBuffer : register(b0) +{ + float4x4 qt_Matrix; + float qt_Opacity; + + float amplitude; + float frequency; + float time; +}; + +struct PSInput +{ + float4 position : SV_POSITION; + float2 coord : TEXCOORD0; +}; + +PSInput VS_Wobble(float4 position : POSITION, float2 coord : TEXCOORD0) +{ + PSInput result; + result.position = mul(qt_Matrix, position); + result.coord = coord; + return result; +} + +Texture2D source : register(t0); +SamplerState sourceSampler : register(s0); + +float4 PS_Wobble(PSInput input) : SV_TARGET +{ + float2 p = sin(time + frequency * input.coord); + return source.Sample(sourceSampler, input.coord + amplitude * float2(p.y, -p.x)) * qt_Opacity; +} -- cgit v1.2.3