Skip to content

Commit 7aa5db1

Browse files
committed
image view binding
1 parent 696bca5 commit 7aa5db1

10 files changed

+22
-307
lines changed

demo/main-texture.cpp

+1-287
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,6 @@ void onFrameSizeChanged(int width, int height)
3939
pipeline->getDynamicState()->applyDynamicViewport({0, 0, (float)width, (float)height, 0, 1});
4040
}
4141

42-
void clear_(VkImage image, VkCommandBuffer command);
43-
44-
45-
4642
int main()
4743
{
4844
VK_ContextConfig config;
@@ -94,16 +90,13 @@ int main()
9490

9591
auto image = context->createImage("../images/cat.png");
9692

97-
// transitionImageLayout(image->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0);
98-
9993
auto command = context->getCommandPool()->beginSingleTimeCommands();
100-
clear_(image->getImage(), command);
10194
context->getCommandPool()->endSingleTimeCommands(command, context->getGraphicQueue());
10295

10396
auto imageViewCreateInfo = VK_ImageView::createImageViewCreateInfo(image->getImage(),
10497
VK_FORMAT_R8G8B8A8_SRGB);
10598
auto imageView = context->createImageView(imageViewCreateInfo);
106-
shaderSet->addImageView(imageView);
99+
shaderSet->addImageView(imageView, 1);
107100

108101
context->initVulkanContext();
109102
pipeline = context->createPipeline(shaderSet);
@@ -121,282 +114,3 @@ int main()
121114

122115
return 0;
123116
}
124-
125-
void clear_(VkImage image, VkCommandBuffer command)
126-
{
127-
/*VkImageMemoryBarrier textureBarrier = {};
128-
textureBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
129-
textureBarrier.pNext = NULL;
130-
textureBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
131-
textureBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
132-
textureBarrier.oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
133-
textureBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;//VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
134-
textureBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
135-
textureBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
136-
textureBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
137-
textureBarrier.subresourceRange.baseMipLevel = 0;
138-
textureBarrier.subresourceRange.levelCount = 1;
139-
textureBarrier.subresourceRange.baseArrayLayer = 0;
140-
textureBarrier.subresourceRange.layerCount = 1;
141-
textureBarrier.image = image;
142-
vkCmdPipelineBarrier(command, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1,
143-
&textureBarrier);
144-
145-
std::cout << 111 << std::endl;*/
146-
147-
VkImageSubresourceRange srRange = {};
148-
srRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
149-
srRange.baseMipLevel = 0;
150-
srRange.levelCount = VK_REMAINING_MIP_LEVELS;
151-
srRange.baseArrayLayer = 0;
152-
srRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
153-
154-
VkClearColorValue clearColor;
155-
clearColor.float32[0] = 0.0f;
156-
clearColor.float32[1] = 1.0f;
157-
clearColor.float32[2] = 0.0f;
158-
clearColor.float32[3] = 1.0f;
159-
vkCmdClearColorImage(command, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &srRange);
160-
161-
}
162-
163-
/*
164-
void set_image_layout(VkCommandBuffer command, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout,
165-
VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages)
166-
{
167-
VkImageMemoryBarrier image_memory_barrier = {};
168-
image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
169-
image_memory_barrier.pNext = NULL;
170-
image_memory_barrier.srcAccessMask = 0;
171-
image_memory_barrier.dstAccessMask = 0;
172-
image_memory_barrier.oldLayout = old_image_layout;
173-
image_memory_barrier.newLayout = new_image_layout;
174-
image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
175-
image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
176-
image_memory_barrier.image = image;
177-
image_memory_barrier.subresourceRange.aspectMask = aspectMask;
178-
image_memory_barrier.subresourceRange.baseMipLevel = 0;
179-
image_memory_barrier.subresourceRange.levelCount = 1;
180-
image_memory_barrier.subresourceRange.baseArrayLayer = 0;
181-
image_memory_barrier.subresourceRange.layerCount = 1;
182-
183-
switch (old_image_layout) {
184-
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
185-
image_memory_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
186-
break;
187-
188-
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
189-
image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
190-
break;
191-
192-
case VK_IMAGE_LAYOUT_PREINITIALIZED:
193-
image_memory_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
194-
break;
195-
196-
default:
197-
break;
198-
}
199-
200-
switch (new_image_layout) {
201-
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
202-
image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
203-
break;
204-
205-
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
206-
image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
207-
break;
208-
209-
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
210-
image_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
211-
break;
212-
213-
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
214-
image_memory_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
215-
break;
216-
217-
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
218-
image_memory_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
219-
break;
220-
221-
default:
222-
break;
223-
}
224-
225-
vkCmdPipelineBarrier(command, src_stages, dest_stages, 0, 0, NULL, 0, NULL, 1, &image_memory_barrier);
226-
}
227-
228-
229-
void write_ppm(VK_Context* context, VkImage image)
230-
{
231-
string filename;
232-
VkResult res;
233-
234-
auto width = context->getSwapChainExtent().width;
235-
auto height = context->getSwapChainExtent().height;
236-
auto format = context->getSwapChainFormat();
237-
auto device = context->getDevice();
238-
239-
VkImageCreateInfo image_create_info = {};
240-
image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
241-
image_create_info.pNext = NULL;
242-
image_create_info.imageType = VK_IMAGE_TYPE_2D;
243-
image_create_info.format = context->getSwapChainFormat();
244-
image_create_info.extent.width = width;
245-
image_create_info.extent.height = height;
246-
image_create_info.extent.depth = 1;
247-
image_create_info.mipLevels = 1;
248-
image_create_info.arrayLayers = 1;
249-
image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
250-
image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
251-
image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
252-
image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
253-
image_create_info.queueFamilyIndexCount = 0;
254-
image_create_info.pQueueFamilyIndices = NULL;
255-
image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
256-
image_create_info.flags = 0;
257-
258-
VkMemoryAllocateInfo mem_alloc = {};
259-
mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
260-
mem_alloc.pNext = NULL;
261-
mem_alloc.allocationSize = 0;
262-
mem_alloc.memoryTypeIndex = 0;
263-
264-
VkImage mappableImage;
265-
VkDeviceMemory mappableMemory;
266-
267-
res = vkCreateImage(device, &image_create_info, NULL, &mappableImage);
268-
assert(res == VK_SUCCESS);
269-
270-
VkMemoryRequirements mem_reqs;
271-
vkGetImageMemoryRequirements(device, mappableImage, &mem_reqs);
272-
273-
mem_alloc.allocationSize = mem_reqs.size;
274-
275-
res = vkAllocateMemory(device, &mem_alloc, NULL, &(mappableMemory));
276-
assert(res == VK_SUCCESS);
277-
278-
279-
res = vkBindImageMemory(device, mappableImage, mappableMemory, 0);
280-
assert(res == VK_SUCCESS);
281-
282-
auto command = context->getCommandPool()->beginSingleTimeCommands();
283-
284-
set_image_layout(command, mappableImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
285-
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
286-
287-
set_image_layout(command, image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
288-
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
289-
290-
VkImageCopy copy_region;
291-
copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
292-
copy_region.srcSubresource.mipLevel = 0;
293-
copy_region.srcSubresource.baseArrayLayer = 0;
294-
copy_region.srcSubresource.layerCount = 1;
295-
copy_region.srcOffset.x = 0;
296-
copy_region.srcOffset.y = 0;
297-
copy_region.srcOffset.z = 0;
298-
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
299-
copy_region.dstSubresource.mipLevel = 0;
300-
copy_region.dstSubresource.baseArrayLayer = 0;
301-
copy_region.dstSubresource.layerCount = 1;
302-
copy_region.dstOffset.x = 0;
303-
copy_region.dstOffset.y = 0;
304-
copy_region.dstOffset.z = 0;
305-
copy_region.extent.width = width;
306-
copy_region.extent.height = height;
307-
copy_region.extent.depth = 1;
308-
309-
vkCmdCopyImage(command, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mappableImage,
310-
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
311-
312-
set_image_layout(command, mappableImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
313-
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT);
314-
*/
315-
316-
/*
317-
res = vkEndCommandBuffer(command);
318-
assert(res == VK_SUCCESS);
319-
const VkCommandBuffer cmd_bufs[] = {command};
320-
VkFenceCreateInfo fenceInfo;
321-
VkFence cmdFence;
322-
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
323-
fenceInfo.pNext = NULL;
324-
fenceInfo.flags = 0;
325-
vkCreateFence(device, &fenceInfo, NULL, &cmdFence);
326-
327-
VkSubmitInfo submit_info[1] = {};
328-
submit_info[0].pNext = NULL;
329-
submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
330-
submit_info[0].waitSemaphoreCount = 0;
331-
submit_info[0].pWaitSemaphores = NULL;
332-
submit_info[0].pWaitDstStageMask = NULL;
333-
submit_info[0].commandBufferCount = 1;
334-
submit_info[0].pCommandBuffers = cmd_bufs;
335-
submit_info[0].signalSemaphoreCount = 0;
336-
submit_info[0].pSignalSemaphores = NULL;
337-
338-
res = vkQueueSubmit(context->getGraphicQueue(), 1, submit_info, cmdFence);
339-
assert(res == VK_SUCCESS);
340-
341-
do {
342-
res = vkWaitForFences(device, 1, &cmdFence, VK_TRUE, ~0);
343-
} while (res == VK_TIMEOUT);
344-
assert(res == VK_SUCCESS);
345-
*/
346-
/*
347-
context->getCommandPool()->endSingleTimeCommands(command, context->getGraphicQueue());
348-
349-
//vkDestroyFence(device, cmdFence, NULL);
350-
351-
filename = "2.ppm";
352-
353-
VkImageSubresource subres = {};
354-
subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
355-
subres.mipLevel = 0;
356-
subres.arrayLayer = 0;
357-
VkSubresourceLayout sr_layout;
358-
vkGetImageSubresourceLayout(device, mappableImage, &subres, &sr_layout);
359-
360-
char *ptr;
361-
res = vkMapMemory(device, mappableMemory, 0, mem_reqs.size, 0, (void **)&ptr);
362-
assert(res == VK_SUCCESS);
363-
364-
ptr += sr_layout.offset;
365-
std::ofstream file(filename.c_str(), ios::binary);
366-
367-
file << "P6\n";
368-
file << width << " ";
369-
file << height << "\n";
370-
file << 255 << "\n";
371-
372-
for (size_t y = 0; y < height; y++)
373-
{
374-
const int *row = (const int *)ptr;
375-
int swapped;
376-
377-
if (format == VK_FORMAT_B8G8R8A8_UNORM || format == VK_FORMAT_B8G8R8A8_SRGB) {
378-
for (size_t x = 0; x < width; x++) {
379-
swapped = (*row & 0xff00ff00) | (*row & 0x000000ff) << 16 | (*row & 0x00ff0000) >> 16;
380-
file.write((char *)&swapped, 3);
381-
row++;
382-
}
383-
} else if (format == VK_FORMAT_R8G8B8A8_UNORM) {
384-
for (size_t x = 0; x < width; x++) {
385-
file.write((char *)row, 3);
386-
row++;
387-
}
388-
} else {
389-
printf("Unrecognized image format - will not write image files");
390-
break;
391-
}
392-
393-
ptr += sr_layout.rowPitch;
394-
}
395-
396-
file.close();
397-
vkUnmapMemory(device, mappableMemory);
398-
vkDestroyImage(device, mappableImage, NULL);
399-
vkFreeMemory(device, mappableMemory, NULL);
400-
}
401-
*/
402-

