mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[dxvk] Implement transform feedback draw call
This commit is contained in:
parent
929b75a038
commit
3a48092630
@ -146,6 +146,28 @@ namespace dxvk {
|
|||||||
return prevSlice;
|
return prevSlice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Transform feedback vertex stride
|
||||||
|
*
|
||||||
|
* Used when drawing after transform feedback,
|
||||||
|
* \returns The current xfb vertex stride
|
||||||
|
*/
|
||||||
|
uint32_t getXfbVertexStride() const {
|
||||||
|
return m_vertexStride;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set transform feedback vertex stride
|
||||||
|
*
|
||||||
|
* When the buffer is used as a transform feedback
|
||||||
|
* buffer, this will be set to the vertex stride
|
||||||
|
* defined by the geometry shader.
|
||||||
|
* \param [in] stride Vertex stride
|
||||||
|
*/
|
||||||
|
void setXfbVertexStride(uint32_t stride) {
|
||||||
|
m_vertexStride = stride;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Allocates new physical resource
|
* \brief Allocates new physical resource
|
||||||
* \returns The new backing buffer slice
|
* \returns The new backing buffer slice
|
||||||
@ -171,6 +193,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkPhysicalBufferSlice m_physSlice;
|
DxvkPhysicalBufferSlice m_physSlice;
|
||||||
uint32_t m_revision = 0;
|
uint32_t m_revision = 0;
|
||||||
|
uint32_t m_vertexStride = 0;
|
||||||
|
|
||||||
sync::Spinlock m_freeMutex;
|
sync::Spinlock m_freeMutex;
|
||||||
sync::Spinlock m_swapMutex;
|
sync::Spinlock m_swapMutex;
|
||||||
|
@ -1020,6 +1020,25 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DxvkContext::drawIndirectXfb(
|
||||||
|
const DxvkBufferSlice& counterBuffer,
|
||||||
|
uint32_t counterDivisor,
|
||||||
|
uint32_t counterBias) {
|
||||||
|
this->commitGraphicsState();
|
||||||
|
|
||||||
|
if (this->validateGraphicsState()) {
|
||||||
|
auto physicalSlice = counterBuffer.physicalSlice();
|
||||||
|
|
||||||
|
m_cmd->cmdDrawIndirectVertexCount(1, 0,
|
||||||
|
physicalSlice.handle(),
|
||||||
|
physicalSlice.offset(),
|
||||||
|
counterBias, counterDivisor);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DxvkContext::initImage(
|
void DxvkContext::initImage(
|
||||||
const Rc<DxvkImage>& image,
|
const Rc<DxvkImage>& image,
|
||||||
const VkImageSubresourceRange& subresources) {
|
const VkImageSubresourceRange& subresources) {
|
||||||
@ -2758,6 +2777,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void DxvkContext::updateTransformFeedbackBuffers() {
|
void DxvkContext::updateTransformFeedbackBuffers() {
|
||||||
|
auto gsOptions = m_state.gp.gs.shader->shaderOptions();
|
||||||
|
|
||||||
VkBuffer xfbBuffers[MaxNumXfbBuffers];
|
VkBuffer xfbBuffers[MaxNumXfbBuffers];
|
||||||
VkDeviceSize xfbOffsets[MaxNumXfbBuffers];
|
VkDeviceSize xfbOffsets[MaxNumXfbBuffers];
|
||||||
VkDeviceSize xfbLengths[MaxNumXfbBuffers];
|
VkDeviceSize xfbLengths[MaxNumXfbBuffers];
|
||||||
@ -2772,9 +2793,13 @@ namespace dxvk {
|
|||||||
if (physSlice.handle() == VK_NULL_HANDLE)
|
if (physSlice.handle() == VK_NULL_HANDLE)
|
||||||
xfbBuffers[i] = m_device->dummyBufferHandle();
|
xfbBuffers[i] = m_device->dummyBufferHandle();
|
||||||
|
|
||||||
if (physSlice.handle() != VK_NULL_HANDLE)
|
if (physSlice.handle() != VK_NULL_HANDLE) {
|
||||||
|
auto buffer = m_state.xfb.buffers[i].buffer();
|
||||||
|
buffer->setXfbVertexStride(gsOptions.xfbStrides[i]);
|
||||||
|
|
||||||
m_cmd->trackResource(physSlice.resource());
|
m_cmd->trackResource(physSlice.resource());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_cmd->cmdBindTransformFeedbackBuffers(
|
m_cmd->cmdBindTransformFeedbackBuffers(
|
||||||
0, MaxNumXfbBuffers,
|
0, MaxNumXfbBuffers,
|
||||||
|
@ -486,6 +486,18 @@ namespace dxvk {
|
|||||||
uint32_t count,
|
uint32_t count,
|
||||||
uint32_t stride);
|
uint32_t stride);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Transform feddback draw call
|
||||||
|
|
||||||
|
* \param [in] counterBuffer Xfb counter buffer
|
||||||
|
* \param [in] counterDivisor Vertex stride
|
||||||
|
* \param [in] counterBias Counter bias
|
||||||
|
*/
|
||||||
|
void drawIndirectXfb(
|
||||||
|
const DxvkBufferSlice& counterBuffer,
|
||||||
|
uint32_t counterDivisor,
|
||||||
|
uint32_t counterBias);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Generates mip maps
|
* \brief Generates mip maps
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user