diff options
-rw-r--r-- | src/vulkan/anv_image.c | 6 | ||||
-rw-r--r-- | src/vulkan/anv_intel.c | 36 | ||||
-rw-r--r-- | src/vulkan/anv_private.h | 1 | ||||
-rw-r--r-- | src/vulkan/anv_x11.c | 1 |
4 files changed, 30 insertions, 14 deletions
diff --git a/src/vulkan/anv_image.c b/src/vulkan/anv_image.c index 21099cb7730..2937c2e76e5 100644 --- a/src/vulkan/anv_image.c +++ b/src/vulkan/anv_image.c @@ -181,8 +181,10 @@ anv_image_make_surface(const struct anv_image_create_info *create_info, */ assert(anv_is_aligned(qpitch, j)); - const uint32_t stride = align_u32(mt_width * format_info->cpp, - tile_info->width); + uint32_t stride = align_u32(mt_width * format_info->cpp, tile_info->width); + if (create_info->stride > 0) + stride = create_info->stride; + const uint32_t size = stride * align_u32(mt_height, tile_info->height); const uint32_t offset = align_u32(*inout_image_size, tile_info->surface_alignment); diff --git a/src/vulkan/anv_intel.c b/src/vulkan/anv_intel.c index 9fc06aef6f8..f64e2dcb1e4 100644 --- a/src/vulkan/anv_intel.c +++ b/src/vulkan/anv_intel.c @@ -39,6 +39,7 @@ VkResult anv_CreateDmaBufImageINTEL( struct anv_device_memory *mem; struct anv_image *image; VkResult result; + VkImage image_h; assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DMA_BUF_IMAGE_CREATE_INFO_INTEL); @@ -65,19 +66,30 @@ VkResult anv_CreateDmaBufImageINTEL( goto fail_mem; } - *image = (struct anv_image) { - .bo = &mem->bo, - .offset = 0, - .type = VK_IMAGE_TYPE_2D, - .extent = pCreateInfo->extent, - .size = mem->bo.size, - - .primary_surface = { - .offset = 0, - .stride = pCreateInfo->strideInBytes, + anv_image_create(_device, + &(struct anv_image_create_info) { + .force_tile_mode = true, .tile_mode = XMAJOR, - }, - }; + .stride = pCreateInfo->strideInBytes, + .vk_info = + &(VkImageCreateInfo) { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .imageType = VK_IMAGE_TYPE_2D, + .format = pCreateInfo->format, + .extent = pCreateInfo->extent, + .mipLevels = 1, + .arraySize = 1, + .samples = 1, + /* FIXME: Need a way to use X tiling to allow scanout */ + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .flags = 0, + }}, + &image_h); + + image = anv_image_from_handle(image_h); + image->bo = &mem->bo; + image->offset = 0; assert(image->extent.width > 0); assert(image->extent.height > 0); diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index d53f63d5d27..d517814847c 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -996,6 +996,7 @@ struct anv_image_create_info { const VkImageCreateInfo *vk_info; bool force_tile_mode; uint8_t tile_mode; + uint32_t stride; }; VkResult anv_image_create(VkDevice _device, diff --git a/src/vulkan/anv_x11.c b/src/vulkan/anv_x11.c index 9ffce8d8cbf..cc11a5fc762 100644 --- a/src/vulkan/anv_x11.c +++ b/src/vulkan/anv_x11.c @@ -121,6 +121,7 @@ VkResult anv_CreateSwapChainWSI( &(struct anv_image_create_info) { .force_tile_mode = true, .tile_mode = XMAJOR, + .stride = 0, .vk_info = &(VkImageCreateInfo) { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, |