| 149 | } |
| 150 | |
| 151 | static void* create_func(GraphicContext* ctx, const uint64_t* params, const uint64_t* vaddr, const uint64_t* size, int vaddr_num, |
| 152 | VulkanMemory* mem) |
| 153 | { |
| 154 | KYTY_PROFILER_BLOCK("RenderTextureObject::Create"); |
| 155 | |
| 156 | EXIT_IF(vaddr_num != 1 || size == nullptr || vaddr == nullptr); |
| 157 | EXIT_IF(mem == nullptr); |
| 158 | EXIT_IF(ctx == nullptr); |
| 159 | |
| 160 | auto pixel_format = params[RenderTextureObject::PARAM_FORMAT]; |
| 161 | auto width = params[RenderTextureObject::PARAM_WIDTH]; |
| 162 | auto height = params[RenderTextureObject::PARAM_HEIGHT]; |
| 163 | |
| 164 | VkFormat vk_format = VK_FORMAT_UNDEFINED; |
| 165 | |
| 166 | switch (pixel_format) |
| 167 | { |
| 168 | case static_cast<uint64_t>(RenderTextureFormat::R8Unorm): vk_format = VK_FORMAT_R8_UNORM; break; |
| 169 | case static_cast<uint64_t>(RenderTextureFormat::R8G8B8A8Unorm): vk_format = VK_FORMAT_R8G8B8A8_UNORM; break; |
| 170 | case static_cast<uint64_t>(RenderTextureFormat::R8G8B8A8Srgb): vk_format = VK_FORMAT_R8G8B8A8_SRGB; break; |
| 171 | case static_cast<uint64_t>(RenderTextureFormat::B8G8R8A8Unorm): vk_format = VK_FORMAT_B8G8R8A8_UNORM; break; |
| 172 | case static_cast<uint64_t>(RenderTextureFormat::B8G8R8A8Srgb): vk_format = VK_FORMAT_B8G8R8A8_SRGB; break; |
| 173 | default: EXIT("unknown format: %" PRIu64 "\n", pixel_format); |
| 174 | } |
| 175 | |
| 176 | EXIT_NOT_IMPLEMENTED(width == 0); |
| 177 | EXIT_NOT_IMPLEMENTED(height == 0); |
| 178 | |
| 179 | auto* vk_obj = new RenderTextureVulkanImage; |
| 180 | |
| 181 | vk_obj->extent.width = width; |
| 182 | vk_obj->extent.height = height; |
| 183 | vk_obj->format = vk_format; |
| 184 | vk_obj->image = nullptr; |
| 185 | |
| 186 | for (auto& view: vk_obj->image_view) |
| 187 | { |
| 188 | view = nullptr; |
| 189 | } |
| 190 | |
| 191 | VkImageCreateInfo image_info {}; |
| 192 | image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; |
| 193 | image_info.pNext = nullptr; |
| 194 | image_info.flags = 0; |
| 195 | image_info.imageType = VK_IMAGE_TYPE_2D; |
| 196 | image_info.extent.width = vk_obj->extent.width; |
| 197 | image_info.extent.height = vk_obj->extent.height; |
| 198 | image_info.extent.depth = 1; |
| 199 | image_info.mipLevels = 1; |
| 200 | image_info.arrayLayers = 1; |
| 201 | image_info.format = vk_obj->format; |
| 202 | image_info.tiling = VK_IMAGE_TILING_OPTIMAL; |
| 203 | image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 204 | image_info.usage = static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) | |
| 205 | static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_TRANSFER_SRC_BIT) | |
| 206 | static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_TRANSFER_DST_BIT) | |
| 207 | static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_SAMPLED_BIT); |
| 208 | image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; |
nothing calls this directly
no test coverage detected