ppsspp/Common/Vulkan/VulkanRenderManager.cpp

68 lines
2.4 KiB
C++
Raw Normal View History

2017-08-16 23:03:30 +02:00
#include "VulkanRenderManager.h"
void VulkanRenderManager::Clear(uint32_t clearColor, float clearZ, int clearStencil, int clearMask) {
// If this is the first drawing command, merge it into the pass.
if (curRp_->numDraws == 0) {
curRp_->clearColor = clearColor;
curRp_->clearZ = clearZ;
curRp_->clearStencil = clearStencil;
curRp_->clearMask = clearMask;
} else {
VkRenderData data{ VKR_CLEAR };
data.clear.clearColor = clearColor;
data.clear.clearZ = clearZ;
data.clear.clearStencil = clearStencil;
data.clear.clearMask = clearMask;
curRp_->commands.push_back(data);
}
}
void VulkanRenderManager::Flush(VkCommandBuffer cmdbuf) {
// Optimizes renderpasses, then sequences them.
for (int i = 0; i < renderPasses_.size(); i++) {
auto &commands = renderPasses_[i]->commands;
for (const auto &c : commands) {
switch (c.cmd) {
case VKR_VIEWPORT:
vkCmdSetViewport(cmdbuf, 0, 1, &c.viewport.vp);
break;
case VKR_SCISSOR:
vkCmdSetScissor(cmdbuf, 0, 1, &c.scissor.scissor);
break;
case VKR_DRAW_INDEXED:
vkCmdBindDescriptorSets(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, c.drawIndexed.pipelineLayout, 0, 1, &c.drawIndexed.ds, c.drawIndexed.numUboOffsets, c.drawIndexed.uboOffsets);
vkCmdBindIndexBuffer(cmdbuf, c.drawIndexed.ibuffer, c.drawIndexed.ioffset, VK_INDEX_TYPE_UINT16);
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &c.drawIndexed.vbuffer, &c.drawIndexed.voffset);
vkCmdDrawIndexed(cmdbuf, c.drawIndexed.count, c.drawIndexed.instances, 0, 0, 0);
break;
case VKR_DRAW:
vkCmdBindDescriptorSets(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, c.drawIndexed.pipelineLayout, 0, 1, &c.draw.ds, c.draw.numUboOffsets, c.draw.uboOffsets);
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &c.drawIndexed.vbuffer, &c.drawIndexed.voffset);
vkCmdDraw(cmdbuf, c.drawIndexed.count, c.drawIndexed.instances, 0, 0);
break;
case VKR_STENCIL:
vkCmdSetStencilWriteMask(cmdbuf, VK_STENCIL_FRONT_AND_BACK, c.stencil.stencilWriteMask);
vkCmdSetStencilCompareMask(cmdbuf, VK_STENCIL_FRONT_AND_BACK, c.stencil.stencilCompareMask);
vkCmdSetStencilReference(cmdbuf, VK_STENCIL_FRONT_AND_BACK, c.stencil.stencilRef);
break;
case VKR_BLEND:
vkCmdSetBlendConstants(cmdbuf, c.blendColor.color);
break;
case VKR_CLEAR:
// vkCmdClearAttachments
break;
}
}
}
}
void VulkanRenderManager::Sync(VkCommandBuffer cmd) {
}