include/VK_ImageView.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
class VK_ImageView : public VK_Deleter
77
{
88
public:
9-
static VkImageViewCreateInfo createImageViewCreateInfo(VkImage image, VkFormat format,uint32_t mipLevels = 1);
9+
static VkImageViewCreateInfo createImageViewCreateInfo(VkImage image, VkFormat format, uint32_t mipLevels = 1);
1010

1111
virtual void setSampler(VkSampler sampler) = 0;
12-
virtual VkWriteDescriptorSet createWriteDescriptorSet(VkDescriptorSet descriptorSet)const = 0;
12+
virtual VkWriteDescriptorSet createWriteDescriptorSet(VkDescriptorSet descriptorSet, uint32_t binding = 1)const = 0;
1313
virtual VkImageView getImageView()const = 0;
1414
};
1515

include/VK_ShaderSet.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class VK_ShaderSet : public VK_Deleter
4343
virtual void initUniformBuffer() = 0;
4444
virtual void clearUniformBuffer() = 0;
4545

46-
virtual void addImageView(VK_ImageView *imageView) = 0;
46+
virtual void addImageView(VK_ImageView *imageView, uint32_t binding = 1) = 0;
4747
public:
4848
virtual bool isValid() = 0;
4949
virtual VkPipelineShaderStageCreateInfo *getCreateInfoData() = 0;

