Archived
1
Fork 0

Fix last few vulkan errors

Vulkan backend now renders! (albiet incorrectly)
This commit is contained in:
redstrate 2020-09-23 11:54:59 -04:00
parent 1ba9222a43
commit 505934fae8
14 changed files with 64 additions and 47 deletions

View file

@ -18,7 +18,7 @@
std::unique_ptr<Mesh> load_mesh(const file::Path path) {
Expects(!path.empty());
auto file = file::open(path);
auto file = file::open(path, true);
if(!file.has_value()) {
console::error(System::Renderer, "Failed to load mesh from {}!", path);
return nullptr;
@ -193,7 +193,7 @@ std::unique_ptr<Mesh> load_mesh(const file::Path path) {
std::unique_ptr<Texture> load_texture(const file::Path path) {
Expects(!path.empty());
auto file = file::open(path);
auto file = file::open(path, true);
if(!file.has_value()) {
console::error(System::Renderer, "Failed to load texture from {}!", path);
return nullptr;

View file

@ -18,9 +18,10 @@ file::Path file::root_path(const Path path) {
std::optional<file::File> file::open(const file::Path path, const bool binary_mode) {
Expects(!path.empty());
FILE* file = fopen(get_file_path(path).string().c_str(), binary_mode ? "rb" : "r");
auto str = get_file_path(path).string();
FILE* file = fopen(str.c_str(), binary_mode ? "rb" : "r");
if(file == nullptr) {
console::error(System::File, "Failed to open file handle from {}!", path);
console::error(System::File, "Failed to open file handle from {}!", str);
return {};
}
@ -29,9 +30,10 @@ std::optional<file::File> file::open(const file::Path path, const bool binary_mo
file::Path file::get_file_path(const file::Path path) {
auto fixed_path = path;
if(root_path(path) == app_domain) {
auto root = root_path(path);
if(root == app_domain) {
fixed_path = domain_data[static_cast<int>(Domain::App)] / path.lexically_relative(root_path(path));
} else if(root_path(path) == internal_domain) {
} else if(root == internal_domain) {
fixed_path = domain_data[static_cast<int>(Domain::Internal)] / path.lexically_relative(root_path(path));
}

View file

@ -118,6 +118,7 @@ struct GFXPushConstant {
enum class GFXBindingType {
StorageBuffer,
StorageImage,
PushConstant,
Texture
};

View file

@ -37,7 +37,7 @@ VkFormat toVkFormat(GFXPixelFormat format) {
return VK_FORMAT_R8G8_UNORM;
case GFXPixelFormat::R8G8_SFLOAT:
return VK_FORMAT_R8G8_SSCALED;
return VK_FORMAT_R16G16_SFLOAT;
case GFXPixelFormat::R8G8B8A8_UNORM:
return VK_FORMAT_R8G8B8A8_UNORM;
@ -715,6 +715,9 @@ GFXPipeline* GFXVulkan::create_graphics_pipeline(const GFXGraphicsPipelineCreate
case GFXBindingType::Texture:
descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
break;
case GFXBindingType::StorageImage:
descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
break;
}
VkDescriptorSetLayoutBinding layoutBinding = {};
@ -1115,6 +1118,7 @@ void GFXVulkan::createLogicalDevice(std::vector<const char*> extensions) {
enabledFeatures.fragmentStoresAndAtomics = true;
enabledFeatures.samplerAnisotropy = true;
enabledFeatures.fillModeNonSolid = true;
enabledFeatures.imageCubeArray = true;
createInfo.pEnabledFeatures = &enabledFeatures;

View file

@ -32,9 +32,16 @@ DoFPass::DoFPass(GFX* gfx, Renderer* renderer) : renderer(renderer) {
create_info.shaders.fragment_path = "dof.frag";
create_info.shader_input.bindings = {
{0, GFXBindingType::StorageImage},
{1, GFXBindingType::Texture},
{3, GFXBindingType::Texture},
{2, GFXBindingType::PushConstant}
};
create_info.shader_input.push_constants = {
{sizeof(Vector4), 0}
};
create_info.render_pass = renderpass;
create_info.blending.enable_blending = true;
@ -86,7 +93,7 @@ void DoFPass::render(GFXCommandBuffer* command_buffer, Scene&) {
command_buffer->bind_texture(renderer->offscreenColorTexture, 0);
command_buffer->bind_texture(renderer->offscreenDepthTexture, 1);
command_buffer->bind_texture(aperture_texture->handle, 2);
command_buffer->bind_texture(aperture_texture->handle, 3);
const auto extent = renderer->get_render_extent();

View file

@ -79,6 +79,8 @@ GFXPipeline* MaterialCompiler::create_skinned_pipeline(GFXGraphicsPipelineCreate
createInfo.shaders.vertex_src = get_shader(vertex_path, true, false);
createInfo.shaders.vertex_path = "";
createInfo.shader_input.bindings.push_back({ 14, GFXBindingType::StorageBuffer });
if(positions_only) {
createInfo.vertex_input.inputs = {
{position_buffer_index, sizeof(Vector3)},
@ -183,7 +185,6 @@ layout (binding = 5) uniform samplerShadow pcf_sampler;\n \
layout (binding = 6) uniform texture2DArray spot_shadow;\n \
layout(push_constant, binding = 0) uniform PushConstant {\n \
mat4 model;\n \
int materialOffset;\n \
};\n";
ShaderSource MaterialCompiler::compile_material_fragment(Material& material, bool use_ibl) {

View file

@ -338,16 +338,16 @@ void Renderer::render(Scene* scene, int index) {
commandbuffer->bind_texture(smaaPass->blend_texture, 3);
if(auto texture = get_requested_texture(PassTextureType::SelectionSobel))
commandbuffer->bind_texture(texture, 4);
commandbuffer->bind_texture(texture, 5);
else
commandbuffer->bind_texture(dummyTexture, 4);
commandbuffer->bind_texture(dummyTexture, 5);
commandbuffer->bind_texture(average_luminance_texture, 5);
commandbuffer->bind_texture(average_luminance_texture, 6);
if(render_options.enable_depth_of_field)
commandbuffer->bind_texture(dofPass->far_field, 6);
commandbuffer->bind_texture(dofPass->far_field, 7);
else
commandbuffer->bind_texture(dummyTexture, 6);
commandbuffer->bind_texture(dummyTexture, 7);
PostPushConstants pc;
pc.options.x = render_options.enable_aa;
@ -464,7 +464,6 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
struct PushConstant {
Matrix4x4 m;
int s;
} pc;
pc.m = scene.get<Transform>(obj).model;
@ -508,7 +507,7 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
if(!mesh.mesh->bones.empty())
command_buffer->bind_shader_buffer(part.bone_batrix_buffer, 0, 14, sizeof(Matrix4x4) * 128);
pc.s = material_indices[mesh.materials[material_index].handle];
command_buffer->set_push_constant(&pc, sizeof(PushConstant));
for(const auto& [index, texture] : mesh.materials[material_index]->bound_textures) {
@ -721,13 +720,8 @@ void Renderer::create_mesh_pipeline(Material& material) {
pipelineInfo.shaders.vertex_constants = {materials_constant, lights_constant, spot_lights_constant, probes_constant};
pipelineInfo.shaders.fragment_constants = {materials_constant, lights_constant, spot_lights_constant, probes_constant};
struct PushConstant {
Matrix4x4 m;
int s;
};
pipelineInfo.shader_input.push_constants = {
{sizeof(PushConstant), 0}
{sizeof(Matrix4x4), 0}
};
pipelineInfo.shader_input.bindings = {
@ -738,7 +732,9 @@ void Renderer::create_mesh_pipeline(Material& material) {
{4, GFXBindingType::Texture},
{5, GFXBindingType::Texture},
{6, GFXBindingType::Texture},
{7, GFXBindingType::Texture}
{7, GFXBindingType::Texture},
{8, GFXBindingType::Texture},
{9, GFXBindingType::Texture}
};
pipelineInfo.render_pass = offscreenRenderPass;
@ -750,6 +746,14 @@ void Renderer::create_mesh_pipeline(Material& material) {
pipelineInfo.shaders.fragment_src = material_compiler.compile_material_fragment(material);
pipelineInfo.shaders.fragment_path = "";
for (auto [index, texture] : material.bound_textures) {
GFXShaderBinding binding;
binding.binding = index;
binding.type = GFXBindingType::Texture;
pipelineInfo.shader_input.bindings.push_back(binding);
}
auto [static_pipeline, skinned_pipeline] = material_compiler.create_pipeline_permutations(pipelineInfo);
material.static_pipeline = static_pipeline;
@ -759,6 +763,8 @@ void Renderer::create_mesh_pipeline(Material& material) {
pipelineInfo.shaders.fragment_src = material_compiler.compile_material_fragment(material, false); // scene capture does not use IBL
pipelineInfo.shader_input.push_constants[0].size += sizeof(Matrix4x4);
material.capture_pipeline = material_compiler.create_static_pipeline(pipelineInfo, false, true);
}
@ -851,7 +857,10 @@ void Renderer::createPostPipeline() {
{4, GFXBindingType::PushConstant},
{1, GFXBindingType::Texture},
{2, GFXBindingType::Texture},
{3, GFXBindingType::Texture}
{3, GFXBindingType::Texture},
{5, GFXBindingType::Texture},
{6, GFXBindingType::Texture},
{7, GFXBindingType::Texture}
};
pipelineInfo.shader_input.push_constants = {

View file

@ -13,7 +13,6 @@
struct PushConstant {
Matrix4x4 m, v;
int s;
};
struct SceneMaterial {
@ -417,18 +416,18 @@ void SceneCapture::createIrradianceResources() {
irradianceOffscreenTexture = gfx->create_texture(textureInfo);
GFXFramebufferCreateInfo info;
info.attachments = {irradianceOffscreenTexture};
info.render_pass = renderPass;
irradianceFramebuffer = gfx->create_framebuffer(info);
GFXRenderPassCreateInfo renderPassInfo = {};
renderPassInfo.label = "Irradiance";
renderPassInfo.attachments.push_back(GFXPixelFormat::R8G8B8A8_UNORM);
irradianceRenderPass = gfx->create_render_pass(renderPassInfo);
GFXFramebufferCreateInfo info;
info.attachments = {irradianceOffscreenTexture};
info.render_pass = irradianceRenderPass;
irradianceFramebuffer = gfx->create_framebuffer(info);
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
pipelineInfo.label = "Irradiance Convolution";
pipelineInfo.shaders.vertex_path = "irradiance.vert";

View file

@ -167,7 +167,7 @@ void ShadowPass::render_meshes(GFXCommandBuffer* command_buffer, Scene& scene, c
if(render_options.enable_frustum_culling && !test_aabb_frustum(frustum, get_aabb_for_part(scene.get<Transform>(obj), part)))
continue;
command_buffer->bind_shader_buffer(part.bone_batrix_buffer, 0, 1, sizeof(Matrix4x4) * 128);
command_buffer->bind_shader_buffer(part.bone_batrix_buffer, 0, 14, sizeof(Matrix4x4) * 128);
command_buffer->draw_indexed(part.index_count, part.index_offset, part.vertex_offset, base_instance);
}
}
@ -391,7 +391,7 @@ void ShadowPass::create_offscreen_resources() {
GFXFramebufferCreateInfo info;
info.attachments = {offscreen_color_texture, offscreen_depth};
info.render_pass = render_pass;
info.render_pass = cube_render_pass;
offscreen_framebuffer = gfx->create_framebuffer(info);

View file

@ -3,7 +3,7 @@
#include "string_utils.hpp"
void file::set_domain_path(const file::Domain domain, const file::Path path) {
domain_data[(int)domain] = replace_substring(path.string(), "{resource_dir}", ".");
domain_data[(int)domain] = replace_substring(path.string(), "{resource_dir}/", "");
}
file::Path file::get_writeable_directory() {

View file

@ -5,7 +5,7 @@ layout(location = 2) in float depth;
layout(location = 0) out vec4 outColor;
layout(rgba32f, binding = 0) uniform image2D color_sampler;
layout(binding = 2) uniform sampler2D aperture_sampler;
layout(binding = 3) uniform sampler2D aperture_sampler;
layout(push_constant, binding = 2) uniform readonly PushConstant{
vec4 params;

View file

@ -17,7 +17,6 @@ layout (location = 6) in vec4 inBoneWeight;
layout (location = 0) out vec3 outFragPos;
layout (location = 1) out vec3 outNormal;
layout (location = 2) out vec2 outUV;
layout (location = 3) out flat int outMaterialId;
layout (location = 4) out vec4 fragPosLightSpace;
layout (location = 5) out mat3 outTBN;
layout (location = 14) out vec4 fragPostSpotLightSpace[max_spot_lights];
@ -50,12 +49,10 @@ layout(std430, binding = 1) buffer readonly SceneInformation {
#ifdef CUBEMAP
layout(push_constant, binding = 0) uniform readonly PushConstant{
mat4 model, view;
int materialOffset;
};
#else
layout(push_constant, binding = 0) uniform readonly PushConstant{
mat4 model;
int materialOffset;
};
#endif
@ -93,7 +90,6 @@ void main() {
outFragPos = vec3(model * vec4(inPosition, 1.0));
outNormal = bNor.xyz;
outUV = inUV;
outMaterialId = materialOffset;
fragPosLightSpace = (biasMat * scene.lightSpace) * bPos;
for(int i = 0; i < max_spot_lights; i++) {
@ -105,7 +101,6 @@ void main() {
outFragPos = vec3(model * vec4(inPosition, 1.0));
outNormal = mat3(model) * inNormal;
outUV = inUV;
outMaterialId = materialOffset;
fragPosLightSpace = (biasMat * scene.lightSpace * model) * vec4(inPosition, 1.0);
for(int i = 0; i < max_spot_lights; i++) {
@ -117,7 +112,6 @@ void main() {
outFragPos = vec3(model * vec4(inPosition, 1.0));
outNormal = mat3(model) * inNormal;
outUV = inUV;
outMaterialId = materialOffset;
fragPosLightSpace = (biasMat * scene.lightSpace * model) * vec4(inPosition, 1.0);
for(int i = 0; i < max_spot_lights; i++) {

View file

@ -22,9 +22,9 @@ layout (location = 0) out vec4 outColor;
layout (binding = 1) uniform sampler2D colorSampler;
layout (binding = 2) uniform sampler2D backSampler;
layout (binding = 3) uniform sampler2D blendSampler;
layout (binding = 4) uniform sampler2D sobelSampler;
layout (binding = 5) uniform sampler2D averageLuminanceSampler;
layout (binding = 6) uniform sampler2D farFieldSampler;
layout (binding = 5) uniform sampler2D sobelSampler;
layout (binding = 6) uniform sampler2D averageLuminanceSampler;
layout (binding = 7) uniform sampler2D farFieldSampler;
float calculate_sobel() {
float x = 1.0 / viewport.z;

View file

@ -15,7 +15,7 @@ layout(push_constant, binding = 0) uniform PushConstant {
};
#ifdef BONE
layout(std430, binding = 1) buffer readonly BoneInformation {
layout(std430, binding = 14) buffer readonly BoneInformation {
mat4 bones[128];
};
#endif