mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 14:29:20 +02:00
Ordering them before the imports in the same file was not enough: a project header on line 1 can import a module several levels down whose global module fragment already pulled in the same standard header, and that include guard does not cross the module boundary. Putting them first means the guard is set before anything can import. Skips vendored single-header libraries and anything inside an #if.
90 lines
3.3 KiB
C++
90 lines
3.3 KiB
C++
#include <cstddef>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include "nvrendererbackend.h"
|
|
|
|
#include <fmt/format.h>
|
|
|
|
import eu07.utilities.logs;
|
|
void NvRendererMessageCallback::message(nvrhi::MessageSeverity severity,
|
|
const char *messageText) {
|
|
switch (severity) {
|
|
case nvrhi::MessageSeverity::Info:
|
|
case nvrhi::MessageSeverity::Warning:
|
|
WriteLog(messageText);
|
|
break;
|
|
case nvrhi::MessageSeverity::Error:
|
|
ErrorLog(messageText);
|
|
//__debugbreak();
|
|
break;
|
|
case nvrhi::MessageSeverity::Fatal:
|
|
ErrorLog(messageText);
|
|
//__debugbreak();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void NvRendererBackend::Init() {
|
|
LoadShaderBlobs();
|
|
for (int i = 0; i < GetBackBufferCount(); ++i) {
|
|
m_framebuffers.emplace_back(GetDevice()->createFramebuffer(
|
|
nvrhi::FramebufferDesc().addColorAttachment(
|
|
nvrhi::FramebufferAttachment().setTexture(GetBackBuffer(i)))));
|
|
}
|
|
}
|
|
|
|
nvrhi::FramebufferHandle NvRendererBackend::GetCurrentFramebuffer() {
|
|
return m_framebuffers[GetCurrentBackBufferIndex()];
|
|
}
|
|
|
|
nvrhi::ShaderHandle NvRendererBackend::CreateShader(const std::string &name,
|
|
nvrhi::ShaderType type) {
|
|
if (auto blob_found = m_shader_blobs.find(name);
|
|
blob_found != m_shader_blobs.end()) {
|
|
const auto &blob = blob_found->second;
|
|
nvrhi::ShaderDesc shader_desc{};
|
|
shader_desc.shaderType = type;
|
|
shader_desc.debugName = name;
|
|
shader_desc.entryName = blob.m_entrypoint;
|
|
return GetDevice()->createShader(shader_desc, blob.m_blob.data(),
|
|
blob.m_blob.size());
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
nvrhi::ShaderHandle NvRendererBackend::CreateMaterialShader(
|
|
const std::string &name, NvRenderer::RenderPassType pass) {
|
|
if (auto blob_found = m_material_blobs.find(name);
|
|
blob_found != m_material_blobs.end()) {
|
|
const auto &blob = blob_found->second[static_cast<size_t>(pass)];
|
|
WriteLog(name);
|
|
WriteLog(blob.m_entrypoint);
|
|
WriteLog(fmt::format("{:d}", static_cast<int>(pass)));
|
|
if (blob.m_blob.empty()) return nullptr;
|
|
nvrhi::ShaderDesc shader_desc{};
|
|
shader_desc.shaderType = nvrhi::ShaderType::Pixel;
|
|
shader_desc.debugName = name;
|
|
shader_desc.entryName = blob.m_entrypoint;
|
|
return GetDevice()->createShader(shader_desc, blob.m_blob.data(),
|
|
blob.m_blob.size());
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
void NvRendererBackend::AddMaterialShaderBlob(std::string_view material,
|
|
std::string_view pass,
|
|
std::string blob,
|
|
const std::string &entrypoint) {
|
|
const static std::unordered_map<std::string_view, NvRenderer::RenderPassType>
|
|
material_passes{{"deferred", NvRenderer::RenderPassType::Deferred},
|
|
{"forward", NvRenderer::RenderPassType::Forward},
|
|
{"cubemap", NvRenderer::RenderPassType::CubeMap}};
|
|
m_material_blobs[std::string(material)][static_cast<size_t>(
|
|
material_passes.at(pass))] = {entrypoint, blob};
|
|
}
|
|
|
|
void NvRendererBackend::AddShaderBlob(std::string_view shader, std::string blob,
|
|
const std::string &entrypoint) {
|
|
m_shader_blobs[std::string(shader)] = {entrypoint, blob};
|
|
}
|