mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-13 19:29:14 +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;
|
||||
}
|
||||
|
||||
/**
|
||||
* \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
|
||||
* \returns The new backing buffer slice
|
||||
@ -170,7 +192,8 @@ namespace dxvk {
|
||||
VkMemoryPropertyFlags m_memFlags;
|
||||
|
||||
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_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(
|
||||
const Rc<DxvkImage>& image,
|
||||
const VkImageSubresourceRange& subresources) {
|
||||
@ -2758,6 +2777,8 @@ namespace dxvk {
|
||||
|
||||
|
||||
void DxvkContext::updateTransformFeedbackBuffers() {
|
||||
auto gsOptions = m_state.gp.gs.shader->shaderOptions();
|
||||
|
||||
VkBuffer xfbBuffers[MaxNumXfbBuffers];
|
||||
VkDeviceSize xfbOffsets[MaxNumXfbBuffers];
|
||||
VkDeviceSize xfbLengths[MaxNumXfbBuffers];
|
||||
@ -2772,8 +2793,12 @@ namespace dxvk {
|
||||
if (physSlice.handle() == VK_NULL_HANDLE)
|
||||
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->cmdBindTransformFeedbackBuffers(
|
||||
|
@ -486,6 +486,18 @@ namespace dxvk {
|
||||
uint32_t count,
|
||||
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
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user