Hash :
6d653c02
Author :
Date :
2019-08-14T14:09:02
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 <hckim.kim@samsung.com> Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// TransformFeedbackVk.h:
// Defines the class interface for TransformFeedbackVk, implementing TransformFeedbackImpl.
//
#ifndef LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
#define LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
#include "libANGLE/renderer/TransformFeedbackImpl.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
namespace gl
{
class ProgramState;
} // namespace gl
namespace rx
{
namespace vk
{
class DescriptorSetLayoutDesc;
}
class TransformFeedbackVk : public TransformFeedbackImpl
{
public:
TransformFeedbackVk(const gl::TransformFeedbackState &state);
~TransformFeedbackVk() override;
angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
angle::Result end(const gl::Context *context) override;
angle::Result pause(const gl::Context *context) override;
angle::Result resume(const gl::Context *context) override;
angle::Result bindIndexedBuffer(const gl::Context *context,
size_t index,
const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
void updateDescriptorSetLayout(const gl::ProgramState &programState,
vk::DescriptorSetLayoutDesc *descSetLayoutOut) const;
void addFramebufferDependency(ContextVk *contextVk,
const gl::ProgramState &programState,
vk::FramebufferHelper *framebuffer) const;
void initDescriptorSet(ContextVk *contextVk,
size_t xfbBufferCount,
vk::BufferHelper *emptyBuffer,
VkDescriptorSet descSet) const;
void updateDescriptorSet(ContextVk *contextVk,
const gl::ProgramState &programState,
VkDescriptorSet descSet) const;
void getBufferOffsets(ContextVk *contextVk,
const gl::ProgramState &programState,
GLint drawCallFirstVertex,
int32_t *offsetsOut,
size_t offsetsSize) const;
private:
void onBeginOrEnd(const gl::Context *context);
void writeDescriptorSet(ContextVk *contextVk,
size_t xfbBufferCount,
VkDescriptorBufferInfo *pBufferInfo,
VkDescriptorSet descSet) const;
// Cached buffer properties for faster descriptor set update and offset calculation.
struct BoundBufferRange
{
// Offset as provided by OffsetBindingPointer.
VkDeviceSize offset = 0;
// Size as provided by OffsetBindingPointer.
VkDeviceSize size = 0;
// Aligned offset usable for VkDescriptorBufferInfo. This value could be smaller than
// offset.
VkDeviceSize alignedOffset = 0;
};
gl::TransformFeedbackBuffersArray<BoundBufferRange> mBoundBufferRanges;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_