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

128 lines
4.0 KiB
C++
Raw Normal View History

2017-10-10 23:32:13 +02:00
#include "dxvk_framebuffer.h"
namespace dxvk {
DxvkRenderTargets:: DxvkRenderTargets() { }
DxvkRenderTargets::~DxvkRenderTargets() { }
DxvkRenderPassFormat DxvkRenderTargets::renderPassFormat() const {
DxvkRenderPassFormat result;
2017-10-14 13:37:40 +02:00
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
if (m_colorTargets.at(i).view != nullptr) {
result.setColorFormat(i, DxvkRenderTargetFormat {
m_colorTargets.at(i).view->info().format,
m_colorTargets.at(i).view->imageInfo().layout,
m_colorTargets.at(i).view->imageInfo().layout,
m_colorTargets.at(i).layout });
result.setSampleCount(m_colorTargets.at(i).view->imageInfo().sampleCount);
2017-10-10 23:32:13 +02:00
}
}
if (m_depthTarget.view != nullptr) {
result.setDepthFormat(DxvkRenderTargetFormat {
m_depthTarget.view->info().format,
m_depthTarget.view->imageInfo().layout,
m_depthTarget.view->imageInfo().layout,
m_depthTarget.layout });
result.setSampleCount(m_depthTarget.view->imageInfo().sampleCount);
2017-10-10 23:32:13 +02:00
}
return result;
}
uint32_t DxvkRenderTargets::getAttachments(VkImageView* viewHandles) const {
uint32_t numViews = 0;
2017-10-10 23:32:13 +02:00
if (m_depthTarget.view != nullptr)
viewHandles[numViews++] = m_depthTarget.view->handle();
2017-10-10 23:32:13 +02:00
2017-10-14 13:37:40 +02:00
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
if (m_colorTargets.at(i).view != nullptr)
viewHandles[numViews++] = m_colorTargets.at(i).view->handle();
2017-10-10 23:32:13 +02:00
}
return numViews;
2017-10-10 23:32:13 +02:00
}
DxvkFramebufferSize DxvkRenderTargets::getImageSize() const {
if (m_depthTarget.view != nullptr)
return this->renderTargetSize(m_depthTarget.view);
2017-10-10 23:32:13 +02:00
2017-10-14 13:37:40 +02:00
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
if (m_colorTargets.at(i).view != nullptr)
return this->renderTargetSize(m_colorTargets.at(i).view);
2017-10-10 23:32:13 +02:00
}
return DxvkFramebufferSize { 0, 0, 0 };
}
bool DxvkRenderTargets::hasAttachments() const {
bool result = m_depthTarget.view != nullptr;
for (uint32_t i = 0; (i < MaxNumRenderTargets) && !result; i++)
result |= m_colorTargets.at(i).view != nullptr;
return result;
}
2017-10-10 23:32:13 +02:00
DxvkFramebufferSize DxvkRenderTargets::renderTargetSize(
const Rc<DxvkImageView>& renderTarget) const {
auto extent = renderTarget->mipLevelExtent(0);
2017-10-10 23:32:13 +02:00
auto layers = renderTarget->info().numLayers;
return DxvkFramebufferSize { extent.width, extent.height, layers };
}
DxvkFramebuffer::DxvkFramebuffer(
const Rc<vk::DeviceFn>& vkd,
const Rc<DxvkRenderPass>& renderPass,
const DxvkRenderTargets& renderTargets)
: m_vkd (vkd),
m_renderPass (renderPass),
m_renderTargets (renderTargets),
m_framebufferSize (renderTargets.getImageSize()) {
std::array<VkImageView, MaxNumRenderTargets + 1> views;
uint32_t viewCount = renderTargets.getAttachments(views.data());
2017-10-10 23:32:13 +02:00
VkFramebufferCreateInfo info;
info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
info.pNext = nullptr;
info.flags = 0;
info.renderPass = renderPass->handle();
info.attachmentCount = viewCount;
2017-10-10 23:32:13 +02:00
info.pAttachments = views.data();
info.width = m_framebufferSize.width;
info.height = m_framebufferSize.height;
info.layers = m_framebufferSize.layers;
if (m_vkd->vkCreateFramebuffer(m_vkd->device(), &info, nullptr, &m_framebuffer) != VK_SUCCESS)
throw DxvkError("DxvkFramebuffer: Failed to create framebuffer object");
2017-10-10 23:32:13 +02:00
}
DxvkFramebuffer::~DxvkFramebuffer() {
m_vkd->vkDestroyFramebuffer(
m_vkd->device(), m_framebuffer, nullptr);
}
uint32_t DxvkFramebuffer::findAttachment(
const Rc<DxvkImageView>& view) const {
if (m_renderTargets.getDepthTarget().view == view)
return 0;
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
if (m_renderTargets.getColorTarget(i).view == view)
return i;
}
return MaxNumRenderTargets;
}
2017-10-10 23:32:13 +02:00
}