mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +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;
|
return;
|
||||||
|
|
||||||
if (uav->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) {
|
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 {
|
} 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;
|
VkClearColorValue clearValue;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < 4; i++)
|
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
|
* \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);
|
slot.bufferSlice.bufferInfo().access);
|
||||||
} else if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
|
} else if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
|
||||||
m_barriers.accessBuffer(
|
m_barriers.accessBuffer(
|
||||||
slot.bufferView->slice(),
|
slot.bufferView->physicalSlice(),
|
||||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||||
VK_ACCESS_SHADER_READ_BIT |
|
VK_ACCESS_SHADER_READ_BIT |
|
||||||
VK_ACCESS_SHADER_WRITE_BIT,
|
VK_ACCESS_SHADER_WRITE_BIT,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user