diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 5e8fbaf5..c4e1e152 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -505,8 +505,26 @@ namespace dxvk { return; if (uav->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) { - Logger::err("D3D11: ClearUnorderedAccessViewUint: Not supported for buffers"); + const Rc bufferView = uav->GetBufferView(); + + if (bufferView->info().format == VK_FORMAT_R32_UINT) { + EmitCs([ + cClearValue = Values[0], + cDstSlice = bufferView->slice() + ] (DxvkContext* ctx) { + ctx->clearBuffer( + cDstSlice.buffer(), + cDstSlice.offset(), + cDstSlice.length(), + cClearValue); + }); + } else { + Logger::err("D3D11: ClearUnorderedAccessViewUint: Not supported for typed buffers"); + } } else { + // FIXME floating point formats are not handled correctly + // yet, we might need to create an image view with an + // integer format and clear that. VkClearColorValue clearValue; for (uint32_t i = 0; i < 4; i++) diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index b9aa2e0f..e419e991 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -144,97 +144,6 @@ namespace dxvk { }; - /** - * \brief Buffer view - * - * Allows the application to interpret buffer - * contents like formatted pixel data. These - * buffer views are used as texel buffers. - */ - class DxvkBufferView : public RcObject { - - public: - - DxvkBufferView( - const Rc& vkd, - const Rc& buffer, - const DxvkBufferViewCreateInfo& info); - - ~DxvkBufferView(); - - /** - * \brief Buffer view handle - * \returns Buffer view handle - */ - VkBufferView handle() const { - return m_physView->handle(); - } - - /** - * \brief Buffer view properties - * \returns Buffer view properties - */ - const DxvkBufferViewCreateInfo& info() const { - return m_info; - } - - /** - * \brief Underlying buffer object - * \returns Underlying buffer object - */ - const DxvkBufferCreateInfo& bufferInfo() const { - return m_buffer->info(); - } - - /** - * \brief Backing resource - * \returns Backing resource - */ - Rc viewResource() const { - return m_physView; - } - - /** - * \brief Backing buffer resource - * \returns Backing buffer resource - */ - Rc bufferResource() const { - return m_physView->slice().resource(); - } - - /** - * \brief Underlying buffer slice - * \returns Slice backing the view - */ - DxvkPhysicalBufferSlice slice() const { - return m_physView->slice(); - } - - /** - * \brief Updates the buffer view - * - * If the buffer has been invalidated ever since - * the view was created, the view is invalid as - * well and needs to be re-created. Call this - * prior to using the buffer view handle. - */ - void updateView(); - - private: - - Rc m_vkd; - DxvkBufferViewCreateInfo m_info; - - Rc m_buffer; - Rc m_physView; - - uint32_t m_revision = 0; - - Rc createView(); - - }; - - /** * \brief Buffer slice * @@ -350,4 +259,105 @@ namespace dxvk { }; + + /** + * \brief Buffer view + * + * Allows the application to interpret buffer + * contents like formatted pixel data. These + * buffer views are used as texel buffers. + */ + class DxvkBufferView : public RcObject { + + public: + + DxvkBufferView( + const Rc& vkd, + const Rc& buffer, + const DxvkBufferViewCreateInfo& info); + + ~DxvkBufferView(); + + /** + * \brief Buffer view handle + * \returns Buffer view handle + */ + VkBufferView handle() const { + return m_physView->handle(); + } + + /** + * \brief Buffer view properties + * \returns Buffer view properties + */ + const DxvkBufferViewCreateInfo& info() const { + return m_info; + } + + /** + * \brief Underlying buffer object + * \returns Underlying buffer object + */ + const DxvkBufferCreateInfo& bufferInfo() const { + return m_buffer->info(); + } + + /** + * \brief Backing resource + * \returns Backing resource + */ + Rc viewResource() const { + return m_physView; + } + + /** + * \brief Backing buffer resource + * \returns Backing buffer resource + */ + Rc bufferResource() const { + return m_physView->slice().resource(); + } + + /** + * \brief Underlying buffer slice + * \returns Slice backing the view + */ + DxvkBufferSlice slice() const { + return DxvkBufferSlice(m_buffer, + m_info.rangeOffset, + m_info.rangeLength); + } + + /** + * \brief Underlying buffer slice + * \returns Slice backing the view + */ + DxvkPhysicalBufferSlice physicalSlice() const { + return m_physView->slice(); + } + + /** + * \brief Updates the buffer view + * + * If the buffer has been invalidated ever since + * the view was created, the view is invalid as + * well and needs to be re-created. Call this + * prior to using the buffer view handle. + */ + void updateView(); + + private: + + Rc m_vkd; + DxvkBufferViewCreateInfo m_info; + + Rc m_buffer; + Rc m_physView; + + uint32_t m_revision = 0; + + Rc createView(); + + }; + } \ No newline at end of file diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 43aa8f13..6b8b8b7e 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1706,7 +1706,7 @@ namespace dxvk { slot.bufferSlice.bufferInfo().access); } else if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) { m_barriers.accessBuffer( - slot.bufferView->slice(), + slot.bufferView->physicalSlice(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,