| 66 | } |
| 67 | |
| 68 | static void* create_func(GraphicContext* ctx, const uint64_t* params, const uint64_t* vaddr, const uint64_t* size, int vaddr_num, |
| 69 | VulkanMemory* mem) |
| 70 | { |
| 71 | KYTY_PROFILER_BLOCK("VideoOutBufferObject::Create"); |
| 72 | |
| 73 | EXIT_IF(vaddr_num != 1 || size == nullptr || vaddr == nullptr); |
| 74 | EXIT_IF(mem == nullptr); |
| 75 | EXIT_IF(ctx == nullptr); |
| 76 | |
| 77 | auto pixel_format = params[VideoOutBufferObject::PARAM_FORMAT]; |
| 78 | auto width = params[VideoOutBufferObject::PARAM_WIDTH]; |
| 79 | auto height = params[VideoOutBufferObject::PARAM_HEIGHT]; |
| 80 | |
| 81 | // EXIT_NOT_IMPLEMENTED(pixel_format != 0x80000000); |
| 82 | EXIT_NOT_IMPLEMENTED(width == 0); |
| 83 | EXIT_NOT_IMPLEMENTED(height == 0); |
| 84 | |
| 85 | auto* vk_obj = new VideoOutVulkanImage; |
| 86 | |
| 87 | VkFormat vk_format = VK_FORMAT_UNDEFINED; |
| 88 | |
| 89 | switch (pixel_format) |
| 90 | { |
| 91 | case static_cast<uint64_t>(VideoOutBufferFormat::R8G8B8A8Srgb): vk_format = VK_FORMAT_R8G8B8A8_SRGB; break; |
| 92 | case static_cast<uint64_t>(VideoOutBufferFormat::B8G8R8A8Srgb): vk_format = VK_FORMAT_B8G8R8A8_SRGB; break; |
| 93 | default: EXIT("unknown format: %" PRIu64 "\n", pixel_format); |
| 94 | } |
| 95 | |
| 96 | vk_obj->extent.width = width; |
| 97 | vk_obj->extent.height = height; |
| 98 | vk_obj->format = vk_format; |
| 99 | vk_obj->image = nullptr; |
| 100 | vk_obj->layout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 101 | |
| 102 | for (auto& view: vk_obj->image_view) |
| 103 | { |
| 104 | view = nullptr; |
| 105 | } |
| 106 | |
| 107 | VkImageCreateInfo image_info {}; |
| 108 | image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; |
| 109 | image_info.pNext = nullptr; |
| 110 | image_info.flags = 0; |
| 111 | image_info.imageType = VK_IMAGE_TYPE_2D; |
| 112 | image_info.extent.width = vk_obj->extent.width; |
| 113 | image_info.extent.height = vk_obj->extent.height; |
| 114 | image_info.extent.depth = 1; |
| 115 | image_info.mipLevels = 1; |
| 116 | image_info.arrayLayers = 1; |
| 117 | image_info.format = vk_obj->format; |
| 118 | image_info.tiling = VK_IMAGE_TILING_OPTIMAL; |
| 119 | image_info.initialLayout = vk_obj->layout; |
| 120 | image_info.usage = static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT) | |
| 121 | VK_IMAGE_USAGE_TRANSFER_DST_BIT; |
| 122 | image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; |
| 123 | image_info.samples = VK_SAMPLE_COUNT_1_BIT; |
| 124 | |
| 125 | vkCreateImage(ctx->device, &image_info, nullptr, &vk_obj->image); |
nothing calls this directly
no test coverage detected