Skip to content

Commit f8fbb84

Browse files
committed
support texture display
1 parent ece578c commit f8fbb84

33 files changed

+642
-520
lines changed

CMakeLists.txt

+8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ add_library(
2525
include/VK_Buffer.h
2626
include/VK_Vertex.h
2727
include/VK_Context.h
28+
include/VK_UniformBuffer.h
29+
source/stb_image.cpp
2830
source/VK_ContextImpl.h
2931
source/VK_ShaderSetImpl.h
3032
source/VK_VertexBuffer.h
@@ -33,7 +35,13 @@ add_library(
3335
source/VK_ShaderSetImpl.cpp
3436
source/VK_Vertex.cpp
3537
source/VK_VertexBuffer.cpp
38+
source/VK_UniformBufferImpl.h
3639
source/VK_UniformBufferImpl.cpp
40+
source/VK_Viewports.cpp
41+
source/VK_DescriptorSetLayoutBindingGroup.cpp
42+
source/VK_VkDescriptorPoolSizeGroup.cpp
43+
source/VK_ImageImpl.cpp
44+
source/VK_TextureImpl.cpp
3745
source/VK_Util.cpp
3846
)
3947

demo/main-blend-color.cpp

+19-15
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33

44
using namespace std;
55

6-
const std::vector<VK_Vertex> vertices1 = {
7-
{{0.0f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
8-
{{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
9-
{{-0.5f, 0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}
6+
const std::vector<float> vertices1 = {
7+
0.0f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f,
8+
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f,
9+
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f
1010
};
1111

12-
const std::vector<VK_Vertex> vertices2 = {
13-
{{-0.5f, -0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
14-
{{0.5f, -0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
15-
{{0.5f, 0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
16-
{{0.5f, 0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
17-
{{-0.5f, 0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
18-
{{-0.5f, -0.3f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
19-
};
12+
const std::vector<float> vertices2 = {
13+
-0.5f, -0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f,
14+
0.5f, -0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f,
15+
0.5f, 0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f,
16+
0.5f, 0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f,
17+
-0.5f, 0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f,
18+
-0.5f, -0.3f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f
19+
};
2020

2121
VK_Context* context = nullptr;
2222

@@ -50,25 +50,29 @@ int main()
5050
context->createWindow(640, 480, true);
5151

5252
VK_Context::VK_Config vkConfig;
53-
context->initVulkan(vkConfig);
53+
context->initVulkanDevice(vkConfig);
5454

5555
auto shaderSet = context->createShaderSet();
5656
shaderSet->addShader("shader/vertex/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
5757
shaderSet->addShader("shader/vertex/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
5858

59+
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
60+
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);
61+
5962
if(!shaderSet->isValid()) {
6063
std::cerr << "invalid shaderSet" << std::endl;
6164
shaderSet->release();
6265
context->release();
6366
return -1;
6467
}
6568

69+
context->initVulkanContext();
6670
context->initPipeline(shaderSet);
6771

68-
auto buffer = context->createVertexBuffer(vertices1);
72+
auto buffer = context->createVertexBuffer(vertices1, 7);
6973
context->addBuffer(buffer);
7074

71-
buffer = context->createVertexBuffer(vertices2);
75+
buffer = context->createVertexBuffer(vertices2, 7);
7276
context->addBuffer(buffer);
7377

7478
context->createCommandBuffers();

demo/main-clear-color.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
using namespace std;
55

6-
const std::vector<VK_Vertex> vertices1 = {
7-
{{0.0f, -0.5f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
8-
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
9-
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}
6+
const std::vector<float> vertices1 = {
7+
0.0f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,
8+
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
9+
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f
1010
};
1111

1212
VK_Context* context = nullptr;
@@ -29,22 +29,26 @@ int main()
2929
context->createWindow(640, 480, true);
3030

3131
VK_Context::VK_Config vkConfig;
32-
context->initVulkan(vkConfig);
32+
context->initVulkanDevice(vkConfig);
3333

3434
auto shaderSet = context->createShaderSet();
3535
shaderSet->addShader("shader/vertex/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
3636
shaderSet->addShader("shader/vertex/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
3737

38+
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
39+
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);
40+
3841
if(!shaderSet->isValid()) {
3942
std::cerr << "invalid shaderSet" << std::endl;
4043
shaderSet->release();
4144
context->release();
4245
return -1;
4346
}
4447

48+
context->initVulkanContext();
4549
context->initPipeline(shaderSet);
4650

47-
auto buffer = context->createBuffer(vertices1);
51+
auto buffer = context->createVertexBuffer(vertices1, 7);
4852
context->addBuffer(buffer);
4953

5054
context->createCommandBuffers();

demo/main-hello-triangle.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
using namespace std;
55

6-
const std::vector<VK_Vertex> vertices1 = {
7-
{{0.0f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
8-
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
9-
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}
6+
const std::vector<float> vertices1 = {
7+
0.0f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
8+
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
9+
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f
1010
};
1111

1212
VK_Context* context = nullptr;
@@ -21,22 +21,26 @@ int main()
2121
context->createWindow(640, 480, true);
2222

2323
VK_Context::VK_Config vkConfig;
24-
context->initVulkan(vkConfig);
24+
context->initVulkanDevice(vkConfig);
2525

2626
auto shaderSet = context->createShaderSet();
2727
shaderSet->addShader("shader/vertex/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
2828
shaderSet->addShader("shader/vertex/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
2929

30+
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
31+
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);
32+
3033
if(!shaderSet->isValid()) {
3134
std::cerr << "invalid shaderSet" << std::endl;
3235
shaderSet->release();
3336
context->release();
3437
return -1;
3538
}
3639

40+
context->initVulkanContext();
3741
context->initPipeline(shaderSet);
3842

39-
auto buffer = context->createBuffer(vertices1);
43+
auto buffer = context->createVertexBuffer(vertices1, 7);
4044
context->addBuffer(buffer);
4145

4246
context->createCommandBuffers();

demo/main-texture.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
using namespace std;
1111

1212
const std::vector<float> vertices = {
13-
-0.5f, -0.5, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
13+
-0.5f, -0.5, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 5.0f, 0.0f,
1414
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
15-
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
16-
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f
15+
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 5.0f,
16+
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 5.0f, 5.0f
1717
};
1818

1919
const std::vector<uint16_t> indices = {
@@ -70,6 +70,7 @@ int main()
7070
VkDescriptorSetLayoutBinding uniformBinding = VK_DescriptorSetLayoutBindingGroup::createDescriptorSetLayoutBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
7171
bindingGroup.addDescriptorSetLayoutBinding(uniformBinding);
7272
uniformBinding = VK_DescriptorSetLayoutBindingGroup::createDescriptorSetLayoutBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT);
73+
;//uniformBinding.pImmutableSamplers =
7374
bindingGroup.addDescriptorSetLayoutBinding(uniformBinding);
7475
context->setDescriptorSetLayoutBindingGroup(bindingGroup);
7576
}
@@ -89,9 +90,12 @@ int main()
8990
context->addUniformBuffer(ubo);
9091

9192
auto image = context->createImage("images/smile.png");
92-
auto imageViewCreateInfo = VK_Texture::createImageViewCreateInfo(image->getImage(), VK_FORMAT_R8G8B8A8_SRGB);
93-
auto samplerCreateInfo = VK_Texture::createSamplerCreateInfo();
94-
auto texture = context->createTexture(imageViewCreateInfo, samplerCreateInfo);
93+
auto imageViewCreateInfo = VK_ImageView::createImageViewCreateInfo(image->getImage(), VK_FORMAT_R8G8B8A8_SRGB);
94+
auto samplerCreateInfo = VK_Sampler::createSamplerCreateInfo();
95+
auto sampler = context->createSampler(samplerCreateInfo);
96+
auto imageView = context->createImageView(imageViewCreateInfo);
97+
imageView->setSampler(sampler->getSampler());
98+
context->addImageView(imageView);
9599

96100
context->initVulkanContext();
97101
context->initPipeline(shaderSet);

demo/main-uniform-buffer.cpp

+35-9
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
#include <glm/mat4x4.hpp>
44
#include <glm/gtx/transform.hpp>
55
#include "VK_UniformBuffer.h"
6+
#include "VK_DescriptorSetLayoutBindingGroup.h"
67
#include "VK_Context.h"
78

89
using namespace std;
910

10-
const std::vector<VK_Vertex> vertices = {
11-
{{0.0f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
12-
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
13-
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}
11+
const std::vector<float> vertices = {
12+
0.0f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f,
13+
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.5f,
14+
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.5
1415
};
1516

1617
const std::vector<uint16_t> indices = {
@@ -29,6 +30,14 @@ uint32_t updateUniformBufferData(char* & data, uint32_t size)
2930
return sizeof(model);
3031
}
3132

33+
void onFrameSizeChanged(int width, int height)
34+
{
35+
auto vp = VK_Viewports::createViewport(width, height);
36+
VK_Viewports vps;
37+
vps.addViewport(vp);
38+
context->setViewports(vps);
39+
}
40+
3241
int main()
3342
{
3443
VK_ContextConfig config;
@@ -37,30 +46,47 @@ int main()
3746

3847
context = createVkContext(config);
3948
context->createWindow(640, 480, true);
49+
context->setOnFrameSizeChanged(onFrameSizeChanged);
4050

4151
VK_Context::VK_Config vkConfig;
42-
context->initVulkan(vkConfig);
52+
context->initVulkanDevice(vkConfig);
4353

4454
auto shaderSet = context->createShaderSet();
4555
shaderSet->addShader("shader/mvp/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
4656
shaderSet->addShader("shader/mvp/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
4757

58+
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
59+
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);
60+
4861
if(!shaderSet->isValid()) {
4962
std::cerr << "invalid shaderSet" << std::endl;
5063
shaderSet->release();
5164
context->release();
5265
return -1;
5366
}
5467

55-
context->initPipeline(shaderSet);
68+
{
69+
VK_DescriptorSetLayoutBindingGroup bindingGroup;
70+
VkDescriptorSetLayoutBinding uniformBinding = VK_DescriptorSetLayoutBindingGroup::createDescriptorSetLayoutBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
71+
bindingGroup.addDescriptorSetLayoutBinding(uniformBinding);
72+
context->setDescriptorSetLayoutBindingGroup(bindingGroup);
73+
}
74+
75+
{
76+
auto desciptorPoolSizeGroup = context->getDescriptorPoolSizeGroup();
77+
desciptorPoolSizeGroup.addDescriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
78+
context->setDescriptorPoolSizeGroup(desciptorPoolSizeGroup);
79+
}
5680

57-
auto buffer = context->createVertexBuffer(vertices, indices);
81+
auto buffer = context->createVertexBuffer(vertices, 3 + 4, indices);
5882
context->addBuffer(buffer);
5983

60-
auto ubo = context->createUniformBuffer(sizeof(GLfloat) * 16);
84+
auto ubo = context->createUniformBuffer(0, sizeof(GLfloat) * 16);
6185
ubo->setWriteDataCallback(updateUniformBufferData);
62-
context->setUniformBuffer(ubo);
86+
context->addUniformBuffer(ubo);
6387

88+
context->initVulkanContext();
89+
context->initPipeline(shaderSet);
6490
context->createCommandBuffers();
6591

6692
context->run();

demo/main-viewport-buffer.cpp

+19-6
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
using namespace std;
1010

1111
const std::vector<VK_Vertex> vertices = {
12-
{{0.0f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
13-
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
14-
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
15-
{{0.5f, -0.5f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
12+
{{0.0f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.5f}},
13+
{{0.5f, 0.5f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.5f}},
14+
{{-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f, 0.5f}},
15+
{{0.5f, -0.5f, 0.0f}, {1.0f, 1.0f, 1.0f, 0.5f}}
1616
};
1717

1818
const std::vector<uint16_t> indices = {
@@ -38,7 +38,7 @@ void onMouseButtonCallback(int button, int action, int mods)
3838
newViewports.addViewport(vp2);
3939

4040
auto scissor2 = VK_Viewports::createScissor(size.width >> 1, size.height);
41-
scissor2.offset.x = size.width * 0.25;
41+
scissor2.offset.x = size.width * 0.25f;
4242
newViewports.setScissor(0, scissor2);
4343

4444
if(action) {
@@ -48,6 +48,14 @@ void onMouseButtonCallback(int button, int action, int mods)
4848
}
4949
}
5050

51+
void onFrameSizeChanged(int width, int height)
52+
{
53+
auto vp = VK_Viewports::createViewport(width, height);
54+
VK_Viewports vps;
55+
vps.addViewport(vp);
56+
context->setViewports(vps);
57+
}
58+
5159
int main()
5260
{
5361
VK_ContextConfig config;
@@ -57,21 +65,26 @@ int main()
5765

5866
context = createVkContext(config);
5967
context->createWindow(640, 480, true);
68+
context->setOnFrameSizeChanged(onFrameSizeChanged);
6069

6170
VK_Context::VK_Config vkConfig;
62-
context->initVulkan(vkConfig);
71+
context->initVulkanDevice(vkConfig);
6372

6473
auto shaderSet = context->createShaderSet();
6574
shaderSet->addShader("shader/vertex/vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
6675
shaderSet->addShader("shader/vertex/frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
6776

77+
shaderSet->appendAttributeDescription(0, sizeof (float) * 3);
78+
shaderSet->appendAttributeDescription(1, sizeof (float) * 4);
79+
6880
if(!shaderSet->isValid()) {
6981
std::cerr << "invalid shaderSet" << std::endl;
7082
shaderSet->release();
7183
context->release();
7284
return -1;
7385
}
7486

87+
context->initVulkanContext();
7588
context->initPipeline(shaderSet);
7689

7790
viewports = context->getViewports();

0 commit comments

Comments
 (0)