mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 09:49:19 +02:00
Six module interfaces carry windows.h in their fragment, and a fragment's include guard does not cross the boundary, so a unit that imported first and included the SDK afterwards parsed it twice: clang reports it as conflicting redeclarations of BroadcastSystemMessageEx and mismatched uuids all through the SDK. Same shape as the basic_filebuf failure, one level further out - the header arrives through d3d12.h, not directly. Thirty units get a guarded windows.h ahead of everything; on Linux it is a no-op. Vendored single-header libraries are left alone, and the block goes after a BOM rather than before it.
103 lines
3.6 KiB
C++
103 lines
3.6 KiB
C++
#ifdef _WIN32
|
|
#include <windows.h> // before any import: its guard must be set here
|
|
#endif
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include "nvrendererbackend.h"
|
|
|
|
#include <fmt/format.h>
|
|
|
|
#include <array>
|
|
#include <chrono>
|
|
#include <deque>
|
|
#include <limits>
|
|
#include <mutex>
|
|
#include <ostream>
|
|
#include <sstream>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
#include <vector>
|
|
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};
|
|
}
|