Bladeren bron

radv: Use given stride for images imported from Android.

Handled similarly as radeonsi. I checked the offsets are actually used.

Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
tags/19.2-branchpoint
Bas Nieuwenhuizen 7 jaren geleden
bovenliggende
commit
8139efbbbd
3 gewijzigde bestanden met toevoegingen van 35 en 0 verwijderingen
  1. 2
    0
      src/amd/vulkan/radv_android.c
  2. 28
    0
      src/amd/vulkan/radv_image.c
  3. 5
    0
      src/amd/vulkan/radv_private.h

+ 2
- 0
src/amd/vulkan/radv_android.c Bestand weergeven

@@ -191,6 +191,8 @@ radv_image_from_gralloc(VkDevice device_h,

image = radv_image_from_handle(image_h);

radv_image_override_offset_stride(device, image, 0, gralloc_info->stride);

radv_BindImageMemory(device_h, image_h, memory_h, 0);

image->owned_memory = memory_h;

+ 28
- 0
src/amd/vulkan/radv_image.c Bestand weergeven

@@ -760,6 +760,34 @@ radv_init_metadata(struct radv_device *device,
radv_query_opaque_metadata(device, image, metadata);
}

void
radv_image_override_offset_stride(struct radv_device *device,
struct radv_image *image,
uint64_t offset, uint32_t stride)
{
struct radeon_surf *surface = &image->planes[0].surface;
unsigned bpe = vk_format_get_blocksizebits(image->vk_format) / 8;

if (device->physical_device->rad_info.chip_class >= GFX9) {
if (stride) {
surface->u.gfx9.surf_pitch = stride;
surface->u.gfx9.surf_slice_size =
(uint64_t)stride * surface->u.gfx9.surf_height * bpe;
}
surface->u.gfx9.surf_offset = offset;
} else {
surface->u.legacy.level[0].nblk_x = stride;
surface->u.legacy.level[0].slice_size_dw =
((uint64_t)stride * surface->u.legacy.level[0].nblk_y * bpe) / 4;

if (offset) {
for (unsigned i = 0; i < ARRAY_SIZE(surface->u.legacy.level); ++i)
surface->u.legacy.level[i].offset += offset;
}

}
}

/* The number of samples can be specified independently of the texture. */
static void
radv_image_get_fmask_info(struct radv_device *device,

+ 5
- 0
src/amd/vulkan/radv_private.h Bestand weergeven

@@ -1672,6 +1672,11 @@ radv_init_metadata(struct radv_device *device,
struct radv_image *image,
struct radeon_bo_metadata *metadata);

void
radv_image_override_offset_stride(struct radv_device *device,
struct radv_image *image,
uint64_t offset, uint32_t stride);

union radv_descriptor {
struct {
uint32_t plane0_descriptor[8];

Laden…
Annuleren
Opslaan