[dxvk] Inline all frequently-used binding methods

This commit is contained in:
Philip Rebohle 2022-06-22 01:58:57 +02:00
parent d4d87123b4
commit 758ba5a80d
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 80 additions and 125 deletions

View File

@ -142,92 +142,6 @@ namespace dxvk {
}
void DxvkContext::bindRenderTargets(
const DxvkRenderTargets& targets) {
// Set up default render pass ops
m_state.om.renderTargets = targets;
this->resetRenderPassOps(
m_state.om.renderTargets,
m_state.om.renderPassOps);
if (!m_state.om.framebufferInfo.hasTargets(targets)) {
// Create a new framebuffer object next
// time we start rendering something
m_flags.set(DxvkContextFlag::GpDirtyFramebuffer);
} else {
// Don't redundantly spill the render pass if
// the same render targets are bound again
m_flags.clr(DxvkContextFlag::GpDirtyFramebuffer);
}
}
void DxvkContext::bindDrawBuffers(
const DxvkBufferSlice& argBuffer,
const DxvkBufferSlice& cntBuffer) {
m_state.id.argBuffer = argBuffer;
m_state.id.cntBuffer = cntBuffer;
m_flags.set(DxvkContextFlag::DirtyDrawBuffer);
}
void DxvkContext::bindIndexBuffer(
const DxvkBufferSlice& buffer,
VkIndexType indexType) {
if (!m_state.vi.indexBuffer.matchesBuffer(buffer))
m_vbTracked.clr(MaxNumVertexBindings);
m_state.vi.indexBuffer = buffer;
m_state.vi.indexType = indexType;
m_flags.set(DxvkContextFlag::GpDirtyIndexBuffer);
}
void DxvkContext::bindResourceBuffer(
VkShaderStageFlags stages,
uint32_t slot,
const DxvkBufferSlice& buffer) {
bool needsUpdate = !m_rc[slot].bufferSlice.matchesBuffer(buffer);
if (likely(needsUpdate))
m_rcTracked.clr(slot);
m_rc[slot].bufferSlice = buffer;
m_descriptorState.dirtyBuffers(stages);
}
void DxvkContext::bindResourceView(
VkShaderStageFlags stages,
uint32_t slot,
const Rc<DxvkImageView>& imageView,
const Rc<DxvkBufferView>& bufferView) {
m_rc[slot].imageView = imageView;
m_rc[slot].bufferView = bufferView;
m_rc[slot].bufferSlice = bufferView != nullptr
? bufferView->slice()
: DxvkBufferSlice();
m_rcTracked.clr(slot);
m_descriptorState.dirtyViews(stages);
}
void DxvkContext::bindResourceSampler(
VkShaderStageFlags stages,
uint32_t slot,
const Rc<DxvkSampler>& sampler) {
m_rc[slot].sampler = sampler;
m_rcTracked.clr(slot);
m_descriptorState.dirtyViews(stages);
}
void DxvkContext::bindShader(
VkShaderStageFlagBits stage,
const Rc<DxvkShader>& shader) {
@ -257,37 +171,6 @@ namespace dxvk {
}
void DxvkContext::bindVertexBuffer(
uint32_t binding,
const DxvkBufferSlice& buffer,
uint32_t stride) {
if (!m_state.vi.vertexBuffers[binding].matchesBuffer(buffer))
m_vbTracked.clr(binding);
m_state.vi.vertexBuffers[binding] = buffer;
m_flags.set(DxvkContextFlag::GpDirtyVertexBuffers);
if (unlikely(m_state.vi.vertexStrides[binding] != stride)) {
m_state.vi.vertexStrides[binding] = stride;
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}
}
void DxvkContext::bindXfbBuffer(
uint32_t binding,
const DxvkBufferSlice& buffer,
const DxvkBufferSlice& counter) {
if (!m_state.xfb.buffers [binding].matches(buffer)
|| !m_state.xfb.counters[binding].matches(counter)) {
m_state.xfb.buffers [binding] = buffer;
m_state.xfb.counters[binding] = counter;
m_flags.set(DxvkContextFlag::GpDirtyXfbBuffers);
}
}
void DxvkContext::blitImage(
const Rc<DxvkImage>& dstImage,
const VkComponentMapping& dstMapping,

View File

@ -87,7 +87,24 @@ namespace dxvk {
* \param [in] targets Render targets to bind
*/
void bindRenderTargets(
const DxvkRenderTargets& targets);
const DxvkRenderTargets& targets) {
// Set up default render pass ops
m_state.om.renderTargets = targets;
this->resetRenderPassOps(
m_state.om.renderTargets,
m_state.om.renderPassOps);
if (!m_state.om.framebufferInfo.hasTargets(targets)) {
// Create a new framebuffer object next
// time we start rendering something
m_flags.set(DxvkContextFlag::GpDirtyFramebuffer);
} else {
// Don't redundantly spill the render pass if
// the same render targets are bound again
m_flags.clr(DxvkContextFlag::GpDirtyFramebuffer);
}
}
/**
* \brief Binds indirect argument buffer
@ -99,7 +116,12 @@ namespace dxvk {
*/
void bindDrawBuffers(
const DxvkBufferSlice& argBuffer,
const DxvkBufferSlice& cntBuffer);
const DxvkBufferSlice& cntBuffer) {
m_state.id.argBuffer = argBuffer;
m_state.id.cntBuffer = cntBuffer;
m_flags.set(DxvkContextFlag::DirtyDrawBuffer);
}
/**
* \brief Binds index buffer
@ -111,7 +133,15 @@ namespace dxvk {
*/
void bindIndexBuffer(
const DxvkBufferSlice& buffer,
VkIndexType indexType);
VkIndexType indexType) {
if (!m_state.vi.indexBuffer.matchesBuffer(buffer))
m_vbTracked.clr(MaxNumVertexBindings);
m_state.vi.indexBuffer = buffer;
m_state.vi.indexType = indexType;
m_flags.set(DxvkContextFlag::GpDirtyIndexBuffer);
}
/**
* \brief Binds buffer as a shader resource
@ -124,7 +154,16 @@ namespace dxvk {
void bindResourceBuffer(
VkShaderStageFlags stages,
uint32_t slot,
const DxvkBufferSlice& buffer);
const DxvkBufferSlice& buffer) {
bool needsUpdate = !m_rc[slot].bufferSlice.matchesBuffer(buffer);
if (likely(needsUpdate))
m_rcTracked.clr(slot);
m_rc[slot].bufferSlice = buffer;
m_descriptorState.dirtyBuffers(stages);
}
/**
* \brief Binds image or buffer view
@ -141,7 +180,16 @@ namespace dxvk {
VkShaderStageFlags stages,
uint32_t slot,
const Rc<DxvkImageView>& imageView,
const Rc<DxvkBufferView>& bufferView);
const Rc<DxvkBufferView>& bufferView) {
m_rc[slot].imageView = imageView;
m_rc[slot].bufferView = bufferView;
m_rc[slot].bufferSlice = bufferView != nullptr
? bufferView->slice()
: DxvkBufferSlice();
m_rcTracked.clr(slot);
m_descriptorState.dirtyViews(stages);
}
/**
* \brief Binds image sampler
@ -155,7 +203,12 @@ namespace dxvk {
void bindResourceSampler(
VkShaderStageFlags stages,
uint32_t slot,
const Rc<DxvkSampler>& sampler);
const Rc<DxvkSampler>& sampler) {
m_rc[slot].sampler = sampler;
m_rcTracked.clr(slot);
m_descriptorState.dirtyViews(stages);
}
/**
* \brief Binds a shader to a given state
@ -178,7 +231,18 @@ namespace dxvk {
void bindVertexBuffer(
uint32_t binding,
const DxvkBufferSlice& buffer,
uint32_t stride);
uint32_t stride) {
if (!m_state.vi.vertexBuffers[binding].matchesBuffer(buffer))
m_vbTracked.clr(binding);
m_state.vi.vertexBuffers[binding] = buffer;
m_flags.set(DxvkContextFlag::GpDirtyVertexBuffers);
if (unlikely(m_state.vi.vertexStrides[binding] != stride)) {
m_state.vi.vertexStrides[binding] = stride;
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}
}
/**
* \brief Binds transform feedback buffer
@ -190,7 +254,15 @@ namespace dxvk {
void bindXfbBuffer(
uint32_t binding,
const DxvkBufferSlice& buffer,
const DxvkBufferSlice& counter);
const DxvkBufferSlice& counter) {
if (!m_state.xfb.buffers [binding].matches(buffer)
|| !m_state.xfb.counters[binding].matches(counter)) {
m_state.xfb.buffers [binding] = buffer;
m_state.xfb.counters[binding] = counter;
m_flags.set(DxvkContextFlag::GpDirtyXfbBuffers);
}
}
/**
* \brief Blits an image