mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-13 19:29:14 +01:00
[d3d11] Implemented ClearUnorderedAccessViewUint for raw and structured buffers
This commit is contained in:
parent
95e2c641e0
commit
85d28f7328
@ -505,8 +505,26 @@ namespace dxvk {
|
||||
return;
|
||||
|
||||
if (uav->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) {
|
||||
Logger::err("D3D11: ClearUnorderedAccessViewUint: Not supported for buffers");
|
||||
const Rc<DxvkBufferView> 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++)
|
||||
|
@ -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<vk::DeviceFn>& vkd,
|
||||
const Rc<DxvkBuffer>& 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<DxvkResource> viewResource() const {
|
||||
return m_physView;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Backing buffer resource
|
||||
* \returns Backing buffer resource
|
||||
*/
|
||||
Rc<DxvkResource> 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<vk::DeviceFn> m_vkd;
|
||||
DxvkBufferViewCreateInfo m_info;
|
||||
|
||||
Rc<DxvkBuffer> m_buffer;
|
||||
Rc<DxvkPhysicalBufferView> m_physView;
|
||||
|
||||
uint32_t m_revision = 0;
|
||||
|
||||
Rc<DxvkPhysicalBufferView> 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<vk::DeviceFn>& vkd,
|
||||
const Rc<DxvkBuffer>& 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<DxvkResource> viewResource() const {
|
||||
return m_physView;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Backing buffer resource
|
||||
* \returns Backing buffer resource
|
||||
*/
|
||||
Rc<DxvkResource> 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<vk::DeviceFn> m_vkd;
|
||||
DxvkBufferViewCreateInfo m_info;
|
||||
|
||||
Rc<DxvkBuffer> m_buffer;
|
||||
Rc<DxvkPhysicalBufferView> m_physView;
|
||||
|
||||
uint32_t m_revision = 0;
|
||||
|
||||
Rc<DxvkPhysicalBufferView> createView();
|
||||
|
||||
};
|
||||
|
||||
}
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user