yes
This commit is contained in:
+150
@@ -0,0 +1,150 @@
|
||||
#!amber
|
||||
|
||||
# Copyright 2020 Valve Corporation.
|
||||
# Copyright 2020 The Khronos Group Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
SHADER vertex vtx_shader SPIRV-ASM
|
||||
; SPIR-V
|
||||
; Version: 1.0
|
||||
; Generator: Khronos Glslang Reference Front End; 8
|
||||
; Bound: 30
|
||||
; Schema: 0
|
||||
;
|
||||
; Originally created from code like this one:
|
||||
;
|
||||
; #version 450
|
||||
; layout(location=0) in vec4 position;
|
||||
; void main() { gl_Position = position; }
|
||||
;
|
||||
OpCapability Shader
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Vertex %main "main" %_ %position
|
||||
OpSource GLSL 450
|
||||
OpName %main "main"
|
||||
OpName %gl_PerVertex "gl_PerVertex"
|
||||
OpMemberName %gl_PerVertex 0 "gl_Position"
|
||||
OpMemberName %gl_PerVertex 1 "gl_PointSize"
|
||||
OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
|
||||
OpMemberName %gl_PerVertex 3 "gl_CullDistance"
|
||||
OpName %_ ""
|
||||
OpName %position "position"
|
||||
OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
|
||||
OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
|
||||
OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
|
||||
OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
|
||||
OpDecorate %gl_PerVertex Block
|
||||
OpDecorate %position Location 0
|
||||
%void = OpTypeVoid
|
||||
%3 = OpTypeFunction %void
|
||||
%int = OpTypeInt 32 1
|
||||
%int_1 = OpConstant %int 1
|
||||
%float = OpTypeFloat 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%uint = OpTypeInt 32 0
|
||||
%uint_1 = OpConstant %uint 1
|
||||
%_arr_float_uint_1 = OpTypeArray %float %uint_1
|
||||
%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
|
||||
%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
|
||||
%_ = OpVariable %_ptr_Output_gl_PerVertex Output
|
||||
%int_0 = OpConstant %int 0
|
||||
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
||||
%position = OpVariable %_ptr_Input_v4float Input
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
%main = OpFunction %void None %3
|
||||
;
|
||||
; The rest of code below has been manually tuned.
|
||||
; The assignment to gl_Position is in the OpLoad, OpAccessChain and OpStore sequence.
|
||||
; It's wrapped inside a loop statement roughly equivalent to this:
|
||||
;
|
||||
; for (;;) {
|
||||
; switch (1) {
|
||||
; default:
|
||||
; gl_Position = position;
|
||||
; goto end;
|
||||
; }
|
||||
; }
|
||||
; end:
|
||||
; return;
|
||||
;
|
||||
; Which means the code jumps directly from the end of the default block to the
|
||||
; loop exit, something that cannot be directly done in GLSL because it has no
|
||||
; goto nor any other equivalent instruction to directly exit the loop.
|
||||
;
|
||||
; The switch's merge block is unreachable and marked with OpUnreachable.
|
||||
; According to VK-GL-CTS issue #952, at least one driver goes into an infinite
|
||||
; loop when doing so.
|
||||
;
|
||||
%main_start = OpLabel
|
||||
OpBranch %loop_start
|
||||
%loop_start = OpLabel
|
||||
OpLoopMerge %loop_exit %loop_end None
|
||||
OpBranch %select_start
|
||||
%select_start = OpLabel
|
||||
OpSelectionMerge %select_merge None
|
||||
OpSwitch %int_1 %switch_default
|
||||
%switch_default = OpLabel
|
||||
%25 = OpLoad %v4float %position
|
||||
%27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
|
||||
OpStore %27 %25
|
||||
OpBranch %loop_exit
|
||||
%select_merge = OpLabel
|
||||
OpUnreachable
|
||||
%loop_end = OpLabel
|
||||
OpBranch %loop_start
|
||||
%loop_exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
END
|
||||
|
||||
SHADER fragment frag_shader GLSL
|
||||
#version 450
|
||||
|
||||
layout(location = 0) out vec4 color_out;
|
||||
|
||||
void main() {
|
||||
// Red color.
|
||||
color_out = vec4(1.0, 0.0, 0.0, 1.0);
|
||||
}
|
||||
END
|
||||
|
||||
# Full-screen quad.
|
||||
BUFFER position_buf DATA_TYPE vec2<float> DATA
|
||||
-1 -1
|
||||
1 -1
|
||||
-1 1
|
||||
-1 1
|
||||
1 -1
|
||||
1 1
|
||||
END
|
||||
|
||||
BUFFER framebuffer FORMAT B8G8R8A8_UNORM
|
||||
|
||||
PIPELINE graphics pipeline
|
||||
ATTACH vtx_shader
|
||||
ATTACH frag_shader
|
||||
|
||||
VERTEX_DATA position_buf LOCATION 0
|
||||
|
||||
FRAMEBUFFER_SIZE 64 64
|
||||
BIND BUFFER framebuffer AS color LOCATION 0
|
||||
END
|
||||
|
||||
CLEAR pipeline
|
||||
|
||||
RUN pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 6
|
||||
EXPECT framebuffer IDX 0 0 SIZE 64 64 EQ_RGBA 255 0 0 255
|
||||
Reference in New Issue
Block a user