diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index d914b34c7..2c1fc05e0 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -1005,6 +1005,12 @@ Result Parser::ParseRun() { if (!pipeline->IsGraphics()) return Result("RUN command requires graphics pipeline"); + if (pipeline->GetVertexBuffers().size() > 1) { + return Result( + "RUN DRAW_RECT is not supported in a pipeline with more than one " + "vertex buffer attached"); + } + token = tokenizer_->NextToken(); if (token->IsEOS() || token->IsEOL()) return Result("RUN DRAW_RECT command requires parameters"); diff --git a/src/vkscript/command_parser.cc b/src/vkscript/command_parser.cc index 02c7ed2f8..1babe0dc8 100644 --- a/src/vkscript/command_parser.cc +++ b/src/vkscript/command_parser.cc @@ -254,6 +254,12 @@ Result CommandParser::ProcessDrawRect() { auto cmd = MakeUnique(pipeline_, pipeline_data_); cmd->SetLine(tokenizer_->GetCurrentLine()); + if (pipeline_->GetVertexBuffers().size() > 1) { + return Result( + "draw rect command is not supported in a pipeline with more than one " + "vertex buffer attached"); + } + auto token = tokenizer_->NextToken(); while (token->IsString()) { std::string str = token->AsString(); diff --git a/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.amber b/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.amber new file mode 100644 index 000000000..84208024e --- /dev/null +++ b/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.amber @@ -0,0 +1,74 @@ +#!amber +# Copyright 2019 The Amber Authors. +# +# 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 +# +# https://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 vtex_shader GLSL +#version 430 + +layout(location = 0) in vec3 position; +layout(location = 1) in vec4 ver_color; +layout(location = 0) out vec4 frag_color; + + +void main() { + gl_Position = vec4(position, 1.0); + frag_color = ver_color; +} +END + +SHADER fragment frag_shader GLSL +#version 430 + +layout(location = 0) in vec4 frag_color; +layout(location = 0) out vec4 final_color; + +void main() { + final_color = frag_color; +} +END + +BUFFER position_buf DATA_TYPE vec3 DATA +-1 1 0 +-1 -1 0 + 1 1 0 + 1 -1 0 +-1 -1 0 + 1 1 0 +END + +BUFFER vert_color_buf DATA_TYPE R8G8B8A8_UNORM DATA +255 0 0 255 +255 0 0 255 +255 0 0 255 +255 0 0 255 +255 0 0 255 +255 0 0 255 +END + +BUFFER framebuffer FORMAT B8G8R8A8_UNORM + +PIPELINE graphics pipeline + ATTACH vtex_shader + ATTACH frag_shader + + VERTEX_DATA position_buf LOCATION 0 + VERTEX_DATA vert_color_buf LOCATION 1 + + FRAMEBUFFER_SIZE 250 250 + BIND BUFFER framebuffer AS color LOCATION 0 + +END + +RUN pipeline DRAW_RECT POS 100 100 SIZE 100 100 +EXPECT framebuffer IDX 100 100 SIZE 100 100 EQ_RGBA 255 0 0 255 diff --git a/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.vkscript b/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.vkscript new file mode 100644 index 000000000..13a4f4246 --- /dev/null +++ b/tests/cases/draw_rect_with_two_vertex_data_attached.expect_fail.vkscript @@ -0,0 +1,96 @@ +# Copyright 2019 The Amber Authors. +# +# 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 +# +# https://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. + +[require] + +[vertex shader] +#version 450 + +layout(location = 0) in vec4 position; +layout(location = 1) in vec4 vert_color; +layout(location = 0) out vec4 final_color; + +void main() { + gl_Position = position; + final_color = vert_color; +} + +[fragment shader] +#version 450 + +layout(location = 0) in vec4 frag_color; +layout(location = 0) out vec4 final_color; + +void main() { + final_color = frag_color; +} + +[vertex data] +# position vert_color + 0/R8G8_SNORM 1/R8G8B8_UNORM + +# Red for entire frame +# R8 G8 R8 G8 B8 + -128 -128 255 0 0 + 127 127 255 0 0 + -128 127 255 0 0 + + -128 -128 255 0 0 + 127 127 255 0 0 + 127 -128 255 0 0 + +# Green for half frame +# R8 G8 R8 G8 B8 + 0 -128 0 255 0 + 127 127 0 255 0 + 0 127 0 255 0 + + 0 -128 0 255 0 + 127 127 0 255 0 + 127 -128 0 255 0 + +# Blue for quarter frame +# R8 G8 R8 G8 B8 + -128 0 0 0 255 + 0 127 0 0 255 + -128 127 0 0 255 + + -128 0 0 0 255 + 0 127 0 0 255 + 0 0 0 0 255 + +# Mixed color for quarter frame +# R8 G8 R8 G8 B8 + 0 0 127 127 127 + 127 127 127 127 127 + 0 127 127 127 127 + + 0 0 127 127 127 + 127 127 127 127 127 + 127 0 127 127 127 + +[test] +clear + +draw rect -1 -1 2 2 +relative probe rect rgb (0.0, 0.0, 0.5, 0.5) (1.0, 0, 0) +relative probe rect rgb (0.5, 0.0, 0.5, 0.5) (0, 1.0, 0) +relative probe rect rgb (0.0, 0.5, 0.5, 0.5) (0, 0, 1.0) +relative probe rect rgb (0.5, 0.5, 0.5, 0.5) (0.5, 0.5, 0.5) + +draw arrays TRIANGLE_LIST 0 24 +relative probe rect rgb (0.0, 0.0, 0.5, 0.5) (1.0, 0, 0) +relative probe rect rgb (0.5, 0.0, 0.5, 0.5) (0, 1.0, 0) +relative probe rect rgb (0.0, 0.5, 0.5, 0.5) (0, 0, 1.0) +relative probe rect rgb (0.5, 0.5, 0.5, 0.5) (0.5, 0.5, 0.5)