Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
VkCV Framework
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Service Desk
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Vulkan2021
VkCV Framework
Commits
bd3cc748
Commit
bd3cc748
authored
3 years ago
by
Simeon Hermann
Browse files
Options
Downloads
Patches
Plain Diff
[
#10
] transformed the code of the ShaderProgram class into Vulkan C++
parent
44638d6c
Branches
Branches containing commit
Tags
Tags containing commit
4 merge requests
!12
Resolve "Swapchain Class"
,
!7
Resolve "Shader Program Class"
,
!5
Resolve "Pipeline State Object"
,
!4
Resolve "Renderpass Class"
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
projects/first_triangle/src/main.cpp
+3
-2
3 additions, 2 deletions
projects/first_triangle/src/main.cpp
src/vkcv/ShaderProgram.cpp
+14
-23
14 additions, 23 deletions
src/vkcv/ShaderProgram.cpp
src/vkcv/ShaderProgram.hpp
+10
-9
10 additions, 9 deletions
src/vkcv/ShaderProgram.hpp
with
27 additions
and
34 deletions
projects/first_triangle/src/main.cpp
+
3
−
2
View file @
bd3cc748
#include
<iostream>
#include
<iostream>
#include
<vkcv/Context.hpp>
#include
<vkcv/Context.hpp>
#include
<vkcv/Window.hpp>
#include
<vkcv/Window.hpp>
#include
<vkcv/ShaderProgram.hpp>
int
main
(
int
argc
,
const
char
**
argv
)
{
int
main
(
int
argc
,
const
char
**
argv
)
{
const
char
*
applicationName
=
"First Triangle"
;
const
char
*
applicationName
=
"First Triangle"
;
...
@@ -33,8 +34,8 @@ int main(int argc, const char** argv) {
...
@@ -33,8 +34,8 @@ int main(int argc, const char** argv) {
}
}
vkcv
::
ShaderProgram
shaderProgram
=
vkcv
::
ShaderProgram
::
create
(
context
);
vkcv
::
ShaderProgram
shaderProgram
=
vkcv
::
ShaderProgram
::
create
(
context
);
shaderProgram
.
addShader
(
VK_SHADER_STAGE_VERTEX_BIT
,
"../../../../../shaders/vert.spv"
);
shaderProgram
.
addShader
(
vk
::
ShaderStageFlagBits
::
eVertex
,
"../../../../../shaders/vert.spv"
);
shaderProgram
.
addShader
(
VK_SHADER_STAGE_FRAGMENT_BIT
,
"../../../../../shaders/frag.spv"
);
shaderProgram
.
addShader
(
vk
::
ShaderStageFlagBits
::
eFragment
,
"../../../../../shaders/frag.spv"
);
while
(
window
.
isWindowOpen
())
{
while
(
window
.
isWindowOpen
())
{
window
.
pollEvents
();
window
.
pollEvents
();
...
...
This diff is collapsed.
Click to expand it.
src/vkcv/ShaderProgram.cpp
+
14
−
23
View file @
bd3cc748
/**
/**
* @authors Simeon Hermann
* @authors Simeon Hermann
, Leonie Franken
* @file src/vkcv/ShaderProgram.cpp
* @file src/vkcv/ShaderProgram.cpp
* @brief ShaderProgram class to handle and prepare the shader stages for a graphics pipeline
* @brief ShaderProgram class to handle and prepare the shader stages for a graphics pipeline
*/
*/
#include
"ShaderProgram.hpp"
#include
"ShaderProgram.hpp"
#include
<fstream>
#include
<iostream>
std
::
vector
<
const
char
*>
validationLayers
=
{
std
::
vector
<
const
char
*>
validationLayers
=
{
"VK_LAYER_KHRONOS_validation"
"VK_LAYER_KHRONOS_validation"
...
@@ -33,22 +29,17 @@ namespace vkcv {
...
@@ -33,22 +29,17 @@ namespace vkcv {
return
buffer
;
return
buffer
;
}
}
VkShaderModule
ShaderProgram
::
createShaderModule
(
const
std
::
vector
<
char
>&
shaderCode
)
{
vk
::
ShaderModule
ShaderProgram
::
createShaderModule
(
const
std
::
vector
<
char
>&
shaderCode
)
{
VkShaderModuleCreateInfo
createInfo
{};
vk
::
ShaderModuleCreateInfo
createInfo
({},
shaderCode
.
size
(),
reinterpret_cast
<
const
uint32_t
*>
(
shaderCode
.
data
()));
createInfo
.
sType
=
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
;
vk
::
ShaderModule
shaderModule
;
createInfo
.
codeSize
=
shaderCode
.
size
();
if
((
m_context
.
getDevice
().
createShaderModule
(
&
createInfo
,
nullptr
,
&
shaderModule
))
!=
vk
::
Result
::
eSuccess
)
{
createInfo
.
pCode
=
reinterpret_cast
<
const
uint32_t
*>
(
shaderCode
.
data
());
VkShaderModule
shaderModule
;
if
(
vkCreateShaderModule
(
m_context
.
getDevice
(),
&
createInfo
,
nullptr
,
&
shaderModule
)
!=
VK_SUCCESS
)
{
throw
std
::
runtime_error
(
"Failed to create shader module!"
);
throw
std
::
runtime_error
(
"Failed to create shader module!"
);
}
}
return
shaderModule
;
return
shaderModule
;
}
}
VkPipelineShaderStageCreateInfo
ShaderProgram
::
createShaderStage
(
VkShaderModule
&
shaderModule
,
VkShaderStageFlagBits
shaderStage
)
{
vk
::
PipelineShaderStageCreateInfo
ShaderProgram
::
createShaderStage
(
vk
::
ShaderModule
&
shaderModule
,
vk
::
ShaderStageFlagBits
shaderStage
)
{
VkPipelineShaderStageCreateInfo
shaderStageInfo
{};
vk
::
PipelineShaderStageCreateInfo
shaderStageInfo
({},
shaderStage
,
shaderModule
,
"main"
,
{});
shaderStageInfo
.
sType
=
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
;
shaderStageInfo
.
stage
=
shaderStage
;
shaderStageInfo
.
stage
=
shaderStage
;
shaderStageInfo
.
module
=
shaderModule
;
shaderStageInfo
.
module
=
shaderModule
;
shaderStageInfo
.
pName
=
"main"
;
shaderStageInfo
.
pName
=
"main"
;
...
@@ -62,20 +53,20 @@ namespace vkcv {
...
@@ -62,20 +53,20 @@ namespace vkcv {
return
ShaderProgram
(
context
);
return
ShaderProgram
(
context
);
}
}
void
ShaderProgram
::
addShader
(
Vk
ShaderStageFlagBits
shaderStage
,
const
std
::
string
&
filepath
)
{
void
ShaderProgram
::
addShader
(
vk
::
ShaderStageFlagBits
shaderStage
,
const
std
::
string
&
filepath
)
{
if
(
containsShaderStage
(
shaderStage
))
{
if
(
containsShaderStage
(
shaderStage
))
{
throw
std
::
runtime_error
(
"Shader program already contains this particular shader stage."
);
throw
std
::
runtime_error
(
"Shader program already contains this particular shader stage."
);
}
}
else
{
else
{
auto
shaderCode
=
readFile
(
filepath
);
auto
shaderCode
=
readFile
(
filepath
);
Vk
ShaderModule
shaderModule
=
createShaderModule
(
shaderCode
);
vk
::
ShaderModule
shaderModule
=
createShaderModule
(
shaderCode
);
Vk
PipelineShaderStageCreateInfo
shaderInfo
=
createShaderStage
(
shaderModule
,
shaderStage
);
vk
::
PipelineShaderStageCreateInfo
shaderInfo
=
createShaderStage
(
shaderModule
,
shaderStage
);
m_shaderStagesList
.
push_back
(
shaderInfo
);
m_shaderStagesList
.
push_back
(
shaderInfo
);
vkDestroyShaderModule
(
m_context
.
getDevice
(),
shaderModule
,
nullptr
);
m_context
.
getDevice
().
destroyShaderModule
(
shaderModule
,
nullptr
);
}
}
}
}
bool
ShaderProgram
::
containsShaderStage
(
Vk
ShaderStageFlagBits
shaderStage
)
{
bool
ShaderProgram
::
containsShaderStage
(
vk
::
ShaderStageFlagBits
shaderStage
)
{
for
(
int
i
=
0
;
i
<
m_shaderStagesList
.
size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
m_shaderStagesList
.
size
();
i
++
)
{
if
(
m_shaderStagesList
[
i
].
stage
==
shaderStage
)
{
if
(
m_shaderStagesList
[
i
].
stage
==
shaderStage
)
{
return
true
;
return
true
;
...
@@ -84,7 +75,7 @@ namespace vkcv {
...
@@ -84,7 +75,7 @@ namespace vkcv {
return
false
;
return
false
;
}
}
bool
ShaderProgram
::
deleteShaderStage
(
Vk
ShaderStageFlagBits
shaderStage
)
{
bool
ShaderProgram
::
deleteShaderStage
(
vk
::
ShaderStageFlagBits
shaderStage
)
{
for
(
int
i
=
0
;
i
<
m_shaderStagesList
.
size
()
-
1
;
i
++
)
{
for
(
int
i
=
0
;
i
<
m_shaderStagesList
.
size
()
-
1
;
i
++
)
{
if
(
m_shaderStagesList
[
i
].
stage
==
shaderStage
)
{
if
(
m_shaderStagesList
[
i
].
stage
==
shaderStage
)
{
m_shaderStagesList
.
erase
(
m_shaderStagesList
.
begin
()
+
i
);
m_shaderStagesList
.
erase
(
m_shaderStagesList
.
begin
()
+
i
);
...
@@ -94,7 +85,7 @@ namespace vkcv {
...
@@ -94,7 +85,7 @@ namespace vkcv {
return
false
;
return
false
;
}
}
std
::
vector
<
Vk
PipelineShaderStageCreateInfo
>
ShaderProgram
::
getShaderStages
()
{
std
::
vector
<
vk
::
PipelineShaderStageCreateInfo
>
ShaderProgram
::
getShaderStages
()
{
return
m_shaderStagesList
;
return
m_shaderStagesList
;
}
}
...
...
This diff is collapsed.
Click to expand it.
src/vkcv/ShaderProgram.hpp
+
10
−
9
View file @
bd3cc748
#pragma once
#pragma once
/**
/**
* @authors Simeon Hermann
* @authors Simeon Hermann
, Leonie Franken
* @file src/vkcv/ShaderProgram.hpp
* @file src/vkcv/ShaderProgram.hpp
* @brief ShaderProgram class to handle and prepare the shader stages for a graphics pipeline
* @brief ShaderProgram class to handle and prepare the shader stages for a graphics pipeline
*/
*/
#define GLFW_INCLUDE_VULKAN
#define GLFW_INCLUDE_VULKAN
#include
<vector>
#include
<vector>
#include
<map>
#include
<fstream>
#include
<iostream>
#include
<vulkan/vulkan.hpp>
#include
<vulkan/vulkan.hpp>
#include
"Context.hpp"
#include
"Context.hpp"
...
@@ -17,7 +18,7 @@ namespace vkcv {
...
@@ -17,7 +18,7 @@ namespace vkcv {
private:
private:
vkcv
::
Context
&
m_context
;
vkcv
::
Context
&
m_context
;
std
::
vector
<
Vk
PipelineShaderStageCreateInfo
>
m_shaderStagesList
;
std
::
vector
<
vk
::
PipelineShaderStageCreateInfo
>
m_shaderStagesList
;
/**
/**
* Constructor of ShaderProgram requires a context for the logical device.
* Constructor of ShaderProgram requires a context for the logical device.
* @param context of the app
* @param context of the app
...
@@ -39,7 +40,7 @@ namespace vkcv {
...
@@ -39,7 +40,7 @@ namespace vkcv {
* @param[in] a vector of chars as a buffer for the code
* @param[in] a vector of chars as a buffer for the code
* @return shader module
* @return shader module
*/
*/
Vk
ShaderModule
createShaderModule
(
const
std
::
vector
<
char
>&
shaderCode
);
vk
::
ShaderModule
createShaderModule
(
const
std
::
vector
<
char
>&
shaderCode
);
/**
/**
* Creates a shader stage (info struct) for the to be added shader.
* Creates a shader stage (info struct) for the to be added shader.
...
@@ -48,7 +49,7 @@ namespace vkcv {
...
@@ -48,7 +49,7 @@ namespace vkcv {
* @param[in] flag that signals the respective shaderStage
* @param[in] flag that signals the respective shaderStage
* @return pipeline shader stage info struct
* @return pipeline shader stage info struct
*/
*/
Vk
PipelineShaderStageCreateInfo
createShaderStage
(
Vk
ShaderModule
&
shaderModule
,
Vk
ShaderStageFlagBits
shaderStage
);
vk
::
PipelineShaderStageCreateInfo
createShaderStage
(
vk
::
ShaderModule
&
shaderModule
,
vk
::
ShaderStageFlagBits
shaderStage
);
public:
public:
...
@@ -72,28 +73,28 @@ namespace vkcv {
...
@@ -72,28 +73,28 @@ namespace vkcv {
* @param[in] flag that signals the respective shaderStage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @param[in] flag that signals the respective shaderStage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @param[in] relative path to the shader code (e.g. "../../../../../shaders/vert.spv")
* @param[in] relative path to the shader code (e.g. "../../../../../shaders/vert.spv")
*/
*/
void
addShader
(
Vk
ShaderStageFlagBits
shaderStage
,
const
std
::
string
&
filepath
);
void
addShader
(
vk
::
ShaderStageFlagBits
shaderStage
,
const
std
::
string
&
filepath
);
/**
/**
* Tests if the shader program contains a certain shader stage.
* Tests if the shader program contains a certain shader stage.
* @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @return boolean that is true if the shader program contains the shader stage
* @return boolean that is true if the shader program contains the shader stage
*/
*/
bool
containsShaderStage
(
Vk
ShaderStageFlagBits
shaderStage
);
bool
containsShaderStage
(
vk
::
ShaderStageFlagBits
shaderStage
);
/**
/**
* Deletes the given shader stage in the shader program.
* Deletes the given shader stage in the shader program.
* @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT)
* @return boolean that is false if the shader stage was not found in the shader program
* @return boolean that is false if the shader stage was not found in the shader program
*/
*/
bool
deleteShaderStage
(
Vk
ShaderStageFlagBits
shaderStage
);
bool
deleteShaderStage
(
vk
::
ShaderStageFlagBits
shaderStage
);
/**
/**
* Returns a list with all the shader stages in the shader program.
* Returns a list with all the shader stages in the shader program.
* Needed for the transfer to the pipeline.
* Needed for the transfer to the pipeline.
* @return vector list with all shader stage info structs
* @return vector list with all shader stage info structs
*/
*/
std
::
vector
<
Vk
PipelineShaderStageCreateInfo
>
getShaderStages
();
std
::
vector
<
vk
::
PipelineShaderStageCreateInfo
>
getShaderStages
();
/**
/**
* Returns the number of shader stages in the shader program.
* Returns the number of shader stages in the shader program.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment