| 94 | } |
| 95 | |
| 96 | bool GnmResourceFactory::createRenderTarget( |
| 97 | const RenderTarget* target, |
| 98 | SceRenderTarget& targetImage) |
| 99 | { |
| 100 | |
| 101 | VltImageCreateInfo imageInfo; |
| 102 | imageInfo.type = VK_IMAGE_TYPE_2D; |
| 103 | imageInfo.format = cvt::convertDataFormat(target->getDataFormat()); |
| 104 | imageInfo.flags = 0; |
| 105 | imageInfo.sampleCount = cvt::convertNumFragments(target->getNumFragments()); // Should we use getNumSamples? |
| 106 | imageInfo.extent = { target->getWidth(), target->getHeight(), 1 }; |
| 107 | imageInfo.numLayers = 1; |
| 108 | imageInfo.mipLevels = 1; |
| 109 | |
| 110 | imageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | |
| 111 | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | |
| 112 | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | |
| 113 | VK_IMAGE_USAGE_TRANSFER_DST_BIT; |
| 114 | |
| 115 | imageInfo.stages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | |
| 116 | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | |
| 117 | VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 118 | |
| 119 | imageInfo.access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | |
| 120 | VK_ACCESS_SHADER_READ_BIT | |
| 121 | VK_ACCESS_TRANSFER_READ_BIT | |
| 122 | VK_ACCESS_TRANSFER_WRITE_BIT; |
| 123 | |
| 124 | imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; |
| 125 | imageInfo.layout = optimizeLayout(imageInfo.usage); |
| 126 | |
| 127 | VltImageViewCreateInfo viewInfo; |
| 128 | viewInfo.type = VK_IMAGE_VIEW_TYPE_2D; |
| 129 | viewInfo.format = imageInfo.format; |
| 130 | viewInfo.usage = imageInfo.usage; |
| 131 | viewInfo.aspect = VK_IMAGE_ASPECT_COLOR_BIT; |
| 132 | viewInfo.minLevel = 0; |
| 133 | viewInfo.numLevels = 1; |
| 134 | viewInfo.minLayer = 0; |
| 135 | viewInfo.numLayers = 1; |
| 136 | |
| 137 | targetImage.image = m_device->createImage(imageInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); |
| 138 | targetImage.imageView = m_device->createImageView(targetImage.image, viewInfo); |
| 139 | targetImage.renderTarget = *target; |
| 140 | |
| 141 | // Set debug name |
| 142 | auto imageName = fmt::format("ColorTarget_{}_{}", |
| 143 | s_objectId++, |
| 144 | fmt::ptr(target->getBaseAddress())); |
| 145 | auto viewName = fmt::format("ColorView_{}_{}", |
| 146 | s_objectId++, |
| 147 | fmt::ptr(target->getBaseAddress())); |
| 148 | |
| 149 | VkDebugUtilsObjectNameInfoEXT nameInfo; |
| 150 | nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; |
| 151 | nameInfo.pNext = nullptr; |
| 152 | nameInfo.objectType = VK_OBJECT_TYPE_IMAGE; |
| 153 | nameInfo.pObjectName = imageName.c_str(); |
no test coverage detected