Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 6d653c0

Browse files
Hyunchang KimCommit Bot
authored andcommitted
Vulkan: Set empty buffer to xfb descriptor set as an initial buffer
When we have xfb descriptor set without buffer bindings it causes errors in Vulkan validation layer. So we set empty buffer by default. BUG=angleproject:3681 Tests: dEQP-GLES3.functional.*transform_feedback* dEQP-GLES3.functional.lifetime.attach.deleted_input.buffer_vertex_array Change-Id: I4e7c9c9ee661f1fc92bf01fb78a2212c1a423eaa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1753387 Commit-Queue: Hyunchang Kim <[email protected]> Commit-Queue: Jamie Madill <[email protected]> Reviewed-by: Jamie Madill <[email protected]>
1 parent 396527c commit 6d653c0

File tree

4 files changed

+66
-20
lines changed

4 files changed

+66
-20
lines changed

src/libANGLE/renderer/vulkan/ProgramVk.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,11 +1400,25 @@ angle::Result ProgramVk::updateTransformFeedbackDescriptorSet(ContextVk *context
14001400
void ProgramVk::updateTransformFeedbackDescriptorSetImpl(ContextVk *contextVk)
14011401
{
14021402
const gl::State &glState = contextVk->getState();
1403+
gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
1404+
14031405
if (!hasTransformFeedbackOutput())
14041406
{
1405-
// NOTE(syoussefi): a possible optimization is to skip this if transform feedback is
1406-
// paused. However, even if paused, |updateDescriptorSet| must be called at least once for
1407-
// the sake of validation.
1407+
// If xfb has no output there is no need to update descriptor set.
1408+
return;
1409+
}
1410+
if (!glState.isTransformFeedbackActive())
1411+
{
1412+
// We set empty Buffer to xfb descriptor set because xfb descriptor set
1413+
// requires valid buffer bindings, even if they are empty buffer,
1414+
// otherwise Vulkan validation layer generates errors.
1415+
if (transformFeedback)
1416+
{
1417+
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback);
1418+
transformFeedbackVk->initDescriptorSet(
1419+
contextVk, mState.getTransformFeedbackBufferCount(), &mEmptyBuffer,
1420+
mDescriptorSets[kUniformsAndXfbDescriptorSetIndex]);
1421+
}
14081422
return;
14091423
}
14101424

src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,25 @@ void TransformFeedbackVk::addFramebufferDependency(ContextVk *contextVk,
133133
}
134134
}
135135

136+
void TransformFeedbackVk::initDescriptorSet(ContextVk *contextVk,
137+
size_t xfbBufferCount,
138+
vk::BufferHelper *emptyBuffer,
139+
VkDescriptorSet descSet) const
140+
{
141+
std::array<VkDescriptorBufferInfo, gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS>
142+
descriptorBufferInfo;
143+
144+
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
145+
{
146+
VkDescriptorBufferInfo &bufferInfo = descriptorBufferInfo[bufferIndex];
147+
bufferInfo.buffer = emptyBuffer->getBuffer().getHandle();
148+
bufferInfo.offset = 0;
149+
bufferInfo.range = VK_WHOLE_SIZE;
150+
}
151+
152+
writeDescriptorSet(contextVk, xfbBufferCount, descriptorBufferInfo.data(), descSet);
153+
}
154+
136155
void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk,
137156
const gl::ProgramState &programState,
138157
VkDescriptorSet descSet) const
@@ -165,20 +184,7 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk,
165184
bufferInfo.range = bufferRange.size + (bufferRange.offset - bufferRange.alignedOffset);
166185
}
167186

