vulkan/wsi: Add a wsi_image structure

This is used to hold information about the allocated image, rather than
an ever-growing function argument list.

v2 (Jason Ekstrand):
 - Rename wsi_image_base to wsi_image

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
Daniel Stone
2017-07-20 11:51:48 +01:00
committed by Jason Ekstrand
parent 2cbeb32555
commit c1163f7b1c
5 changed files with 65 additions and 93 deletions
+14 -17
View File
@@ -145,11 +145,7 @@ radv_wsi_image_create(VkDevice device_h,
const VkAllocationCallbacks* pAllocator,
bool needs_linear_copy,
bool linear,
VkImage *image_p,
VkDeviceMemory *memory_p,
uint32_t *size,
uint32_t *offset,
uint32_t *row_pitch, int *fd_p)
struct wsi_image *wsi_image)
{
VkResult result = VK_SUCCESS;
struct radeon_surf *surface;
@@ -232,20 +228,22 @@ radv_wsi_image_create(VkDevice device_h,
RADV_FROM_HANDLE(radv_device_memory, memory, memory_h);
if (!radv_get_memory_fd(device, memory, &fd))
goto fail_alloc_memory;
*fd_p = fd;
wsi_image->fd = fd;
}
surface = &image->surface;
*image_p = image_h;
*memory_p = memory_h;
*size = image->size;
*offset = image->offset;
wsi_image->image = image_h;
wsi_image->memory = memory_h;
wsi_image->size = image->size;
wsi_image->offset = image->offset;
if (device->physical_device->rad_info.chip_class >= GFX9)
*row_pitch = surface->u.gfx9.surf_pitch * surface->bpe;
wsi_image->row_pitch =
surface->u.gfx9.surf_pitch * surface->bpe;
else
*row_pitch = surface->u.legacy.level[0].nblk_x * surface->bpe;
wsi_image->row_pitch =
surface->u.legacy.level[0].nblk_x * surface->bpe;
return VK_SUCCESS;
fail_alloc_memory:
radv_FreeMemory(device_h, memory_h, pAllocator);
@@ -259,12 +257,11 @@ fail_create_image:
static void
radv_wsi_image_free(VkDevice device,
const VkAllocationCallbacks* pAllocator,
VkImage image_h,
VkDeviceMemory memory_h)
struct wsi_image *wsi_image)
{
radv_DestroyImage(device, image_h, pAllocator);
radv_DestroyImage(device, wsi_image->image, pAllocator);
radv_FreeMemory(device, memory_h, pAllocator);
radv_FreeMemory(device, wsi_image->memory, pAllocator);
}
static const struct wsi_image_fns radv_wsi_image_fns = {
+10 -15
View File
@@ -175,11 +175,7 @@ anv_wsi_image_create(VkDevice device_h,
const VkAllocationCallbacks* pAllocator,
bool different_gpu,
bool linear,
VkImage *image_p,
VkDeviceMemory *memory_p,
uint32_t *size,
uint32_t *offset,
uint32_t *row_pitch, int *fd_p)
struct wsi_image *wsi_image)
{
struct anv_device *device = anv_device_from_handle(device_h);
VkImage image_h;
@@ -245,7 +241,6 @@ anv_wsi_image_create(VkDevice device_h,
struct anv_surface *surface = &image->planes[0].surface;
assert(surface->isl.tiling == ISL_TILING_X);
*row_pitch = surface->isl.row_pitch;
int ret = anv_gem_set_tiling(device, memory->bo->gem_handle,
surface->isl.row_pitch, I915_TILING_X);
if (ret) {
@@ -265,11 +260,12 @@ anv_wsi_image_create(VkDevice device_h,
goto fail_alloc_memory;
}
*image_p = image_h;
*memory_p = memory_h;
*fd_p = fd;
*size = image->size;
*offset = 0;
wsi_image->image = image_h;
wsi_image->memory = memory_h;
wsi_image->fd = fd;
wsi_image->size = image->size;
wsi_image->offset = 0;
wsi_image->row_pitch = surface->isl.row_pitch;
return VK_SUCCESS;
fail_alloc_memory:
anv_FreeMemory(device_h, memory_h, pAllocator);
@@ -282,12 +278,11 @@ fail_create_image:
static void
anv_wsi_image_free(VkDevice device,
const VkAllocationCallbacks* pAllocator,
VkImage image_h,
VkDeviceMemory memory_h)
struct wsi_image *wsi_image)
{
anv_DestroyImage(device, image_h, pAllocator);
anv_DestroyImage(device, wsi_image->image, pAllocator);
anv_FreeMemory(device, memory_h, pAllocator);
anv_FreeMemory(device, wsi_image->memory, pAllocator);
}
static const struct wsi_image_fns anv_wsi_image_fns = {
+11 -8
View File
@@ -30,6 +30,15 @@
#include <vulkan/vulkan.h>
#include <vulkan/vk_icd.h>
struct wsi_image {
VkImage image;
VkDeviceMemory memory;
uint32_t size;
uint32_t offset;
uint32_t row_pitch;
int fd;
};
struct wsi_device;
struct wsi_image_fns {
VkResult (*create_wsi_image)(VkDevice device_h,
@@ -37,16 +46,10 @@ struct wsi_image_fns {
const VkAllocationCallbacks *pAllocator,
bool needs_linear_copy,
bool linear,
VkImage *image_p,
VkDeviceMemory *memory_p,
uint32_t *size_p,
uint32_t *offset_p,
uint32_t *row_pitch_p,
int *fd_p);
struct wsi_image *image_p);
void (*free_wsi_image)(VkDevice device,
const VkAllocationCallbacks *pAllocator,
VkImage image_h,
VkDeviceMemory memory_h);
struct wsi_image *image);
};
struct wsi_swapchain {
+10 -21
View File
@@ -556,8 +556,7 @@ VkResult wsi_create_wl_surface(const VkAllocationCallbacks *pAllocator,
}
struct wsi_wl_image {
VkImage image;
VkDeviceMemory memory;
struct wsi_image base;
struct wl_buffer * buffer;
bool busy;
};
@@ -603,7 +602,7 @@ wsi_wl_swapchain_get_images(struct wsi_swapchain *wsi_chain,
}
for (uint32_t i = 0; i < ret_count; i++)
pSwapchainImages[i] = chain->images[i].image;
pSwapchainImages[i] = chain->images[i].base.image;
return result;
}
@@ -727,33 +726,25 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
{
VkDevice vk_device = chain->base.device;
VkResult result;
int fd;
uint32_t size;
uint32_t row_pitch;
uint32_t offset;
result = chain->base.image_fns->create_wsi_image(vk_device,
pCreateInfo,
pAllocator,
false,
false,
&image->image,
&image->memory,
&size,
&offset,
&row_pitch,
&fd);
&image->base);
if (result != VK_SUCCESS)
return result;
image->buffer = wl_drm_create_prime_buffer(chain->drm_wrapper,
fd, /* name */
image->base.fd, /* name */
chain->extent.width,
chain->extent.height,
chain->drm_format,
offset,
row_pitch,
image->base.offset,
image->base.row_pitch,
0, 0, 0, 0 /* unused */);
close(fd);
close(image->base.fd);
if (!image->buffer)
goto fail_image;
@@ -763,8 +754,7 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
return VK_SUCCESS;
fail_image:
chain->base.image_fns->free_wsi_image(vk_device, pAllocator,
image->image, image->memory);
chain->base.image_fns->free_wsi_image(vk_device, pAllocator, &image->base);
return result;
}
@@ -779,8 +769,7 @@ wsi_wl_swapchain_destroy(struct wsi_swapchain *wsi_chain,
if (chain->images[i].buffer) {
wl_buffer_destroy(chain->images[i].buffer);
chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator,
chain->images[i].image,
chain->images[i].memory);
&chain->images[i].base);
}
}
+20 -32
View File
@@ -615,10 +615,8 @@ VkResult wsi_create_xlib_surface(const VkAllocationCallbacks *pAllocator,
}
struct x11_image {
VkImage image;
VkImage linear_image; // for prime
VkDeviceMemory memory;
VkDeviceMemory linear_memory; // for prime
struct wsi_image base;
struct wsi_image linear_base;
xcb_pixmap_t pixmap;
bool busy;
struct xshmfence * shm_fence;
@@ -670,7 +668,7 @@ x11_get_images(struct wsi_swapchain *anv_chain,
}
for (uint32_t i = 0; i < ret_count; i++)
pSwapchainImages[i] = chain->images[i].image;
pSwapchainImages[i] = chain->images[i].base.image;
return result;
}
@@ -680,8 +678,8 @@ x11_get_image_and_linear(struct wsi_swapchain *drv_chain,
int imageIndex, VkImage *image, VkImage *linear_image)
{
struct x11_swapchain *chain = (struct x11_swapchain *)drv_chain;
*image = chain->images[imageIndex].image;
*linear_image = chain->images[imageIndex].linear_image;
*image = chain->images[imageIndex].base.image;
*linear_image = chain->images[imageIndex].linear_base.image;
}
static VkResult
@@ -960,23 +958,14 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
{
xcb_void_cookie_t cookie;
VkResult result;
uint32_t row_pitch;
uint32_t offset;
uint32_t bpp = 32;
int fd;
uint32_t size;
result = chain->base.image_fns->create_wsi_image(device_h,
pCreateInfo,
pAllocator,
chain->base.needs_linear_copy,
false,
&image->image,
&image->memory,
&size,
&offset,
&row_pitch,
&fd);
&image->base);
if (result != VK_SUCCESS)
return result;
@@ -986,31 +975,31 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
pAllocator,
chain->base.needs_linear_copy,
true,
&image->linear_image,
&image->linear_memory,
&size,
&offset,
&row_pitch,
&fd);
&image->linear_base);
if (result != VK_SUCCESS) {
chain->base.image_fns->free_wsi_image(device_h, pAllocator,
image->image, image->memory);
&image->base);
return result;
}
}
image->pixmap = xcb_generate_id(chain->conn);
struct wsi_image *image_ws =
chain->base.needs_linear_copy ? &image->linear_base : &image->base;
cookie =
xcb_dri3_pixmap_from_buffer_checked(chain->conn,
image->pixmap,
chain->window,
size,
image_ws->size,
pCreateInfo->imageExtent.width,
pCreateInfo->imageExtent.height,
row_pitch,
chain->depth, bpp, fd);
image_ws->row_pitch,
chain->depth, bpp,
image_ws->fd);
xcb_discard_reply(chain->conn, cookie.sequence);
image_ws->fd = -1; /* XCB has now taken ownership of the FD */
int fence_fd = xshmfence_alloc_shm();
if (fence_fd < 0)
@@ -1041,10 +1030,9 @@ fail_pixmap:
if (chain->base.needs_linear_copy) {
chain->base.image_fns->free_wsi_image(device_h, pAllocator,
image->linear_image, image->linear_memory);
&image->linear_base);
}
chain->base.image_fns->free_wsi_image(device_h, pAllocator,
image->image, image->memory);
chain->base.image_fns->free_wsi_image(device_h, pAllocator, &image->base);
return result;
}
@@ -1065,10 +1053,10 @@ x11_image_finish(struct x11_swapchain *chain,
if (chain->base.needs_linear_copy) {
chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator,
image->linear_image, image->linear_memory);
&image->linear_base);
}
chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator,
image->image, image->memory);
&image->base);
}
static VkResult