1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[dxvk] Implement indirct draw commands with indirect count

This commit is contained in:
Philip Rebohle 2019-04-24 21:50:34 +02:00
parent 13359d68d7
commit bacb1f7c60
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 105 additions and 12 deletions

View File

@ -3195,7 +3195,7 @@ namespace dxvk {
? pBuffer->GetBufferSlice() ? pBuffer->GetBufferSlice()
: DxvkBufferSlice() : DxvkBufferSlice()
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
ctx->bindDrawBuffer(cBufferSlice); ctx->bindDrawBuffers(cBufferSlice, DxvkBufferSlice());
}); });
} }

View File

@ -128,10 +128,13 @@ namespace dxvk {
} }
void DxvkContext::bindDrawBuffer( void DxvkContext::bindDrawBuffers(
const DxvkBufferSlice& buffer) { const DxvkBufferSlice& argBuffer,
if (!m_state.id.argBuffer.matches(buffer)) { const DxvkBufferSlice& cntBuffer) {
m_state.id.argBuffer = buffer; if (!m_state.id.argBuffer.matches(argBuffer)
|| !m_state.id.argBuffer.matches(cntBuffer)) {
m_state.id.argBuffer = argBuffer;
m_state.id.cntBuffer = cntBuffer;
m_flags.set(DxvkContextFlag::DirtyDrawBuffer); m_flags.set(DxvkContextFlag::DirtyDrawBuffer);
} }
@ -1458,6 +1461,32 @@ namespace dxvk {
} }
void DxvkContext::drawIndirectCount(
VkDeviceSize offset,
VkDeviceSize countOffset,
uint32_t maxCount,
uint32_t stride) {
this->commitGraphicsState(false);
if (this->validateGraphicsState()) {
auto argDescriptor = m_state.id.argBuffer.getDescriptor();
auto cntDescriptor = m_state.id.cntBuffer.getDescriptor();
m_cmd->cmdDrawIndirectCount(
argDescriptor.buffer.buffer,
argDescriptor.buffer.offset + offset,
cntDescriptor.buffer.buffer,
cntDescriptor.buffer.offset + countOffset,
maxCount, stride);
this->commitGraphicsPostBarriers();
this->trackDrawBuffer();
}
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1);
}
void DxvkContext::drawIndexed( void DxvkContext::drawIndexed(
uint32_t indexCount, uint32_t indexCount,
uint32_t instanceCount, uint32_t instanceCount,
@ -1501,6 +1530,32 @@ namespace dxvk {
} }
void DxvkContext::drawIndexedIndirectCount(
VkDeviceSize offset,
VkDeviceSize countOffset,
uint32_t maxCount,
uint32_t stride) {
this->commitGraphicsState(true);
if (this->validateGraphicsState()) {
auto argDescriptor = m_state.id.argBuffer.getDescriptor();
auto cntDescriptor = m_state.id.cntBuffer.getDescriptor();
m_cmd->cmdDrawIndexedIndirectCount(
argDescriptor.buffer.buffer,
argDescriptor.buffer.offset + offset,
cntDescriptor.buffer.buffer,
cntDescriptor.buffer.offset + countOffset,
maxCount, stride);
this->commitGraphicsPostBarriers();
this->trackDrawBuffer();
}
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1);
}
void DxvkContext::drawIndirectXfb( void DxvkContext::drawIndirectXfb(
const DxvkBufferSlice& counterBuffer, const DxvkBufferSlice& counterBuffer,
uint32_t counterDivisor, uint32_t counterDivisor,
@ -4004,6 +4059,9 @@ namespace dxvk {
if (m_state.id.argBuffer.defined()) if (m_state.id.argBuffer.defined())
m_cmd->trackResource(m_state.id.argBuffer.buffer()); m_cmd->trackResource(m_state.id.argBuffer.buffer());
if (m_state.id.cntBuffer.defined())
m_cmd->trackResource(m_state.id.cntBuffer.buffer());
} }
} }

