Two Pipelines simultaniously, however the second dimension one doesnt draw atm...
Some checks are pending
ci/woodpecker/push/woodpecker.json Pipeline is pending

This commit is contained in:
Rebekah 2024-07-28 13:40:23 -04:00
parent 8c537caca4
commit 0424e339a6
Signed by: oneechanhax
GPG Key ID: 0074BF373B812798
4 changed files with 112 additions and 68 deletions

View File

@ -21,7 +21,7 @@
layout(location = 0) in vec3 frag_color;
layout(location = 1) in vec2 frag_texture_coordinate;
layout(binding = 1) uniform sampler2D texture_sampler;
layout(binding = 0) uniform sampler2D texture_sampler;
layout(location = 0) out vec4 out_color;

View File

@ -0,0 +1,33 @@
/*
* VulkZample
* Copyright (C) 2024 Rebekah Rowe
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#version 450
layout(location = 0) in vec2 in_position;
layout(location = 2) in vec3 in_color;
layout(location = 4) in vec2 in_texture_coordinate;
layout(location = 0) out vec3 frag_color;
layout(location = 1) out vec2 frag_texture_coordinate;
void main() {
gl_Position = vec4(in_position, 0.5, 1.0);
frag_color = in_color;
frag_texture_coordinate = in_texture_coordinate;
}

View File

@ -19,7 +19,7 @@
#version 450
layout(binding = 0) uniform UniformBufferObject {
layout(binding = 1) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;

View File

@ -141,7 +141,7 @@ private:
vk::VertexInputAttributeDescription { // https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/00_Vertex_input_description.html
.location = 0,
.binding = 0,
.format = vk::Format::eR32G32B32Sfloat,
.format = vk::Format::eR32G32Sfloat,
.offset = offsetof(Vertex2, pos) },
vk::VertexInputAttributeDescription {
.location = 2,
@ -219,7 +219,7 @@ private:
: parent(_parent) { assert(_parent != nullptr); }
public:
std::optional<vk::raii::DescriptorSetLayout> vk_descriptor_set_layout_ubo;
std::optional<vk::raii::DescriptorSetLayout> vk_descriptor_set_layout;
std::optional<vk::raii::DescriptorPool> vk_descriptor_pool;
std::vector<vk::raii::DescriptorSet> vk_descriptor_sets;
@ -249,25 +249,24 @@ private:
this->vk_shader_frag.emplace(gpu, gfx_shaders.second);
}
{
constexpr vk::DescriptorSetLayoutBinding descriptor_set_layout_binding_ubo {
.binding = 0,
.descriptorType = vk::DescriptorType::eUniformBuffer,
.descriptorCount = 1,
.stageFlags = vk::ShaderStageFlagBits::eVertex,
.pImmutableSamplers = nullptr // Optional
};
constexpr vk::DescriptorSetLayoutBinding descriptor_set_layout_binding_sampler {
.binding = UsesProjection() ? 1 : 0,
.descriptorType = vk::DescriptorType::eCombinedImageSampler,
.descriptorCount = 1,
.stageFlags = vk::ShaderStageFlagBits::eFragment,
.pImmutableSamplers = nullptr // Optional
};
constexpr auto descriptor_set_layout_bindings = [&]() {
if constexpr (UsesProjection())
return std::array<vk::DescriptorSetLayoutBinding, 2> { descriptor_set_layout_binding_ubo, descriptor_set_layout_binding_sampler };
else
constexpr vk::DescriptorSetLayoutBinding descriptor_set_layout_binding_sampler {
.binding = 0,
.descriptorType = vk::DescriptorType::eCombinedImageSampler,
.descriptorCount = 1,
.stageFlags = vk::ShaderStageFlagBits::eFragment,
.pImmutableSamplers = nullptr // Optional
};
if constexpr (UsesProjection()) {
constexpr vk::DescriptorSetLayoutBinding descriptor_set_layout_binding_ubo {
.binding = 1,
.descriptorType = vk::DescriptorType::eUniformBuffer,
.descriptorCount = 1,
.stageFlags = vk::ShaderStageFlagBits::eVertex,
.pImmutableSamplers = nullptr // Optional
};
return std::array<vk::DescriptorSetLayoutBinding, 2> { descriptor_set_layout_binding_sampler, descriptor_set_layout_binding_ubo };
} else
return std::array<vk::DescriptorSetLayoutBinding, 1> { descriptor_set_layout_binding_sampler };
}();
@ -275,7 +274,7 @@ private:
.bindingCount = static_cast<std::uint32_t>(descriptor_set_layout_bindings.size()),
.pBindings = descriptor_set_layout_bindings.data()
};
this->vk_descriptor_set_layout_ubo.emplace(gpu, descriptor_set_layout_create_info);
this->vk_descriptor_set_layout.emplace(gpu, descriptor_set_layout_create_info);
}
{ // Init graphics pipeline/renderpass
const vk::PipelineShaderStageCreateInfo shader_stage_create_info_vertex {
@ -374,7 +373,7 @@ private:
const vk::PipelineLayoutCreateInfo pipeline_layout_create_info {
.setLayoutCount = 1, // Optional
.pSetLayouts = &**this->vk_descriptor_set_layout_ubo, // Optional
.pSetLayouts = &**this->vk_descriptor_set_layout, // Optional
//.pushConstantRangeCount = 0, // Optional
//.pPushConstantRanges = nullptr // Optional
};
@ -415,17 +414,17 @@ private:
}
void UpdateDescriptors(const vk::ImageView& texture_view) {
{ // update descriptors
const vk::DescriptorPoolSize descriptor_pool_size_sampler {
.type = vk::DescriptorType::eCombinedImageSampler,
.descriptorCount = static_cast<std::uint32_t>(this->parent->vk_max_frames_in_flight)
};
const vk::DescriptorPoolSize descriptor_pool_size_ubo {
.type = vk::DescriptorType::eUniformBuffer,
.descriptorCount = static_cast<std::uint32_t>(this->parent->vk_max_frames_in_flight)
};
const vk::DescriptorPoolSize descriptor_pool_size_sampler {
.type = vk::DescriptorType::eCombinedImageSampler,
.descriptorCount = static_cast<std::uint32_t>(this->parent->vk_max_frames_in_flight)
};
const auto descriptor_pool_sizes = [&]() {
if constexpr (UsesProjection())
return std::array<vk::DescriptorPoolSize, 2> { descriptor_pool_size_ubo, descriptor_pool_size_sampler };
return std::array<vk::DescriptorPoolSize, 2> { descriptor_pool_size_sampler, descriptor_pool_size_ubo };
else
return std::array<vk::DescriptorPoolSize, 1> { descriptor_pool_size_sampler };
}();
@ -439,15 +438,10 @@ private:
assert(descriptor_pool_create_info.flags & vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet); // requirement, to soothe validation layer complaints
this->vk_descriptor_pool.emplace(*this->parent->vk_gpu, descriptor_pool_create_info);
const std::vector<vk::DescriptorSetLayout> descriptor_set_layouts = [&]() {
if (this->vk_descriptor_set_layout_ubo) {
return std::vector<vk::DescriptorSetLayout>(this->parent->vk_max_frames_in_flight, *this->vk_descriptor_set_layout_ubo);
}
return std::vector<vk::DescriptorSetLayout>();
}();
const std::vector<vk::DescriptorSetLayout> descriptor_set_layouts = std::vector<vk::DescriptorSetLayout>(this->parent->vk_max_frames_in_flight, *this->vk_descriptor_set_layout);
const vk::DescriptorSetAllocateInfo descriptor_set_allocate_info {
.descriptorPool = **this->vk_descriptor_pool,
.descriptorSetCount = static_cast<std::uint32_t>(this->parent->vk_max_frames_in_flight),
.descriptorSetCount = static_cast<std::uint32_t>(descriptor_set_layouts.size()),
.pSetLayouts = descriptor_set_layouts.data()
};
this->vk_descriptor_sets = vk::raii::DescriptorSets(*this->parent->vk_gpu, descriptor_set_allocate_info);
@ -455,29 +449,6 @@ private:
std::vector<vk::WriteDescriptorSet> write_descriptor_sets;
write_descriptor_sets.reserve(this->parent->vk_max_frames_in_flight);
std::vector<vk::DescriptorBufferInfo> buffer_infos;
buffer_infos.reserve(this->parent->vk_max_frames_in_flight);
for (std::size_t i = 0; i < this->parent->vk_max_frames_in_flight; i++) {
const vk::DescriptorBufferInfo descriptor_buffer_info_ubo {
.buffer = *this->vk_buffers_uniform.at(i)->first,
.offset = 0,
.range = sizeof(UniformBufferObject_Projection),
};
const vk::DescriptorBufferInfo& descriptor_buffer_info_handle = buffer_infos.emplace_back(descriptor_buffer_info_ubo);
const vk::WriteDescriptorSet descriptor_write_ubo {
.dstSet = *this->vk_descriptor_sets[i],
.dstBinding = 0,
.dstArrayElement = 0,
.descriptorCount = 1,
.descriptorType = vk::DescriptorType::eUniformBuffer,
.pImageInfo = nullptr, // Optional
.pBufferInfo = &descriptor_buffer_info_handle,
.pTexelBufferView = nullptr, // Optional
};
write_descriptor_sets.emplace_back(descriptor_write_ubo);
}
std::vector<vk::DescriptorImageInfo> image_infos;
image_infos.reserve(this->parent->vk_max_frames_in_flight);
for (std::size_t i = 0; i < this->parent->vk_max_frames_in_flight; i++) {
@ -489,7 +460,7 @@ private:
const vk::DescriptorImageInfo& descriptor_image_info_handle = image_infos.emplace_back(descriptor_image_info_texture);
const vk::WriteDescriptorSet descriptor_write_texture {
.dstSet = *this->vk_descriptor_sets[i],
.dstBinding = 1,
.dstBinding = 0,
.dstArrayElement = 0,
.descriptorCount = 1,
.descriptorType = vk::DescriptorType::eCombinedImageSampler,
@ -497,6 +468,32 @@ private:
};
write_descriptor_sets.emplace_back(descriptor_write_texture);
}
std::vector<vk::DescriptorBufferInfo> buffer_infos;
if constexpr (UsesProjection()) {
buffer_infos.reserve(this->parent->vk_max_frames_in_flight);
for (std::size_t i = 0; i < this->parent->vk_max_frames_in_flight; i++) {
const vk::DescriptorBufferInfo descriptor_buffer_info_ubo {
.buffer = *this->vk_buffers_uniform.at(i)->first,
.offset = 0,
.range = sizeof(UniformBufferObject_Projection),
};
const vk::DescriptorBufferInfo& descriptor_buffer_info_handle = buffer_infos.emplace_back(descriptor_buffer_info_ubo);
const vk::WriteDescriptorSet descriptor_write_ubo {
.dstSet = *this->vk_descriptor_sets[i],
.dstBinding = 1,
.dstArrayElement = 0,
.descriptorCount = 1,
.descriptorType = vk::DescriptorType::eUniformBuffer,
.pImageInfo = nullptr, // Optional
.pBufferInfo = &descriptor_buffer_info_handle,
.pTexelBufferView = nullptr, // Optional
};
write_descriptor_sets.emplace_back(descriptor_write_ubo);
}
}
this->parent->vk_gpu->updateDescriptorSets(write_descriptor_sets, nullptr);
}
}
@ -549,9 +546,17 @@ private:
}
};
VulkanRenderPipeline<Vertex2> vk_pipeline_second;
VulkanRenderPipeline<Vertex3> vk_pipeline_third;
static inline const std::vector<Vertex3> vertices_quad_sample = {
static inline const std::vector<Vertex2> vertices_rect_sample = {
{ { -0.5f, -0.5f }, { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f } },
{ { 0.5f, -0.5f }, { 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } },
{ { 0.5f, 0.5f }, { 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f } },
{ { -0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f } }
};
static inline const std::vector<Vertex3> vertices_cube_sample = {
{ { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f } },
{ { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } },
{ { 0.5f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f } },
@ -582,7 +587,8 @@ private:
public:
VulkanExampleApplication()
: vk_pipeline_third(this) {
: vk_pipeline_second(this)
, vk_pipeline_third(this) {
try { // try me // all the code is in init :O boo hoo, ill shove all ur ram out of scope ASAP i can, dont seperate them, just scope them instead dumb dumb.
{ // Window init
this->libsdl.emplace(SDL_INIT_VIDEO);
@ -976,9 +982,12 @@ public:
this->vk_render_pass.emplace(*this->vk_gpu, render_pass_create_info);
}
{
const auto shader_info_vertex = vk::ShaderModuleCreateInfo { .codeSize = embeded_shader_vertex_glsl_spv.size, .pCode = reinterpret_cast<const std::uint32_t*>(embeded_shader_vertex_glsl_spv.begin) };
const auto shader_info_frag = vk::ShaderModuleCreateInfo { .codeSize = embeded_shader_frag_glsl_spv.size, .pCode = reinterpret_cast<const std::uint32_t*>(embeded_shader_frag_glsl_spv.begin) };
this->vk_pipeline_third.CreatePipeline(*this->vk_gpu, *this->vk_render_pass, { shader_info_vertex, shader_info_frag }, this->vk_msaa_samples);
const auto shader_second_info_vertex = vk::ShaderModuleCreateInfo { .codeSize = embeded_shader_second_vertex_glsl_spv.size, .pCode = reinterpret_cast<const std::uint32_t*>(embeded_shader_second_vertex_glsl_spv.begin) };
this->vk_pipeline_second.CreatePipeline(*this->vk_gpu, *this->vk_render_pass, { shader_second_info_vertex, shader_info_frag }, this->vk_msaa_samples);
const auto shader_third_info_vertex = vk::ShaderModuleCreateInfo { .codeSize = embeded_shader_third_vertex_glsl_spv.size, .pCode = reinterpret_cast<const std::uint32_t*>(embeded_shader_third_vertex_glsl_spv.begin) };
this->vk_pipeline_third.CreatePipeline(*this->vk_gpu, *this->vk_render_pass, { shader_third_info_vertex, shader_info_frag }, this->vk_msaa_samples);
}
{
this->CreateBufferFrame();
@ -1001,7 +1010,8 @@ public:
this->TransitionImageLayout(*this->vk_depth_image->first, this->vk_depth_format, vk::ImageLayout::eUndefined, vk::ImageLayout::eDepthStencilAttachmentOptimal);
}
{ // fill sample vertex data
this->vk_pipeline_third.ReplaceModelInfo(vertices_quad_sample, Vertex3::IndexMap::rectangle);
this->vk_pipeline_second.ReplaceModelInfo(vertices_rect_sample, Vertex2::IndexMap::rectangle);
this->vk_pipeline_third.ReplaceModelInfo(vertices_cube_sample, Vertex3::IndexMap::rectangle);
}
{ // syncronizing vars
assert(this->vk_semephores_image_available.empty());
@ -1131,6 +1141,7 @@ public:
this->vk_texture_sampler.emplace(*this->vk_gpu, sampler_create_info);
}
{
this->vk_pipeline_second.UpdateDescriptors(*this->vk_texture_view);
this->vk_pipeline_third.UpdateDescriptors(*this->vk_texture_view);
}
} catch (const vk::SystemError& error) {
@ -1638,11 +1649,12 @@ public:
.pClearValues = clear_colors.data()
};
command_buffer.beginRenderPass(render_pass_info, vk::SubpassContents::eInline);
this->vk_pipeline_third.Bind(command_buffer, frame_index);
this->RecordDynamic(command_buffer);
this->vk_pipeline_third.Bind(command_buffer, frame_index);
this->vk_pipeline_third.Draw(command_buffer);
this->vk_pipeline_second.Bind(command_buffer, frame_index);
this->vk_pipeline_second.Draw(command_buffer);
command_buffer.endRenderPass();
command_buffer.end();
};
@ -1663,7 +1675,6 @@ public:
command_buffer.setScissor(0, scissor);
}
private:
public:
~VulkanExampleApplication() {
this->vk_gpu->waitIdle();