mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-23 04:27:45 +00:00
Add debug markers for peeking via RenderDoc
This commit is contained in:
parent
1fef1e2acd
commit
1815d60f21
11 changed files with 250 additions and 36 deletions
2
extern/libphysis
vendored
2
extern/libphysis
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 47b2c3fbc2159d81e40bcfbaf07687555592f47b
|
||||
Subproject commit 4fdec34e301140dd49da29be9da530312cb3a6c6
|
|
@ -223,6 +223,7 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material)
|
|||
// create the material parameters for this shader package
|
||||
newMaterial.materialBuffer =
|
||||
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
renderer->device().nameBuffer(newMaterial.materialBuffer, "g_MaterialParameter"); // TODO: add material name
|
||||
|
||||
// assumed to be floats, maybe not always true?
|
||||
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
|
||||
|
@ -253,23 +254,72 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material)
|
|||
newMaterial.type = MaterialType::Skin;
|
||||
}
|
||||
|
||||
newMaterial.tableTexture = renderer->device().createDummyTexture();
|
||||
if (material.color_table.num_rows > 0) {
|
||||
int width = 4;
|
||||
int height = material.color_table.num_rows;
|
||||
|
||||
qInfo() << "Creating color table" << width << "X" << height;
|
||||
|
||||
std::vector<float> rgbaData(width * height * 4);
|
||||
int offset = 0;
|
||||
for (int y = 0; y < height; y++) {
|
||||
for (int x = 0; x < width; x++) {
|
||||
const auto row = material.color_table.rows[y];
|
||||
|
||||
glm::vec4 color;
|
||||
if (x == 0) {
|
||||
color = glm::vec4{row.diffuse_color[0], row.diffuse_color[1], row.diffuse_color[2], row.specular_strength};
|
||||
} else if (x == 1) {
|
||||
color = glm::vec4{row.specular_color[0], row.specular_color[1], row.specular_color[2], row.gloss_strength};
|
||||
} else if (x == 2) {
|
||||
color = glm::vec4{row.emissive_color[0], row.emissive_color[1], row.emissive_color[2], row.tile_set};
|
||||
} else if (x == 3) {
|
||||
color = glm::vec4{row.material_repeat[0], row.material_repeat[1], row.material_skew[0], row.material_skew[1]};
|
||||
}
|
||||
|
||||
rgbaData[offset] = color.x;
|
||||
rgbaData[offset + 1] = color.y;
|
||||
rgbaData[offset + 2] = color.z;
|
||||
rgbaData[offset + 3] = color.a;
|
||||
|
||||
offset += 4;
|
||||
}
|
||||
}
|
||||
|
||||
physis_Texture textureConfig;
|
||||
textureConfig.texture_type = TextureType::TwoDimensional;
|
||||
textureConfig.width = width;
|
||||
textureConfig.height = height;
|
||||
textureConfig.depth = 1;
|
||||
textureConfig.rgba = reinterpret_cast<uint8_t *>(rgbaData.data());
|
||||
textureConfig.rgba_size = rgbaData.size() * sizeof(float);
|
||||
|
||||
// TODO: use 16-bit floating points like the game
|
||||
newMaterial.tableTexture = renderer->addGameTexture(VK_FORMAT_R32G32B32A32_SFLOAT, textureConfig);
|
||||
renderer->device().nameTexture(*newMaterial.tableTexture, "g_SamplerTable"); // TODO: add material name
|
||||
}
|
||||
|
||||
qInfo() << "Loading" << t;
|
||||
|
||||
char type = t[t.length() - 5];
|
||||
auto texture = physis_texture_parse(cache.lookupFile(QLatin1String(material.textures[i])));
|
||||
if (texture.rgba != nullptr) {
|
||||
switch (type) {
|
||||
case 'm': {
|
||||
newMaterial.multiTexture = renderer->addGameTexture(texture);
|
||||
newMaterial.multiTexture = renderer->addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, texture);
|
||||
renderer->device().nameTexture(*newMaterial.multiTexture, material.textures[i]);
|
||||
} break;
|
||||
case 'd': {
|
||||
newMaterial.diffuseTexture = renderer->addGameTexture(texture);
|
||||
newMaterial.diffuseTexture = renderer->addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, texture);
|
||||
renderer->device().nameTexture(*newMaterial.diffuseTexture, material.textures[i]);
|
||||
} break;
|
||||
case 'n': {
|
||||
newMaterial.normalTexture = renderer->addGameTexture(texture);
|
||||
newMaterial.normalTexture = renderer->addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, texture);
|
||||
renderer->device().nameTexture(*newMaterial.normalTexture, material.textures[i]);
|
||||
} break;
|
||||
case 's': {
|
||||
newMaterial.specularTexture = renderer->addGameTexture(texture);
|
||||
newMaterial.specularTexture = renderer->addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, texture);
|
||||
renderer->device().nameTexture(*newMaterial.specularTexture, material.textures[i]);
|
||||
} break;
|
||||
default:
|
||||
qDebug() << "unhandled type" << type;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
find_package(spirv_cross_core REQUIRED)
|
||||
find_package(spirv_cross_glsl REQUIRED)
|
||||
find_package(SPIRV-Headers REQUIRED)
|
||||
find_package(glslang REQUIRED)
|
||||
|
||||
add_library(renderer STATIC)
|
||||
target_sources(renderer
|
||||
|
@ -50,7 +51,9 @@ target_link_libraries(renderer
|
|||
imgui
|
||||
dxbc
|
||||
spirv-cross-core
|
||||
spirv-cross-glsl)
|
||||
spirv-cross-glsl
|
||||
glslang::SPIRV
|
||||
glslang::glslang-default-resource-limits)
|
||||
target_compile_definitions(renderer PUBLIC GLM_FORCE_RADIANS GLM_FORCE_DEPTH_ZERO_TO_ONE GLM_ENABLE_EXPERIMENTAL)
|
||||
target_compile_options(renderer PUBLIC -fexceptions) # needed for spirv-cross and dxbc
|
||||
|
||||
|
|
|
@ -59,6 +59,11 @@ public:
|
|||
|
||||
VkResult nameObject(VkObjectType type, uint64_t object, std::string_view name);
|
||||
void nameTexture(Texture &texture, std::string_view name);
|
||||
void nameBuffer(Buffer &buffer, std::string_view name);
|
||||
|
||||
Texture addGameTexture(physis_Texture gameTexture);
|
||||
Texture addGameTexture(VkFormat format, physis_Texture gameTexture);
|
||||
|
||||
void beginDebugMarker(VkCommandBuffer command_buffer, VkDebugUtilsLabelEXT marker_info);
|
||||
void endDebugMarker(VkCommandBuffer command_buffer);
|
||||
void insertDebugLabel(VkCommandBuffer command_buffer, VkDebugUtilsLabelEXT label_info);
|
||||
};
|
|
@ -25,7 +25,7 @@ struct RenderMaterial {
|
|||
std::optional<Texture> specularTexture;
|
||||
std::optional<Texture> multiTexture;
|
||||
|
||||
Texture tableTexture;
|
||||
std::optional<Texture> tableTexture;
|
||||
|
||||
Buffer materialBuffer;
|
||||
};
|
||||
|
|
|
@ -58,7 +58,11 @@ private:
|
|||
|
||||
void beginPass(uint32_t imageIndex, VkCommandBuffer commandBuffer, std::string_view passName);
|
||||
void endPass(VkCommandBuffer commandBuffer, std::string_view passName);
|
||||
CachedPipeline &bindPipeline(VkCommandBuffer commandBuffer, std::string_view passName, physis_Shader &vertexShader, physis_Shader &pixelShader);
|
||||
CachedPipeline &bindPipeline(VkCommandBuffer commandBuffer,
|
||||
std::string_view passName,
|
||||
physis_Shader &vertexShader,
|
||||
physis_Shader &pixelShader,
|
||||
std::string_view shaderName);
|
||||
VkShaderModule convertShaderModule(const physis_Shader &shader, spv::ExecutionModel executionModel);
|
||||
spirv_cross::CompilerGLSL getShaderModuleResources(const physis_Shader &shader);
|
||||
|
||||
|
@ -66,6 +70,7 @@ private:
|
|||
|
||||
physis_SHPK directionalLightningShpk;
|
||||
physis_SHPK createViewPositionShpk;
|
||||
physis_SHPK backgroundShpk;
|
||||
|
||||
// combined vertex + pixel code length
|
||||
std::unordered_map<uint32_t, CachedPipeline> m_cachedPipelines;
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
|
||||
DrawObject addDrawObject(const physis_MDL &model, int lod);
|
||||
void reloadDrawObject(DrawObject &model, uint32_t lod);
|
||||
Texture addGameTexture(physis_Texture gameTexture);
|
||||
Texture addGameTexture(VkFormat format, physis_Texture gameTexture);
|
||||
|
||||
void render(const std::vector<DrawObject> &models);
|
||||
|
||||
|
|
|
@ -340,7 +340,13 @@ void Device::nameTexture(Texture &texture, std::string_view name)
|
|||
nameObject(VK_OBJECT_TYPE_DEVICE_MEMORY, reinterpret_cast<uint64_t>(texture.imageMemory), name.data());
|
||||
}
|
||||
|
||||
Texture Device::addGameTexture(physis_Texture gameTexture)
|
||||
void Device::nameBuffer(Buffer &buffer, std::string_view name)
|
||||
{
|
||||
nameObject(VK_OBJECT_TYPE_BUFFER, reinterpret_cast<uint64_t>(buffer.buffer), name.data());
|
||||
nameObject(VK_OBJECT_TYPE_DEVICE_MEMORY, reinterpret_cast<uint64_t>(buffer.memory), name.data());
|
||||
}
|
||||
|
||||
Texture Device::addGameTexture(VkFormat format, physis_Texture gameTexture)
|
||||
{
|
||||
Texture newTexture = {};
|
||||
|
||||
|
@ -359,7 +365,7 @@ Texture Device::addGameTexture(physis_Texture gameTexture)
|
|||
imageInfo.extent.depth = gameTexture.depth;
|
||||
imageInfo.mipLevels = 1;
|
||||
imageInfo.arrayLayers = 1;
|
||||
imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
|
||||
imageInfo.format = format;
|
||||
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
|
@ -468,4 +474,25 @@ Texture Device::addGameTexture(physis_Texture gameTexture)
|
|||
vkCreateImageView(device, &viewInfo, nullptr, &newTexture.imageView);
|
||||
|
||||
return newTexture;
|
||||
}
|
||||
}
|
||||
|
||||
void Device::beginDebugMarker(VkCommandBuffer command_buffer, VkDebugUtilsLabelEXT marker_info)
|
||||
{
|
||||
auto func = (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT");
|
||||
if (func != nullptr)
|
||||
func(command_buffer, &marker_info);
|
||||
}
|
||||
|
||||
void Device::endDebugMarker(VkCommandBuffer command_buffer)
|
||||
{
|
||||
auto func = (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT");
|
||||
if (func != nullptr)
|
||||
func(command_buffer);
|
||||
}
|
||||
|
||||
void Device::insertDebugLabel(VkCommandBuffer command_buffer, VkDebugUtilsLabelEXT label_info)
|
||||
{
|
||||
auto func = (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT");
|
||||
if (func != nullptr)
|
||||
func(command_buffer, &label_info);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,9 @@
|
|||
#include <QDebug>
|
||||
|
||||
#include <glm/ext/matrix_clip_space.hpp>
|
||||
#include <glslang/Public/ResourceLimits.h>
|
||||
#include <glslang/Public/ShaderLang.h>
|
||||
#include <glslang/SPIRV/GlslangToSpv.h>
|
||||
#include <physis.hpp>
|
||||
#include <spirv_glsl.hpp>
|
||||
|
||||
|
@ -63,8 +66,11 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
m_dummyTex = m_device.createDummyTexture();
|
||||
m_dummyBuffer = m_device.createDummyBuffer();
|
||||
|
||||
m_tileNormal = m_device.addGameTexture(physis_texture_parse(physis_gamedata_extract_file(m_data, "chara/common/texture/-tile_n.tex")));
|
||||
m_tileDiffuse = m_device.addGameTexture(physis_texture_parse(physis_gamedata_extract_file(m_data, "chara/common/texture/-tile_d.tex")));
|
||||
m_tileNormal =
|
||||
m_device.addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, physis_texture_parse(physis_gamedata_extract_file(m_data, "chara/common/texture/-tile_n.tex")));
|
||||
m_device.nameTexture(m_tileNormal, "chara/common/texture/-tile_n.tex");
|
||||
m_tileDiffuse = m_device.addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, physis_t"Exexture_parse(physis_gamedata_extract_file(m_data, "chara/common/texture/-tile_d.tex")));
|
||||
m_device.nameTexture(m_tileDiffuse, "chara/common/texture/-tile_d.tex");
|
||||
|
||||
size_t vertexSize = planeVertices.size() * sizeof(glm::vec4);
|
||||
m_planeVertexBuffer = m_device.createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
||||
|
@ -72,15 +78,18 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
|
||||
directionalLightningShpk = physis_parse_shpk(physis_gamedata_extract_file(m_data, "shader/sm5/shpk/directionallighting.shpk"));
|
||||
createViewPositionShpk = physis_parse_shpk(physis_gamedata_extract_file(m_data, "shader/sm5/shpk/createviewposition.shpk"));
|
||||
backgroundShpk = physis_parse_shpk(physis_gamedata_extract_file(m_data, "shader/sm5/shpk/bg.shpk"));
|
||||
|
||||
// camera data
|
||||
{
|
||||
g_CameraParameter = m_device.createBuffer(sizeof(CameraParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_CameraParameter, "g_CameraParameter");
|
||||
}
|
||||
|
||||
// instance data
|
||||
{
|
||||
g_InstanceParameter = m_device.createBuffer(sizeof(InstanceParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_InstanceParameter, "g_InstanceParameter");
|
||||
|
||||
InstanceParameter instanceParameter{};
|
||||
instanceParameter.g_InstanceParameter.m_MulColor = glm::vec4(1.0f);
|
||||
|
@ -100,6 +109,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// model data
|
||||
{
|
||||
g_ModelParameter = m_device.createBuffer(sizeof(ModelParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_ModelParameter, "g_ModelParameter");
|
||||
|
||||
ModelParameter modelParameter{};
|
||||
modelParameter.g_ModelParameter.m_Params = glm::vec4(1.0f);
|
||||
|
@ -109,6 +119,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// material data
|
||||
{
|
||||
g_TransparencyMaterialParameter = m_device.createBuffer(sizeof(MaterialParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_TransparencyMaterialParameter, "g_TransparencyMaterialParameter");
|
||||
|
||||
MaterialParameters materialParameter{};
|
||||
materialParameter.parameters[0] = glm::vec4(1.0f, 1.0f, 1.0f, 2.0f); // diffuse color then alpha threshold
|
||||
|
@ -119,6 +130,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// light data
|
||||
{
|
||||
g_LightParam = m_device.createBuffer(sizeof(LightParam), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_LightParam, "g_LightParam");
|
||||
|
||||
LightParam lightParam{};
|
||||
lightParam.m_Position = glm::vec4(-5);
|
||||
|
@ -135,11 +147,13 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// common data
|
||||
{
|
||||
g_CommonParameter = m_device.createBuffer(sizeof(CommonParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_CommonParameter, "g_CommonParameter");
|
||||
}
|
||||
|
||||
// scene data
|
||||
{
|
||||
g_SceneParameter = m_device.createBuffer(sizeof(SceneParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_SceneParameter, "g_SceneParameter");
|
||||
|
||||
SceneParameter sceneParameter{};
|
||||
m_device.copyToBuffer(g_SceneParameter, &sceneParameter, sizeof(SceneParameter));
|
||||
|
@ -148,8 +162,18 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// customize data
|
||||
{
|
||||
g_CustomizeParameter = m_device.createBuffer(sizeof(CustomizeParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_CustomizeParameter, "g_CustomizeParameter");
|
||||
|
||||
CustomizeParameter customizeParameter{};
|
||||
customizeParameter.m_SkinColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_HairFresnelValue0 = glm::vec4(1.0f);
|
||||
customizeParameter.m_LipColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_MainColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_HairFresnelValue0 = glm::vec4(1.0f);
|
||||
customizeParameter.m_MeshColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_LeftColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_RightColor = glm::vec4(1.0f);
|
||||
customizeParameter.m_OptionColor = glm::vec4(1.0f);
|
||||
|
||||
m_device.copyToBuffer(g_CustomizeParameter, &customizeParameter, sizeof(CustomizeParameter));
|
||||
}
|
||||
|
@ -157,6 +181,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// material parameter dynamic
|
||||
{
|
||||
g_MaterialParameterDynamic = m_device.createBuffer(sizeof(MaterialParameterDynamic), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_MaterialParameterDynamic, "g_MaterialParameterDynamic");
|
||||
|
||||
MaterialParameterDynamic materialParameterDynamic{};
|
||||
|
||||
|
@ -166,6 +191,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// decal color
|
||||
{
|
||||
g_DecalColor = m_device.createBuffer(sizeof(glm::vec4), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_DecalColor, "g_DecalColor");
|
||||
|
||||
glm::vec4 color{};
|
||||
|
||||
|
@ -175,6 +201,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// ambient params
|
||||
{
|
||||
g_AmbientParam = m_device.createBuffer(sizeof(AmbientParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_AmbientParam, "g_AmbientParam");
|
||||
|
||||
AmbientParameters ambientParameters{};
|
||||
for (int i = 0; i < 6; i++) {
|
||||
|
@ -190,6 +217,7 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
// shader type parameter
|
||||
if (m_dawntrailMode) {
|
||||
g_ShaderTypeParameter = m_device.createBuffer(sizeof(ShaderTypeParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
m_device.nameBuffer(g_ShaderTypeParameter, "g_ShaderTypeParameter");
|
||||
|
||||
ShaderTypeParameter shaderTypeParameter{};
|
||||
|
||||
|
@ -249,6 +277,11 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
beginPass(imageIndex, commandBuffer, pass);
|
||||
|
||||
for (auto &model : models) {
|
||||
VkDebugUtilsLabelEXT labelExt{};
|
||||
labelExt.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
|
||||
labelExt.pLabelName = model.name.toStdString().c_str();
|
||||
m_device.beginDebugMarker(commandBuffer, labelExt);
|
||||
|
||||
// copy bone data
|
||||
{
|
||||
const size_t bufferSize = sizeof(glm::mat3x4) * 64;
|
||||
|
@ -361,7 +394,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader vertexShader = renderMaterial.shaderPackage.vertex_shaders[vertexShaderIndice];
|
||||
physis_Shader pixelShader = renderMaterial.shaderPackage.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader);
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader, renderMaterial.mat.shpk_name);
|
||||
bindDescriptorSets(commandBuffer, pipeline, &model, &renderMaterial, pass);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
|
@ -371,6 +404,8 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
vkCmdDrawIndexed(commandBuffer, part.numIndices, 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
m_device.endDebugMarker(commandBuffer);
|
||||
}
|
||||
|
||||
endPass(commandBuffer, pass);
|
||||
|
@ -416,7 +451,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader vertexShader = createViewPositionShpk.vertex_shaders[vertexShaderIndice];
|
||||
physis_Shader pixelShader = createViewPositionShpk.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, "PASS_LIGHTING_OPAQUE_VIEWPOSITION", vertexShader, pixelShader);
|
||||
auto &pipeline = bindPipeline(commandBuffer, "PASS_LIGHTING_OPAQUE_VIEWPOSITION", vertexShader, pixelShader, "createviewposition.shpk");
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr, pass);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
|
@ -471,7 +506,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader vertexShader = directionalLightningShpk.vertex_shaders[vertexShaderIndice];
|
||||
physis_Shader pixelShader = directionalLightningShpk.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader);
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader, "directionallighting.shpk");
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr, pass);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
|
@ -580,7 +615,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader vertexShader = renderMaterial.shaderPackage.vertex_shaders[vertexShaderIndice];
|
||||
physis_Shader pixelShader = renderMaterial.shaderPackage.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader);
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader, renderMaterial.mat.shpk_name);
|
||||
bindDescriptorSets(commandBuffer, pipeline, &model, &renderMaterial, pass);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
|
@ -613,6 +648,11 @@ void GameRenderer::resize()
|
|||
|
||||
void GameRenderer::beginPass(uint32_t imageIndex, VkCommandBuffer commandBuffer, const std::string_view passName)
|
||||
{
|
||||
VkDebugUtilsLabelEXT labelExt{};
|
||||
labelExt.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
|
||||
labelExt.pLabelName = passName.data();
|
||||
m_device.beginDebugMarker(commandBuffer, labelExt);
|
||||
|
||||
VkRenderingInfo renderingInfo{VK_STRUCTURE_TYPE_RENDERING_INFO};
|
||||
renderingInfo.renderArea.extent = m_device.swapChain->extent;
|
||||
|
||||
|
@ -760,16 +800,24 @@ void GameRenderer::beginPass(uint32_t imageIndex, VkCommandBuffer commandBuffer,
|
|||
void GameRenderer::endPass(VkCommandBuffer commandBuffer, std::string_view passName)
|
||||
{
|
||||
vkCmdEndRendering(commandBuffer);
|
||||
|
||||
m_device.endDebugMarker(commandBuffer);
|
||||
}
|
||||
|
||||
GameRenderer::CachedPipeline &
|
||||
GameRenderer::bindPipeline(VkCommandBuffer commandBuffer, std::string_view passName, physis_Shader &vertexShader, physis_Shader &pixelShader)
|
||||
GameRenderer::CachedPipeline &GameRenderer::bindPipeline(VkCommandBuffer commandBuffer,
|
||||
std::string_view passName,
|
||||
physis_Shader &vertexShader,
|
||||
physis_Shader &pixelShader,
|
||||
std::string_view shaderName)
|
||||
{
|
||||
const uint32_t hash = vertexShader.len + pixelShader.len + physis_shpk_crc(passName.data());
|
||||
if (!m_cachedPipelines.contains(hash)) {
|
||||
auto vertexShaderModule = convertShaderModule(vertexShader, spv::ExecutionModelVertex);
|
||||
auto fragmentShaderModule = convertShaderModule(pixelShader, spv::ExecutionModelFragment);
|
||||
|
||||
m_device.nameObject(VK_OBJECT_TYPE_SHADER_MODULE, reinterpret_cast<uint64_t>(vertexShaderModule), shaderName);
|
||||
m_device.nameObject(VK_OBJECT_TYPE_SHADER_MODULE, reinterpret_cast<uint64_t>(fragmentShaderModule), shaderName);
|
||||
|
||||
VkPipelineShaderStageCreateInfo vertexShaderStageInfo = {};
|
||||
vertexShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
vertexShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;
|
||||
|
@ -1082,6 +1130,53 @@ GameRenderer::bindPipeline(VkCommandBuffer commandBuffer, std::string_view passN
|
|||
return pipeline;
|
||||
}
|
||||
|
||||
std::vector<uint32_t> compileGLSL(const std::string_view sourceString, const EShLanguage sourceLanguage)
|
||||
{
|
||||
static bool ProcessInitialized = false;
|
||||
|
||||
if (!ProcessInitialized) {
|
||||
glslang::InitializeProcess();
|
||||
ProcessInitialized = true;
|
||||
}
|
||||
|
||||
const char *InputCString = sourceString.data();
|
||||
|
||||
glslang::TShader shader(sourceLanguage);
|
||||
shader.setStrings(&InputCString, 1);
|
||||
|
||||
int ClientInputSemanticsVersion = 100; // maps to, say, #define VULKAN 100
|
||||
|
||||
shader.setEnvInput(glslang::EShSourceGlsl, sourceLanguage, glslang::EShClientVulkan, ClientInputSemanticsVersion);
|
||||
|
||||
shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3);
|
||||
shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_6);
|
||||
|
||||
if (!shader.parse(GetDefaultResources(), 100, false, EShMsgDefault)) {
|
||||
return {};
|
||||
}
|
||||
|
||||
glslang::TProgram Program;
|
||||
Program.addShader(&shader);
|
||||
|
||||
if (!Program.link(EShMsgDefault)) {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<unsigned int> SpirV;
|
||||
spv::SpvBuildLogger logger;
|
||||
|
||||
glslang::SpvOptions spvOptions;
|
||||
spvOptions.generateDebugInfo = true;
|
||||
spvOptions.stripDebugInfo = false;
|
||||
spvOptions.disableOptimizer = true;
|
||||
spvOptions.emitNonSemanticShaderDebugSource = true;
|
||||
spvOptions.emitNonSemanticShaderDebugInfo = true;
|
||||
|
||||
glslang::GlslangToSpv(*Program.getIntermediate(sourceLanguage), SpirV, &logger, &spvOptions);
|
||||
|
||||
return SpirV;
|
||||
}
|
||||
|
||||
VkShaderModule GameRenderer::convertShaderModule(const physis_Shader &shader, spv::ExecutionModel executionModel)
|
||||
{
|
||||
dxvk::DxbcReader reader(reinterpret_cast<const char *>(shader.bytecode), shader.len);
|
||||
|
@ -1091,14 +1186,6 @@ VkShaderModule GameRenderer::convertShaderModule(const physis_Shader &shader, sp
|
|||
dxvk::DxbcModuleInfo info;
|
||||
auto result = module.compile(info, "test");
|
||||
|
||||
VkShaderModuleCreateInfo createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
createInfo.codeSize = result.code.size();
|
||||
createInfo.pCode = reinterpret_cast<const uint32_t *>(result.code.data());
|
||||
|
||||
VkShaderModule shaderModule;
|
||||
vkCreateShaderModule(m_device.device, &createInfo, nullptr, &shaderModule);
|
||||
|
||||
// TODO: for debug only
|
||||
spirv_cross::CompilerGLSL glsl(result.code.data(), result.code.dwords());
|
||||
|
||||
|
@ -1106,6 +1193,23 @@ VkShaderModule GameRenderer::convertShaderModule(const physis_Shader &shader, sp
|
|||
|
||||
int i = 0;
|
||||
for (auto texture : resources.stage_inputs) {
|
||||
if (texture.name == "v0") {
|
||||
glsl.set_name(texture.id, "Position");
|
||||
} else if (texture.name == "v1") {
|
||||
glsl.set_name(texture.id, "Color");
|
||||
} else if (texture.name == "v2") {
|
||||
glsl.set_name(texture.id, "Normal");
|
||||
} else if (texture.name == "v3") {
|
||||
glsl.set_name(texture.id, "TexCoord");
|
||||
} else if (texture.name == "v4") {
|
||||
glsl.set_name(texture.id, "Tangent");
|
||||
} else if (texture.name == "v5") {
|
||||
glsl.set_name(texture.id, "Bitangent");
|
||||
} else if (texture.name == "v6") {
|
||||
glsl.set_name(texture.id, "BoneWeight");
|
||||
} else if (texture.name == "v7") {
|
||||
glsl.set_name(texture.id, "BoneId");
|
||||
}
|
||||
// glsl.set_name(texture.id, shader.)
|
||||
// qInfo() << shader.resource_parameters[i].name << texture.id;
|
||||
// qInfo() << "stage input" << i << texture.name << glsl.get_type(texture.type_id).width;
|
||||
|
@ -1136,6 +1240,16 @@ VkShaderModule GameRenderer::convertShaderModule(const physis_Shader &shader, sp
|
|||
|
||||
qInfo() << "Compiled GLSL:" << glsl.compile().c_str();
|
||||
|
||||
auto newModule = compileGLSL(glsl.compile(), executionModel == spv::ExecutionModelVertex ? EShLanguage::EShLangVertex : EShLanguage::EShLangFragment);
|
||||
|
||||
VkShaderModuleCreateInfo createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
createInfo.codeSize = newModule.size() * sizeof(uint32_t);
|
||||
createInfo.pCode = reinterpret_cast<const uint32_t *>(newModule.data());
|
||||
|
||||
VkShaderModule shaderModule;
|
||||
vkCreateShaderModule(m_device.device, &createInfo, nullptr, &shaderModule);
|
||||
|
||||
return shaderModule;
|
||||
}
|
||||
|
||||
|
@ -1228,13 +1342,20 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline
|
|||
} else if (strcmp(name, "g_SamplerSpecular") == 0) {
|
||||
Q_ASSERT(material);
|
||||
info->imageView = material->specularTexture->imageView;
|
||||
} else if (strcmp(name, "g_SamplerMask") == 0) {
|
||||
Q_ASSERT(material);
|
||||
info->imageView = material->multiTexture->imageView;
|
||||
} else if (strcmp(name, "g_SamplerTileNormal") == 0) {
|
||||
info->imageView = m_tileNormal.imageView;
|
||||
} else if (strcmp(name, "g_SamplerTileDiffuse") == 0) {
|
||||
info->imageView = m_tileDiffuse.imageView;
|
||||
} else if (strcmp(name, "g_SamplerTable") == 0) {
|
||||
Q_ASSERT(material);
|
||||
info->imageView = material->tableTexture.imageView;
|
||||
if (!material->tableTexture.has_value()) {
|
||||
qWarning() << "Attempted to use table texture for a non-dyeable material. Something has went wrong!";
|
||||
} else {
|
||||
info->imageView = material->tableTexture->imageView;
|
||||
}
|
||||
} else {
|
||||
info->imageView = m_dummyTex.imageView;
|
||||
qInfo() << "Unknown image" << name;
|
||||
|
|
|
@ -311,7 +311,7 @@ void ImGuiPass::createFontImage()
|
|||
texture.rgba = pixels;
|
||||
texture.rgba_size = width * height * 4;
|
||||
|
||||
auto tex = renderer_.addGameTexture(texture);
|
||||
auto tex = renderer_.addGameTexture(VK_FORMAT_R8G8B8A8_UNORM, texture);
|
||||
fontImageView_ = tex.imageView;
|
||||
fontSampler_ = renderer_.defaultSampler();
|
||||
|
||||
|
|
|
@ -100,8 +100,11 @@ RenderManager::RenderManager(GameData *data)
|
|||
createInfo.ppEnabledExtensionNames = instanceExtensions.data();
|
||||
createInfo.enabledExtensionCount = instanceExtensions.size();
|
||||
createInfo.pApplicationInfo = &applicationInfo;
|
||||
// createInfo.ppEnabledLayerNames = layers;
|
||||
// createInfo.enabledLayerCount = 1;
|
||||
|
||||
if (qgetenv("NOVUS_ENABLE_VALIDATION") == QByteArrayLiteral("1")) {
|
||||
createInfo.ppEnabledLayerNames = layers;
|
||||
createInfo.enabledLayerCount = 1;
|
||||
}
|
||||
|
||||
vkCreateInstance(&createInfo, nullptr, &m_device->instance);
|
||||
|
||||
|
@ -520,9 +523,9 @@ void RenderManager::reloadDrawObject(DrawObject &DrawObject, uint32_t lod)
|
|||
DrawObject.boneInfoBuffer = m_device->createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
}
|
||||
|
||||
Texture RenderManager::addGameTexture(physis_Texture gameTexture)
|
||||
Texture RenderManager::addGameTexture(VkFormat format, physis_Texture gameTexture)
|
||||
{
|
||||
return m_device->addGameTexture(gameTexture);
|
||||
return m_device->addGameTexture(format, gameTexture);
|
||||
}
|
||||
|
||||
Device &RenderManager::device()
|
||||
|
|
Loading…
Add table
Reference in a new issue