Transitions for other images will be handles through Synchronizer.
depth_stencil_ref.attachment = VK_ATTACHMENT_UNUSED;
VkSampleCountFlagBits vk_samples = static_cast<VkSampleCountFlagBits>(get_vulkan_samples(format.get_samples()));
depth_stencil_ref.attachment = VK_ATTACHMENT_UNUSED;
VkSampleCountFlagBits vk_samples = static_cast<VkSampleCountFlagBits>(get_vulkan_samples(format.get_samples()));
- VkImageLayout default_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
unsigned i = 0;
unsigned color_count = 0;
for(FrameAttachment a: format)
{
unsigned i = 0;
unsigned color_count = 0;
for(FrameAttachment a: format)
{
+ VkImageLayout subpass_layout = static_cast<VkImageLayout>(get_vulkan_attachment_layout(get_components(get_attachment_pixelformat(a))));
+ VkImageLayout external_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : subpass_layout);
+
attachments[i].format = static_cast<VkFormat>(get_vulkan_pixelformat(get_attachment_pixelformat(a)));
attachments[i].samples = vk_samples;
attachments[i].loadOp = (clear ? discard ? VK_ATTACHMENT_LOAD_OP_DONT_CARE : VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD);
attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[i].format = static_cast<VkFormat>(get_vulkan_pixelformat(get_attachment_pixelformat(a)));
attachments[i].samples = vk_samples;
attachments[i].loadOp = (clear ? discard ? VK_ATTACHMENT_LOAD_OP_DONT_CARE : VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD);
attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachments[i].initialLayout = (clear ? VK_IMAGE_LAYOUT_UNDEFINED : default_layout);
- attachments[i].finalLayout = default_layout;
+ attachments[i].initialLayout = (clear ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout);
+ attachments[i].finalLayout = external_layout;
- unsigned attach_pt = get_attach_point(a);
- if(attach_pt==get_attach_point(COLOR_ATTACHMENT))
+ if(subpass_layout==VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
{
color_refs[color_count].attachment = i;
{
color_refs[color_count].attachment = i;
- color_refs[color_count].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ color_refs[color_count].layout = subpass_layout;
- else if(attach_pt==get_attach_point(DEPTH_ATTACHMENT))
{
depth_stencil_ref.attachment = i;
{
depth_stencil_ref.attachment = i;
- depth_stencil_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ depth_stencil_ref.layout = subpass_layout;
+unsigned get_vulkan_attachment_layout(PixelComponents comp)
+{
+ switch(comp)
+ {
+ case DEPTH_COMPONENT:
+ case STENCIL_INDEX: return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ default: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ }
+}
+
PixelFormat pixelformat_from_vulkan(unsigned vkf)
{
switch(vkf)
PixelFormat pixelformat_from_vulkan(unsigned vkf)
{
switch(vkf)
unsigned get_vulkan_pixelformat(PixelFormat);
unsigned get_vulkan_aspect(PixelComponents);
unsigned get_vulkan_pixelformat(PixelFormat);
unsigned get_vulkan_aspect(PixelComponents);
+unsigned get_vulkan_attachment_layout(PixelComponents);
PixelFormat pixelformat_from_vulkan(unsigned);
const unsigned *get_vulkan_swizzle(ComponentSwizzle);
PixelFormat pixelformat_from_vulkan(unsigned);
const unsigned *get_vulkan_swizzle(ComponentSwizzle);