Two Pipelines simultaniously, however the second dimension one doesnt draw atm...
Some checks are pending
ci/woodpecker/push/woodpecker.json Pipeline is pending
Some checks are pending
ci/woodpecker/push/woodpecker.json Pipeline is pending
This commit is contained in:
parent
8c537caca4
commit
0424e339a6
@ -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;
|
||||
|
||||
|
33
shader/shader.second.vertex.glsl
Normal file
33
shader/shader.second.vertex.glsl
Normal 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;
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
|
||||
#version 450
|
||||
|
||||
layout(binding = 0) uniform UniformBufferObject {
|
||||
layout(binding = 1) uniform UniformBufferObject {
|
||||
mat4 model;
|
||||
mat4 view;
|
||||
mat4 proj;
|
143
src/main.cpp
143
src/main.cpp
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user