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:
parent
13359d68d7
commit
bacb1f7c60
@ -3195,7 +3195,7 @@ namespace dxvk {
|
|||||||
? pBuffer->GetBufferSlice()
|
? pBuffer->GetBufferSlice()
|
||||||
: DxvkBufferSlice()
|
: DxvkBufferSlice()
|
||||||
] (DxvkContext* ctx) {
|
] (DxvkContext* ctx) {
|
||||||
ctx->bindDrawBuffer(cBufferSlice);
|
ctx->bindDrawBuffers(cBufferSlice, DxvkBufferSlice());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
struct DxvkIndirectDrawState {
|
struct DxvkIndirectDrawState {
|
||||||
DxvkBufferSlice argBuffer;
|
DxvkBufferSlice argBuffer;
|
||||||
|
DxvkBufferSlice cntBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user