refactor: move all caches to RenderResources object
This commit is contained in:
@@ -7,10 +7,13 @@
|
||||
|
||||
#include "tracy/TracyVulkan.hpp"
|
||||
|
||||
GameRenderer::GameRenderer(MeshCache& meshCache, MaterialCache& matCache): meshCache{meshCache}, materialCache{matCache} {
|
||||
GameRenderer::GameRenderer()
|
||||
{
|
||||
}
|
||||
|
||||
void GameRenderer::init(GfxDevice& gfxDevice, const glm::ivec2& drawImageSize) {
|
||||
void GameRenderer::init(GfxDevice& gfxDevice, RenderResources& _resources, glm::ivec2 drawImageSize)
|
||||
{
|
||||
resources = &_resources;
|
||||
sceneDataBuffer.init(
|
||||
gfxDevice,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
@@ -20,10 +23,10 @@ void GameRenderer::init(GfxDevice& gfxDevice, const glm::ivec2& drawImageSize) {
|
||||
createDrawImage(gfxDevice, drawImageSize, true);
|
||||
|
||||
meshPipeline = std::make_unique<MeshPipeline>();
|
||||
meshPipeline->init(gfxDevice, drawImageFormat, depthImageFormat);
|
||||
meshPipeline->init(gfxDevice, _resources, drawImageFormat, depthImageFormat);
|
||||
|
||||
skyboxPipeline = std::make_unique<SkyboxPipeline>();
|
||||
skyboxPipeline->init(gfxDevice, drawImageFormat, depthImageFormat);
|
||||
skyboxPipeline->init(gfxDevice, _resources, drawImageFormat, depthImageFormat);
|
||||
|
||||
skinningPipeline = std::make_unique<SkinningPipeline>();
|
||||
skinningPipeline->init(gfxDevice);
|
||||
@@ -32,28 +35,33 @@ void GameRenderer::init(GfxDevice& gfxDevice, const glm::ivec2& drawImageSize) {
|
||||
GameState::GetInstance().SetRenderer(this);
|
||||
}
|
||||
|
||||
void GameRenderer::beginDrawing(GfxDevice& gfxDevice) {
|
||||
void GameRenderer::beginDrawing(GfxDevice& gfxDevice)
|
||||
{
|
||||
flushMaterialUpdates(gfxDevice);
|
||||
meshDrawCommands.clear();
|
||||
skinningPipeline->beginDrawing(gfxDevice.getCurrentFrameIndex());
|
||||
}
|
||||
|
||||
void GameRenderer::endDrawing() {
|
||||
void GameRenderer::endDrawing()
|
||||
{
|
||||
//Sort the drawlist
|
||||
}
|
||||
|
||||
void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera& camera, const SceneData& sceneData) {
|
||||
void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera& camera, const SceneData& sceneData)
|
||||
{
|
||||
ZoneScopedN("GameRenderer::draw");
|
||||
TracyVkZone(gfxDevice.getTracyVkCtx(), cmd, "GameRenderer::draw");
|
||||
|
||||
{
|
||||
TracyVkZone(gfxDevice.getTracyVkCtx(), cmd, "Skinning");
|
||||
|
||||
for (const auto& dc : meshDrawCommands) {
|
||||
if (!dc.skinnedMesh) {
|
||||
for (const auto& dc : meshDrawCommands)
|
||||
{
|
||||
if (!dc.skinnedMesh)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
skinningPipeline->doSkinning(cmd, gfxDevice.getCurrentFrameIndex(), meshCache, dc);
|
||||
skinningPipeline->doSkinning(cmd, gfxDevice.getCurrentFrameIndex(), resources->meshes(), dc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +74,7 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
.ambientIntensity = sceneData.ambientIntensity,
|
||||
.fogColor = {sceneData.fogColor},
|
||||
.fogDensity = sceneData.fogDensity,
|
||||
.materialsBuffer = materialCache.getMaterialDataBufferAddress(),
|
||||
.materialsBuffer = resources->materials().getMaterialDataBufferAddress(),
|
||||
};
|
||||
|
||||
{
|
||||
@@ -74,7 +82,7 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
|
||||
vkutil::bufferHostWriteToShaderReadBarrier(
|
||||
cmd,
|
||||
materialCache.getMaterialDataBuffer().buffer,
|
||||
resources->materials().getMaterialDataBuffer().buffer,
|
||||
0,
|
||||
VK_WHOLE_SIZE
|
||||
);
|
||||
@@ -91,10 +99,9 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
);
|
||||
}
|
||||
|
||||
const auto& drawImage = gfxDevice.getImage(drawImageId);
|
||||
const auto& depthImage = gfxDevice.getImage(depthImageId);
|
||||
const auto& drawImage = resources->getImage(drawImageId);
|
||||
const auto& depthImage = resources->getImage(depthImageId);
|
||||
|
||||
// vkutil::cmdBeginLabel(cmd, "Geometry");
|
||||
{
|
||||
TracyVkZone(gfxDevice.getTracyVkCtx(), cmd, "Transition Draw Image");
|
||||
|
||||
@@ -135,9 +142,7 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
meshPipeline->draw(
|
||||
cmd,
|
||||
drawImage.getExtent2D(),
|
||||
gfxDevice,
|
||||
meshCache,
|
||||
materialCache,
|
||||
*resources,
|
||||
camera,
|
||||
sceneDataBuffer.getBuffer(),
|
||||
meshDrawCommands,
|
||||
@@ -147,7 +152,7 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
{
|
||||
TracyVkZone(gfxDevice.getTracyVkCtx(), cmd, "SkyboxPipeline::draw");
|
||||
|
||||
skyboxPipeline->draw(cmd, gfxDevice, camera);
|
||||
skyboxPipeline->draw(cmd, *resources, camera);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -158,7 +163,8 @@ void GameRenderer::draw(VkCommandBuffer cmd, GfxDevice& gfxDevice, const Camera&
|
||||
// vkutil::cmdEndLabel(cmd);
|
||||
}
|
||||
|
||||
void GameRenderer::cleanup(GfxDevice& gfxDevice) {
|
||||
void GameRenderer::cleanup(GfxDevice& gfxDevice)
|
||||
{
|
||||
VkDevice device = gfxDevice.getDevice().device;
|
||||
|
||||
vkDeviceWaitIdle(device);
|
||||
@@ -175,17 +181,18 @@ void GameRenderer::cleanup(GfxDevice& gfxDevice) {
|
||||
sceneDataBuffer.cleanup(gfxDevice);
|
||||
|
||||
// if (drawImageId != NULL_IMAGE_ID)
|
||||
// gfxDevice.destroyImage();
|
||||
// gfxDevice.destroyImage();
|
||||
|
||||
// if (depthImageId != NULL_IMAGE_ID)
|
||||
// gfxDevice.destroyImage(depthImageId);
|
||||
// gfxDevice.destroyImage(depthImageId);
|
||||
|
||||
drawImageId = NULL_IMAGE_ID;
|
||||
depthImageId = NULL_IMAGE_ID;
|
||||
}
|
||||
|
||||
void GameRenderer::drawMesh(MeshID id, const glm::mat4& transform, MaterialID materialId) {
|
||||
const auto& mesh = meshCache.getMesh(id);
|
||||
void GameRenderer::drawMesh(MeshID id, const glm::mat4& transform, MaterialID materialId)
|
||||
{
|
||||
const auto& mesh = resources->meshes().getMesh(id);
|
||||
const auto worldBoundingSphere = edge::calculateBoundingSphereWorld(transform, mesh.boundingSphere, false);
|
||||
assert(materialId != NULL_MATERIAL_ID);
|
||||
|
||||
@@ -197,46 +204,54 @@ void GameRenderer::drawMesh(MeshID id, const glm::mat4& transform, MaterialID ma
|
||||
}
|
||||
|
||||
void GameRenderer::drawSkinnedMesh(MeshID id,
|
||||
const glm::mat4& transform,
|
||||
MaterialID materialId,
|
||||
SkinnedMesh* skinnedMesh,
|
||||
std::size_t jointMatricesStartIndex) {
|
||||
const auto& mesh = meshCache.getMesh(id);
|
||||
const auto worldBoundingSphere = edge::calculateBoundingSphereWorld(transform, mesh.boundingSphere, false);
|
||||
const glm::mat4& transform,
|
||||
MaterialID materialId,
|
||||
SkinnedMesh* skinnedMesh,
|
||||
std::size_t jointMatricesStartIndex)
|
||||
{
|
||||
const auto& mesh = resources->meshes().getMesh(id);
|
||||
const auto worldBoundingSphere = edge::calculateBoundingSphereWorld(transform, mesh.boundingSphere, false);
|
||||
assert(materialId != NULL_MATERIAL_ID);
|
||||
assert(skinnedMesh != nullptr);
|
||||
|
||||
meshDrawCommands.push_back(MeshDrawCommand{
|
||||
.meshId = id,
|
||||
.transformMatrix = transform,
|
||||
.materialId = materialId,
|
||||
.skinnedMesh = skinnedMesh,
|
||||
.meshId = id,
|
||||
.transformMatrix = transform,
|
||||
.materialId = materialId,
|
||||
.skinnedMesh = skinnedMesh,
|
||||
.jointMatricesStartIndex = static_cast<std::uint32_t>(jointMatricesStartIndex),
|
||||
});
|
||||
}
|
||||
|
||||
const GPUImage& GameRenderer::getDrawImage(const GfxDevice& gfx_device) const {
|
||||
return gfx_device.getImage(drawImageId);
|
||||
const GPUImage& GameRenderer::getDrawImage() const
|
||||
{
|
||||
assert(resources);
|
||||
return resources->getImage(drawImageId);
|
||||
}
|
||||
|
||||
Material& GameRenderer::getMaterialMutable(MaterialID id) {
|
||||
Material& GameRenderer::getMaterialMutable(MaterialID id)
|
||||
{
|
||||
assert(id != NULL_MATERIAL_ID);
|
||||
return materialCache.getMaterialMutable(id);
|
||||
return resources->materials().getMaterialMutable(id);
|
||||
}
|
||||
|
||||
void GameRenderer::updateMaterialGPU(MaterialID id) {
|
||||
void GameRenderer::updateMaterialGPU(MaterialID id)
|
||||
{
|
||||
assert(id != NULL_MATERIAL_ID);
|
||||
pendingMaterialUploads.push_back(id);
|
||||
}
|
||||
|
||||
void GameRenderer::setSkyboxTexture(ImageID skyboxImageId) {
|
||||
void GameRenderer::setSkyboxTexture(ImageID skyboxImageId)
|
||||
{
|
||||
spdlog::debug("Set skybox texture to image id {}", skyboxImageId);
|
||||
skyboxPipeline->setSkyboxImage(skyboxImageId);
|
||||
}
|
||||
|
||||
void GameRenderer::flushMaterialUpdates(GfxDevice& gfxDevice) {
|
||||
for (MaterialID id : pendingMaterialUploads) {
|
||||
materialCache.updateMaterialGPU(gfxDevice, id);
|
||||
void GameRenderer::flushMaterialUpdates(GfxDevice& gfxDevice)
|
||||
{
|
||||
for (MaterialID id : pendingMaterialUploads)
|
||||
{
|
||||
resources->materials().updateMaterialGPU(id);
|
||||
// if non-coherent: flush mapped range for that id here
|
||||
}
|
||||
pendingMaterialUploads.clear();
|
||||
@@ -247,14 +262,15 @@ void GameRenderer::createDrawImage(GfxDevice& gfxDevice,
|
||||
bool firstCreate)
|
||||
{
|
||||
const VkExtent3D drawImageExtent{
|
||||
.width = (std::uint32_t)drawImageSize.x,
|
||||
.width = (std::uint32_t)drawImageSize.x,
|
||||
.height = (std::uint32_t)drawImageSize.y,
|
||||
.depth = 1,
|
||||
.depth = 1,
|
||||
};
|
||||
|
||||
constexpr VkSampleCountFlagBits noMsaa = VK_SAMPLE_COUNT_1_BIT;
|
||||
|
||||
{ // setup draw image (single-sampled)
|
||||
{
|
||||
// setup draw image (single-sampled)
|
||||
VkImageUsageFlags usages{};
|
||||
usages |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||
usages |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||
@@ -262,32 +278,33 @@ void GameRenderer::createDrawImage(GfxDevice& gfxDevice,
|
||||
usages |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
|
||||
auto createImageInfo = vkutil::CreateImageInfo{
|
||||
.format = drawImageFormat,
|
||||
.usage = usages,
|
||||
.extent = drawImageExtent,
|
||||
.format = drawImageFormat,
|
||||
.usage = usages,
|
||||
.extent = drawImageExtent,
|
||||
.samples = noMsaa,
|
||||
};
|
||||
|
||||
// reuse the same id if creating again
|
||||
drawImageId = gfxDevice.createImage(createImageInfo, "draw image", nullptr, drawImageId);
|
||||
drawImageId = resources->createImage(gfxDevice, createImageInfo, "draw image", nullptr, drawImageId);
|
||||
|
||||
if (firstCreate) {
|
||||
if (firstCreate)
|
||||
{
|
||||
// Optional: a separate post-fx target (ping-pong)
|
||||
// postFXDrawImageId = gfxDevice.createImage(createImageInfo, "post FX draw image");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
{ // setup depth image (single-sampled)
|
||||
{
|
||||
// setup depth image (single-sampled)
|
||||
auto createInfo = vkutil::CreateImageInfo{
|
||||
.format = depthImageFormat,
|
||||
.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||
.extent = drawImageExtent,
|
||||
.format = depthImageFormat,
|
||||
.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||
.extent = drawImageExtent,
|
||||
.samples = noMsaa,
|
||||
};
|
||||
|
||||
depthImageId = gfxDevice.createImage(createInfo, "depth image", nullptr, depthImageId);
|
||||
depthImageId = resources->createImage(gfxDevice, createInfo, "depth image", nullptr, depthImageId);
|
||||
spdlog::info("Created depth image with id {}", depthImageId);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user