source/VK_ContextImpl.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ bool VK_ContextImpl::createSwapChainImageViews()
758758

759759
VK_ImageViewImpl *view = new VK_ImageViewImpl(this);
760760
view->setRemoveFromContainerWhenRelease(false);
761-
if (!view->create(viewCreateInfo, 1)) {
761+
if (!view->create(viewCreateInfo)) {
762762
std::cerr << "failed to create image views" << std::endl;
763763
return false;
764764
}
@@ -888,7 +888,7 @@ VK_ImageView *VK_ContextImpl::createImageView(const VkImageViewCreateInfo &viewC
888888
uint32_t mipLevels)
889889
{
890890
auto imageView = new VK_ImageViewImpl(this);
891-
if (!imageView->create(viewCreateInfo, mipLevels)) {
891+
if (!imageView->create(viewCreateInfo)) {
892892
delete imageView;
893893
return nullptr;
894894
}
@@ -1009,7 +1009,7 @@ void VK_ContextImpl::createColorResources()
10091009
auto createInfo = VK_ImageView::createImageViewCreateInfo(vkColorImage->getImage(), colorFormat);
10101010
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10111011
vkColorImageView = new VK_ImageViewImpl(this);
1012-
vkColorImageView->create(createInfo, 1);
1012+
vkColorImageView->create(createInfo);
10131013
}
10141014

10151015
void VK_ContextImpl::createDepthResources()
@@ -1027,7 +1027,7 @@ void VK_ContextImpl::createDepthResources()
10271027
auto createInfo = VK_ImageView::createImageViewCreateInfo(vkDepthImage->getImage(), depthFormat);
10281028
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10291029
vkDepthImageView = new VK_ImageViewImpl(this);
1030-
vkDepthImageView->create(createInfo, 1);
1030+
vkDepthImageView->create(createInfo);
10311031
}
10321032

10331033
bool VK_ContextImpl::createCommandBuffers()

source/VK_DescriptorSets.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ void VK_DescriptorSets::init(VkDescriptorPool pool, VkDescriptorSetLayout setLay
3131
}
3232

3333
void VK_DescriptorSets::update(const std::list<VK_UniformBuffer *> &uniformBuffers,
34-
const std::list<VK_ImageView *> &imageViews)
34+
const std::map<VK_ImageView *, uint32_t> &imageViews)
3535
{
3636
for (size_t i = 0; i < context->getSwapImageCount(); i++) {
3737
std::vector<VkWriteDescriptorSet> descriptorWrites;
3838
for (auto buffer : uniformBuffers)
3939
descriptorWrites.push_back(buffer->createWriteDescriptorSet(i, descriptorSets[i]));
4040

4141
for (auto imageView : imageViews) {
42-
descriptorWrites.push_back(imageView->createWriteDescriptorSet(descriptorSets[i]));
42+
descriptorWrites.push_back(imageView.first->createWriteDescriptorSet(descriptorSets[i], imageView.second));
4343
}
4444

4545
vkUpdateDescriptorSets(context->getDevice(), descriptorWrites.size(), &descriptorWrites[0], 0,

0 commit comments

Comments
 (0)