diff options
author | Jaebaek Seo <duke.acacia@gmail.com> | 2018-12-11 16:56:14 -0500 |
---|---|---|
committer | dan sinclair <dj2@everburning.com> | 2018-12-11 16:56:14 -0500 |
commit | b32dbe11c6261169d8846d79c9d97e4342da788e (patch) | |
tree | 5a09515f809cd4688d987b8e04fcdb1f9b0c6982 | |
parent | 7f5e9788e1cc08090ca4c66101c0520212a06c18 (diff) | |
download | amber-b32dbe11c6261169d8846d79c9d97e4342da788e.tar.gz |
Vulkan: fix draw rect once bug (#174)
Running just one draw rect command without any other draw array,
draw rect, nor clear fails because
`GraphicsPipeline::ResetPipelineAndVertexBuffer()` calls
`CommandBuffer::End()` even when CommandBuffer is not in
`CommandBufferState::kRecording`. This CL fixes it.
Fixes #173
-rw-r--r-- | src/vulkan/graphics_pipeline.cc | 6 | ||||
-rw-r--r-- | tests/cases/clear_color_without_probe.amber | 32 | ||||
-rw-r--r-- | tests/cases/compute_ssbo_without_probe.amber | 49 | ||||
-rw-r--r-- | tests/cases/draw_rectangles_once.amber | 46 | ||||
-rw-r--r-- | tests/cases/draw_rectangles_without_probe.amber | 45 | ||||
-rw-r--r-- | tests/cases/draw_triangle_list_without_probe.amber | 52 |
6 files changed, 229 insertions, 1 deletions
diff --git a/src/vulkan/graphics_pipeline.cc b/src/vulkan/graphics_pipeline.cc index 146c3ae..e558e6c 100644 --- a/src/vulkan/graphics_pipeline.cc +++ b/src/vulkan/graphics_pipeline.cc @@ -482,9 +482,13 @@ Result GraphicsPipeline::ClearBuffer(const VkClearValue& clear_value, } Result GraphicsPipeline::ResetPipelineAndVertexBuffer() { + Result r = command_->BeginIfNotInRecording(); + if (!r.IsSuccess()) + return r; + DeactivateRenderPassIfNeeded(); - Result r = command_->End(); + r = command_->End(); if (!r.IsSuccess()) return r; diff --git a/tests/cases/clear_color_without_probe.amber b/tests/cases/clear_color_without_probe.amber new file mode 100644 index 0000000..5c37298 --- /dev/null +++ b/tests/cases/clear_color_without_probe.amber @@ -0,0 +1,32 @@ +# Copyright 2018 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. + +[vertex shader passthrough] + +[fragment shader] +#version 430 + +layout(location = 0) in vec4 color_in; +layout(location = 0) out vec4 color_out; + +void main() { + color_out = color_in; +} + +[test] +clear color 1 0.4 0.5 0.2 +clear + +clear color 0.4 0.2 1 0.5 +clear diff --git a/tests/cases/compute_ssbo_without_probe.amber b/tests/cases/compute_ssbo_without_probe.amber new file mode 100644 index 0000000..8396c78 --- /dev/null +++ b/tests/cases/compute_ssbo_without_probe.amber @@ -0,0 +1,49 @@ +# Copyright 2018 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. + +[compute shader] +#version 430 + +layout(set = 0, binding = 0) buffer block0 { + float data_set0_binding0[3]; +}; + +layout(set = 1, binding = 2) buffer block1 { + float data_set1_binding2[3]; +}; + +layout(set = 2, binding = 1) buffer block2 { + float data_set2_binding1[3]; +}; + +layout(set = 2, binding = 3) buffer block3 { + float data_set2_binding3[3]; +}; + +void main() { + const uint index = gl_WorkGroupID.x; + data_set0_binding0[index] = data_set0_binding0[index] + 1.0f; + data_set1_binding2[index] = data_set2_binding1[index] - + data_set1_binding2[index]; + data_set2_binding1[index] = 10.0f * data_set2_binding3[index] + + data_set2_binding1[index]; + data_set2_binding3[index] = 30.0f * data_set2_binding3[index]; +} + +[test] +ssbo 0:0 subdata vec3 0 1.0 2.0 3.0 +ssbo 1:2 subdata vec3 0 4.0 5.0 6.0 +ssbo 2:1 subdata vec3 0 21.0 22.0 23.0 +ssbo 2:3 subdata vec3 0 0.7 0.8 0.9 +compute 3 1 1 diff --git a/tests/cases/draw_rectangles_once.amber b/tests/cases/draw_rectangles_once.amber new file mode 100644 index 0000000..0a77382 --- /dev/null +++ b/tests/cases/draw_rectangles_once.amber @@ -0,0 +1,46 @@ +# Copyright 2018 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] +vertexPipelineStoresAndAtomics + +[vertex shader] +#version 430 + +layout(location = 0) in vec4 position; +layout(location = 0) out vec4 frag_color; + +layout(set = 0, binding = 0) buffer block1 { + vec4 in_color; +}; + +void main() { + gl_Position = position; + frag_color = in_color; +} + +[fragment shader] +#version 430 + +layout(location = 0) in vec4 frag_color; +layout(location = 0) out vec4 final_color; + +void main() { + final_color = frag_color; +} + +[test] +ssbo 0 subdata vec4 0 1.0 0.0 0.0 1.0 +draw rect -1 -1 1 1 +relative probe rect rgba (0.0, 0.0, 0.5, 0.5) (1.0, 0, 0, 1.0) diff --git a/tests/cases/draw_rectangles_without_probe.amber b/tests/cases/draw_rectangles_without_probe.amber new file mode 100644 index 0000000..70a8433 --- /dev/null +++ b/tests/cases/draw_rectangles_without_probe.amber @@ -0,0 +1,45 @@ +# Copyright 2018 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] +vertexPipelineStoresAndAtomics + +[vertex shader] +#version 430 + +layout(location = 0) in vec4 position; +layout(location = 0) out vec4 frag_color; + +layout(set = 0, binding = 0) buffer block1 { + vec4 in_color; +}; + +void main() { + gl_Position = position; + frag_color = in_color; +} + +[fragment shader] +#version 430 + +layout(location = 0) in vec4 frag_color; +layout(location = 0) out vec4 final_color; + +void main() { + final_color = frag_color; +} + +[test] +ssbo 0 subdata vec4 0 1.0 0.0 0.0 1.0 +draw rect -1 -1 1 1 diff --git a/tests/cases/draw_triangle_list_without_probe.amber b/tests/cases/draw_triangle_list_without_probe.amber new file mode 100644 index 0000000..646a0d2 --- /dev/null +++ b/tests/cases/draw_triangle_list_without_probe.amber @@ -0,0 +1,52 @@ +# Copyright 2018 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. + +[vertex shader] +#version 430 + +layout(location = 0) in vec4 position; +layout(location = 1) in vec4 vert_color; +layout(location = 0) out vec4 frag_color; + +void main() { + gl_Position = position; + frag_color = vert_color; +} + +[fragment shader] +#version 430 + +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 + +[test] +draw arrays TRIANGLE_LIST 0 6 |