33 for (
const auto& buffer : _bufferObjects)
35 bindBufferInternal(buffer._bindConfig, *vkData->
_cmdBuffer);
39 if ( !_idxBuffers.empty() )
43 const auto& idxBuffer = _idxBuffers[command._bufferFlag];
44 if (idxBuffer._buffer !=
nullptr)
46 VkDeviceSize offsetInBytes = 0u;
48 if ( idxBuffer._ringSizeFactor > 1 )
50 offsetInBytes += idxBuffer._buffer->_params._elementCount * idxBuffer._buffer->_params._elementSize * queueIndex();
52 VK_PROFILE(vkCmdBindIndexBuffer, *vkData->
_cmdBuffer, idxBuffer._buffer->_buffer, offsetInBytes, idxBuffer._data.smallIndices ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32);
74 if (bufferImpl._bindConfig._bufferIdx == bindConfig._bufferIdx)
81 if (impl ==
nullptr) {
86 VkDeviceSize offsetInBytes = 0u;
92 VK_PROFILE(vkCmdBindVertexBuffers, cmdBuffer, bindConfig._bindIdx, 1, &impl->
_buffer->_buffer, &offsetInBytes);
103 for (
auto& buffer : _bufferObjects)
105 if (buffer._bindConfig._bufferIdx == params._bindConfig._bufferIdx)
114 impl = &_bufferObjects.emplace_back();
117 const size_t ringSizeFactor = params._useRingBuffer ? queueLength() : 1;
118 const size_t bufferSizeInBytes = params._bufferParams._elementCount * params._bufferParams._elementSize;
119 const size_t dataSize = bufferSizeInBytes * ringSizeFactor;
121 const size_t elementStride = params._elementStride == SetBufferParams::INVALID_ELEMENT_STRIDE
122 ? params._bufferParams._elementSize
123 : params._elementStride;
128 if ( impl->
_buffer !=
nullptr && impl->
_buffer->_params == params._bufferParams )
131 return updateBuffer( params._bindConfig._bufferIdx, 0, params._bufferParams._elementCount, params._initialData.first);
134 const string bufferName = _name.empty() ?
Util::StringFormat(
"DVD_GENERAL_VTX_BUFFER_{}", handle()._id) :
string(_name.c_str()) +
"_VTX_BUFFER";
135 impl->
_buffer = std::make_unique<vkBufferImpl>(params._bufferParams,
157 if (idxBuffer._data.id == indices.
id)
169 else if ( impl->
_buffer !=
nullptr )
173 if ( indices.
count == 0u ||
177 if ( !impl->
_buffer->waitForLockedRange( {0, U32_MAX} ) )
185 if ( indices.
count == 0u )
199 const U32*
const dataIn =
reinterpret_cast<U32*
>(data);
200 for (
size_t i = 0u; i < indices.
count; ++i )
208 const size_t range = indices.
count * elementSize;
210 if ( impl->
_buffer !=
nullptr )
212 size_t offsetInBytes = 0u;
219 return impl->
_buffer->writeBytes( { offsetInBytes, range }, VK_ACCESS_INDEX_READ_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, data );
223 impl->
_data = indices;
230 params._elementSize = elementSize;
233 const std::pair<bufferPtr, size_t> initialData = { data, range };
236 impl->
_buffer = std::make_unique<vkBufferImpl>( params,
240 bufferName.c_str() );
250 U32 elementCountOffset,
251 U32 elementCountRange,
255 for (
auto& bufferImpl : _bufferObjects) {
256 if (bufferImpl._bindConfig._bufferIdx == buffer) {
265 DIVIDE_ASSERT(impl !=
nullptr,
"vkGenericVertexData error: set buffer called for invalid buffer index!");
268 const size_t dataCurrentSizeInBytes = elementCountRange * bufferParams.
_elementSize;
270 size_t offsetInBytes = elementCountOffset * bufferParams.
_elementSize;
272 DIVIDE_ASSERT(offsetInBytes + dataCurrentSizeInBytes <= bufferSizeInBytes);
279 if (!impl->
_buffer->waitForLockedRange({offsetInBytes, dataCurrentSizeInBytes}))
284 const BufferRange range = { offsetInBytes , dataCurrentSizeInBytes};
285 return impl->
_buffer->writeBytes(range, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, data);
#define PROFILE_SCOPE_AUTO(CATEGORY)
#define PROFILE_VK_EVENT(NAME)
#define PROFILE_VK_EVENT_AUTO_AND_CONTEX(BUFFER)
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
U16 queueLength() const noexcept
I32 queueIndex() const noexcept
SharedMutex _idxBufferLock
vector< IndexBufferEntry > _idxBuffers
BufferLock updateBuffer(U32 buffer, U32 elementCountOffset, U32 elementCountRange, bufferPtr data) noexcept override
BufferLock setIndexBuffer(const IndexBuffer &indices) override
vkGenericVertexData(GFXDevice &context, const U16 ringBufferLength, const std::string_view name)
BufferLock setBuffer(const SetBufferParams ¶ms) noexcept override
vector< GenericBufferImpl > _bufferObjects
void bindBufferInternal(const SetBufferParams::BufferBindConfig &bindConfig, VkCommandBuffer &cmdBuffer)
void draw(const GenericDrawCommand &command, VDIUserData *data) noexcept override
void reset() override
Also clears GPU memory.
constexpr Optick::Category::Type Graphics
Str StringFormat(const char *fmt, Args &&...args)
void SubmitRenderCommand(const GenericDrawCommand &drawCommand, const VkCommandBuffer commandBuffer, bool indexed)
Note: If internal format is not GL_NONE, an indexed draw is issued!
Handle console commands that start with a forward slash.
std::lock_guard< mutex > LockGuard
constexpr U32 to_U32(const T value)
constexpr U16 to_U16(const T value)
std::shared_lock< mutex > SharedLock
std::basic_string< char, std::char_traits< char >, dvd_allocator< char > > string
BufferUpdateFrequency _updateFrequency
size_t _elementSize
Buffer primitive size in bytes.
vector< U16 > _smallIndicesTemp
vkBufferImpl_uptr _buffer
SetBufferParams::BufferBindConfig _bindConfig
vkBufferImpl_uptr _buffer
VkCommandBuffer * _cmdBuffer
#define VK_PROFILE(FUNCTION,...)