168-
VkDevice device = contextVk->getDevice();
169-
170-
VkWriteDescriptorSet writeDescriptorInfo = {};
171-
writeDescriptorInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
172-
writeDescriptorInfo.dstSet = descSet;
173-
writeDescriptorInfo.dstBinding = kXfbBindingIndexStart;
174-
writeDescriptorInfo.dstArrayElement = 0;
175-
writeDescriptorInfo.descriptorCount = static_cast<uint32_t>(xfbBufferCount);
176-
writeDescriptorInfo.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
177-
writeDescriptorInfo.pImageInfo = nullptr;
178-
writeDescriptorInfo.pBufferInfo = descriptorBufferInfo.data();
179-
writeDescriptorInfo.pTexelBufferView = nullptr;
180-
181-
vkUpdateDescriptorSets(device, 1, &writeDescriptorInfo, 0, nullptr);
187+
writeDescriptorSet(contextVk, xfbBufferCount, descriptorBufferInfo.data(), descSet);
182188
}
183189

184190
void TransformFeedbackVk::getBufferOffsets(ContextVk *contextVk,
@@ -238,4 +244,25 @@ void TransformFeedbackVk::onBeginOrEnd(const gl::Context *context)
238244
}
239245
}
240246

247+
void TransformFeedbackVk::writeDescriptorSet(ContextVk *contextVk,
248+
size_t xfbBufferCount,
249+
VkDescriptorBufferInfo *pBufferInfo,
250+
VkDescriptorSet descSet) const
251+
{
252+
VkDevice device = contextVk->getDevice();
253+
254+
VkWriteDescriptorSet writeDescriptorInfo = {};
255+
writeDescriptorInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
256+
writeDescriptorInfo.dstSet = descSet;
257+
writeDescriptorInfo.dstBinding = kXfbBindingIndexStart;
258+
writeDescriptorInfo.dstArrayElement = 0;
259+
writeDescriptorInfo.descriptorCount = static_cast<uint32_t>(xfbBufferCount);
260+
writeDescriptorInfo.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
261+
writeDescriptorInfo.pImageInfo = nullptr;
262+
writeDescriptorInfo.pBufferInfo = pBufferInfo;
263+
writeDescriptorInfo.pTexelBufferView = nullptr;
264+
265+
vkUpdateDescriptorSets(device, 1, &writeDescriptorInfo, 0, nullptr);
266+
}
267+
241268
} // namespace rx

src/libANGLE/renderer/vulkan/TransformFeedbackVk.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ class TransformFeedbackVk : public TransformFeedbackImpl
4545
void addFramebufferDependency(ContextVk *contextVk,
4646
const gl::ProgramState &programState,
4747
vk::FramebufferHelper *framebuffer) const;
48+
void initDescriptorSet(ContextVk *contextVk,
49+
size_t xfbBufferCount,
50+
vk::BufferHelper *emptyBuffer,
51+
VkDescriptorSet descSet) const;
4852
void updateDescriptorSet(ContextVk *contextVk,
4953
const gl::ProgramState &programState,
5054
VkDescriptorSet descSet) const;
@@ -56,6 +60,10 @@ class TransformFeedbackVk : public TransformFeedbackImpl
5660

5761
private:
5862
void onBeginOrEnd(const gl::Context *context);
63+
void writeDescriptorSet(ContextVk *contextVk,
64+
size_t xfbBufferCount,
65+
VkDescriptorBufferInfo *pBufferInfo,
66+
VkDescriptorSet descSet) const;
5967

6068
// Cached buffer properties for faster descriptor set update and offset calculation.
6169
struct BoundBufferRange

src/tests/deqp_support/deqp_gles3_test_expectations.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -625,9 +625,6 @@
625625
// - Primitive restart with line loops:
626626
2672 VULKAN : dEQP-GLES3.functional.primitive_restart.*.line_loop.*instanced = SKIP
627627

628-
// Misc failures:
629-
3681 VULKAN : dEQP-GLES3.functional.lifetime.attach.deleted_input.buffer_vertex_array = SKIP
630-
631628
// Failures on newer NVIDIA drivers (411.95) and passes on older drivers (388.16). Passes on 418.12 on Linux.
632629
2976 VULKAN NVIDIA : dEQP-GLES3.functional.shaders.invariance.* = FAIL
633630
// Fails on 431.02 NVIDIA driver

0 commit comments

Comments
 (0)