View File

@ -105,12 +105,14 @@ namespace dxvk {
/** /**
* \brief Binds indirect argument buffer * \brief Binds indirect argument buffer
* *
* Sets the buffer that is going to be used * Sets the buffers that are going to be used
* for indirect draw and dispatch operations. * for indirect draw and dispatch operations.
* \param [in] buffer New argument buffer * \param [in] argBuffer New argument buffer
* \param [in] cntBuffer New count buffer
*/ */
void bindDrawBuffer( void bindDrawBuffers(
const DxvkBufferSlice& buffer); const DxvkBufferSlice& argBuffer,
const DxvkBufferSlice& cntBuffer);
/** /**
* \brief Binds index buffer * \brief Binds index buffer
@ -525,12 +527,12 @@ namespace dxvk {
uint32_t firstInstance); uint32_t firstInstance);
/** /**
* \brief Indirect indexed draw call * \brief Indirect draw call
* *
* Takes arguments from a buffer. The structure stored * Takes arguments from a buffer. The structure stored
* in the buffer must be of type \c VkDrawIndirectCommand. * in the buffer must be of type \c VkDrawIndirectCommand.
* \param [in] offset Draw buffer offset * \param [in] offset Draw buffer offset
* \param [in] count Number of dispatch calls * \param [in] count Number of draws
* \param [in] stride Stride between dispatch calls * \param [in] stride Stride between dispatch calls
*/ */
void drawIndirect( void drawIndirect(
@ -538,6 +540,22 @@ namespace dxvk {
uint32_t count, uint32_t count,
uint32_t stride); uint32_t stride);
/**
* \brief Indirect draw call
*
* Takes arguments from a buffer. The structure stored
* in the buffer must be of type \c VkDrawIndirectCommand.
* \param [in] offset Draw buffer offset
* \param [in] countOffset Draw count offset
* \param [in] maxCount Maximum number of draws
* \param [in] stride Stride between dispatch calls
*/
void drawIndirectCount(
VkDeviceSize offset,
VkDeviceSize countOffset,
uint32_t maxCount,
uint32_t stride);
/** /**
* \brief Draws primitives using an index buffer * \brief Draws primitives using an index buffer
* *
@ -560,7 +578,7 @@ namespace dxvk {
* Takes arguments from a buffer. The structure type for * Takes arguments from a buffer. The structure type for
* the draw buffer is \c VkDrawIndexedIndirectCommand. * the draw buffer is \c VkDrawIndexedIndirectCommand.
* \param [in] offset Draw buffer offset * \param [in] offset Draw buffer offset
* \param [in] count Number of dispatch calls * \param [in] count Number of draws
* \param [in] stride Stride between dispatch calls * \param [in] stride Stride between dispatch calls
*/ */
void drawIndexedIndirect( void drawIndexedIndirect(
@ -568,6 +586,22 @@ namespace dxvk {
uint32_t count, uint32_t count,
uint32_t stride); uint32_t stride);
/**
* \brief Indirect indexed draw call
*
* Takes arguments from a buffer. The structure type for
* the draw buffer is \c VkDrawIndexedIndirectCommand.
* \param [in] offset Draw buffer offset
* \param [in] countOffset Draw count offset
* \param [in] maxCount Maximum number of draws
* \param [in] stride Stride between dispatch calls
*/
void drawIndexedIndirectCount(
VkDeviceSize offset,
VkDeviceSize countOffset,
uint32_t maxCount,
uint32_t stride);
/** /**
* \brief Transform feddback draw call * \brief Transform feddback draw call

View File

@ -71,6 +71,7 @@ namespace dxvk {
struct DxvkIndirectDrawState { struct DxvkIndirectDrawState {
DxvkBufferSlice argBuffer; DxvkBufferSlice argBuffer;
DxvkBufferSlice cntBuffer;
}; };