diff options
-rw-r--r-- | src/amd/common/ac_surface.c | 86 | ||||
-rw-r--r-- | src/amd/common/ac_surface.h | 16 | ||||
-rw-r--r-- | src/amd/vulkan/radv_device.c | 2 | ||||
-rw-r--r-- | src/amd/vulkan/radv_image.c | 10 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_texture.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/r600/radeon_video.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_clear.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_descriptors.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_texture.c | 8 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_surface.c | 16 |
11 files changed, 80 insertions, 78 deletions
diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 639e1c4fd0e..9b39247ca5d 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -857,7 +857,7 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib, const struct ac_surf_config * dcc_level->dcc_offset = surf->dcc_size; surf->num_dcc_levels = level + 1; surf->dcc_size = dcc_level->dcc_offset + AddrDccOut->dccRamSize; - surf->dcc_alignment = MAX2(surf->dcc_alignment, AddrDccOut->dccRamBaseAlign); + surf->dcc_alignment_log2 = MAX2(surf->dcc_alignment_log2, util_logbase2(AddrDccOut->dccRamBaseAlign)); /* If the DCC size of a subresource (1 mip level or 1 slice) * is not aligned, the DCC memory layout is not contiguous for @@ -935,7 +935,7 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib, const struct ac_surf_config * if (ret == ADDR_OK) { surf->htile_size = AddrHtileOut->htileBytes; surf->htile_slice_size = AddrHtileOut->sliceSize; - surf->htile_alignment = AddrHtileOut->baseAlign; + surf->htile_alignment_log2 = util_logbase2(AddrHtileOut->baseAlign); surf->num_htile_levels = level + 1; } } @@ -1007,7 +1007,7 @@ static int gfx6_surface_settings(ADDR_HANDLE addrlib, const struct radeon_info * const struct ac_surf_config *config, ADDR_COMPUTE_SURFACE_INFO_OUTPUT *csio, struct radeon_surf *surf) { - surf->surf_alignment = csio->baseAlign; + surf->surf_alignment_log2 = util_logbase2(csio->baseAlign); surf->u.legacy.pipe_config = csio->pTileInfo->pipeConfig - 1; gfx6_set_micro_tile_mode(surf, info); @@ -1108,7 +1108,7 @@ static void ac_compute_cmask(const struct radeon_info *info, const struct ac_sur else num_layers = config->info.array_size; - surf->cmask_alignment = MAX2(256, base_align); + surf->cmask_alignment_log2 = util_logbase2(MAX2(256, base_align)); surf->cmask_slice_size = align(slice_bytes, base_align); surf->cmask_size = surf->cmask_slice_size * num_layers; } @@ -1326,10 +1326,10 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *i surf->num_dcc_levels = 0; surf->surf_size = 0; surf->dcc_size = 0; - surf->dcc_alignment = 1; + surf->dcc_alignment_log2 = 0; surf->htile_size = 0; surf->htile_slice_size = 0; - surf->htile_alignment = 1; + surf->htile_alignment_log2 = 0; const bool only_stencil = (surf->flags & RADEON_SURF_SBUFFER) && !(surf->flags & RADEON_SURF_ZBUFFER); @@ -1428,7 +1428,7 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *i return r; surf->fmask_size = fout.fmaskBytes; - surf->fmask_alignment = fout.baseAlign; + surf->fmask_alignment_log2 = util_logbase2(fout.baseAlign); surf->fmask_slice_size = fout.sliceSize; surf->fmask_tile_swizzle = 0; @@ -1477,7 +1477,7 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *i * * "dcc_alignment * 4" was determined by trial and error. */ - surf->dcc_size = align64(surf->surf_size >> 8, surf->dcc_alignment * 4); + surf->dcc_size = align64(surf->surf_size >> 8, (1 << surf->dcc_alignment_log2) * 4); } /* Make sure HTILE covers the whole miptree, because the shader reads @@ -1491,7 +1491,7 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *i const unsigned htile_element_size = 4; surf->htile_size = (total_pixels / htile_block_size) * htile_element_size; - surf->htile_size = align(surf->htile_size, surf->htile_alignment); + surf->htile_size = align(surf->htile_size, 1 << surf->htile_alignment_log2); } else if (!surf->htile_size) { /* Unset this if HTILE is not present. */ surf->flags &= ~RADEON_SURF_TC_COMPATIBLE_HTILE; @@ -1718,7 +1718,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->u.gfx9.stencil_swizzle_mode = in->swizzleMode; surf->u.gfx9.stencil_epitch = out.epitchIsHeight ? out.mipChainHeight - 1 : out.mipChainPitch - 1; - surf->surf_alignment = MAX2(surf->surf_alignment, out.baseAlign); + surf->surf_alignment_log2 = MAX2(surf->surf_alignment_log2, util_logbase2(out.baseAlign)); surf->u.gfx9.stencil_offset = align(surf->surf_size, out.baseAlign); surf->surf_size = surf->u.gfx9.stencil_offset + out.surfSize; return 0; @@ -1737,7 +1737,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->u.gfx9.surf_pitch = out.pitch; surf->u.gfx9.surf_height = out.height; surf->surf_size = out.surfSize; - surf->surf_alignment = out.baseAlign; + surf->surf_alignment_log2 = util_logbase2(out.baseAlign); if (!compressed && surf->blk_w > 1 && out.pitch == out.pixelPitch && surf->u.gfx9.swizzle_mode == ADDR_SW_LINEAR) { @@ -1800,7 +1800,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->htile_size = hout.htileBytes; surf->htile_slice_size = hout.sliceSize; - surf->htile_alignment = hout.baseAlign; + surf->htile_alignment_log2 = util_logbase2(hout.baseAlign); surf->num_htile_levels = in->numMipLevels; for (unsigned i = 0; i < in->numMipLevels; i++) { @@ -1888,9 +1888,10 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->u.gfx9.dcc_block_width = dout.compressBlkWidth; surf->u.gfx9.dcc_block_height = dout.compressBlkHeight; surf->u.gfx9.dcc_block_depth = dout.compressBlkDepth; + surf->u.gfx9.dcc_pitch_max = dout.pitch - 1; surf->dcc_size = dout.dccRamSize; surf->dcc_slice_size = dout.dccRamSliceSize; - surf->dcc_alignment = dout.dccRamBaseAlign; + surf->dcc_alignment_log2 = util_logbase2(dout.dccRamBaseAlign); surf->num_dcc_levels = in->numMipLevels; /* Disable DCC for levels that are in the mip tail. @@ -1938,9 +1939,8 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->dcc_size = 0; surf->u.gfx9.display_dcc_size = surf->dcc_size; - surf->u.gfx9.display_dcc_alignment = surf->dcc_alignment; - surf->u.gfx9.display_dcc_pitch_max = dout.pitch - 1; - surf->u.gfx9.dcc_pitch_max = dout.pitch - 1; + surf->u.gfx9.display_dcc_alignment_log2 = surf->dcc_alignment_log2; + surf->u.gfx9.display_dcc_pitch_max = surf->u.gfx9.dcc_pitch_max; /* Compute displayable DCC. */ if (((in->flags.display && info->use_display_dcc_with_retile_blit) || @@ -1960,7 +1960,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ return ret; surf->u.gfx9.display_dcc_size = dout.dccRamSize; - surf->u.gfx9.display_dcc_alignment = dout.dccRamBaseAlign; + surf->u.gfx9.display_dcc_alignment_log2 = util_logbase2(dout.dccRamBaseAlign); surf->u.gfx9.display_dcc_pitch_max = dout.pitch - 1; assert(surf->u.gfx9.display_dcc_size <= surf->dcc_size); @@ -2068,7 +2068,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ surf->u.gfx9.fmask_swizzle_mode = fin.swizzleMode; surf->u.gfx9.fmask_epitch = fout.pitch - 1; surf->fmask_size = fout.fmaskBytes; - surf->fmask_alignment = fout.baseAlign; + surf->fmask_alignment_log2 = util_logbase2(fout.baseAlign); surf->fmask_slice_size = fout.sliceSize; /* Compute tile swizzle for the FMASK surface. */ @@ -2133,7 +2133,7 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_ return ret; surf->cmask_size = cout.cmaskBytes; - surf->cmask_alignment = cout.baseAlign; + surf->cmask_alignment_log2 = util_logbase2(cout.baseAlign); surf->cmask_slice_size = cout.sliceSize; surf->u.gfx9.cmask_level0.offset = meta_mip_info[0].offset; surf->u.gfx9.cmask_level0.size = meta_mip_info[0].sliceSize; @@ -2404,7 +2404,7 @@ static int gfx9_compute_surface(struct ac_addrlib *addrlib, const struct radeon_ if (info->has_graphics && !compressed && !config->is_3d && config->info.levels == 1 && AddrSurfInfoIn.flags.color && !surf->is_linear && - surf->surf_alignment >= 64 * 1024 && /* 64KB tiling */ + (1 << surf->surf_alignment_log2) >= 64 * 1024 && /* 64KB tiling */ !(surf->flags & (RADEON_SURF_DISABLE_DCC | RADEON_SURF_FORCE_SWIZZLE_MODE | RADEON_SURF_FORCE_MICRO_TILE_MODE)) && (surf->modifier == DRM_FORMAT_MOD_INVALID || @@ -2500,7 +2500,7 @@ int ac_compute_surface(struct ac_addrlib *addrlib, const struct radeon_info *inf /* Determine the memory layout of multiple allocations in one buffer. */ surf->total_size = surf->surf_size; - surf->alignment = surf->surf_alignment; + surf->alignment_log2 = surf->surf_alignment_log2; /* Ensure the offsets are always 0 if not available. */ surf->dcc_offset = surf->display_dcc_offset = 0; @@ -2508,23 +2508,23 @@ int ac_compute_surface(struct ac_addrlib *addrlib, const struct radeon_info *inf surf->htile_offset = 0; if (surf->htile_size) { - surf->htile_offset = align64(surf->total_size, surf->htile_alignment); + surf->htile_offset = align64(surf->total_size, 1 << surf->htile_alignment_log2); surf->total_size = surf->htile_offset + surf->htile_size; - surf->alignment = MAX2(surf->alignment, surf->htile_alignment); + surf->alignment_log2 = MAX2(surf->alignment_log2, surf->htile_alignment_log2); } if (surf->fmask_size) { assert(config->info.samples >= 2); - surf->fmask_offset = align64(surf->total_size, surf->fmask_alignment); + surf->fmask_offset = align64(surf->total_size, 1 << surf->fmask_alignment_log2); surf->total_size = surf->fmask_offset + surf->fmask_size; - surf->alignment = MAX2(surf->alignment, surf->fmask_alignment); + surf->alignment_log2 = MAX2(surf->alignment_log2, surf->fmask_alignment_log2); } /* Single-sample CMASK is in a separate buffer. */ if (surf->cmask_size && config->info.samples >= 2) { - surf->cmask_offset = align64(surf->total_size, surf->cmask_alignment); + surf->cmask_offset = align64(surf->total_size, 1 << surf->cmask_alignment_log2); surf->total_size = surf->cmask_offset + surf->cmask_size; - surf->alignment = MAX2(surf->alignment, surf->cmask_alignment); + surf->alignment_log2 = MAX2(surf->alignment_log2, surf->cmask_alignment_log2); } if (surf->is_displayable) @@ -2538,13 +2538,13 @@ int ac_compute_surface(struct ac_addrlib *addrlib, const struct radeon_info *inf */ if (info->chip_class >= GFX9 && surf->u.gfx9.dcc_retile_num_elements) { /* Add space for the displayable DCC buffer. */ - surf->display_dcc_offset = align64(surf->total_size, surf->u.gfx9.display_dcc_alignment); + surf->display_dcc_offset = align64(surf->total_size, 1 << surf->u.gfx9.display_dcc_alignment_log2); surf->total_size = surf->display_dcc_offset + surf->u.gfx9.display_dcc_size; } - surf->dcc_offset = align64(surf->total_size, surf->dcc_alignment); + surf->dcc_offset = align64(surf->total_size, 1 << surf->dcc_alignment_log2); surf->total_size = surf->dcc_offset + surf->dcc_size; - surf->alignment = MAX2(surf->alignment, surf->dcc_alignment); + surf->alignment_log2 = MAX2(surf->alignment_log2, surf->dcc_alignment_log2); } return 0; @@ -2557,7 +2557,7 @@ void ac_surface_zero_dcc_fields(struct radeon_surf *surf) surf->display_dcc_offset = 0; if (!surf->htile_offset && !surf->fmask_offset && !surf->cmask_offset) { surf->total_size = surf->surf_size; - surf->alignment = surf->surf_alignment; + surf->alignment_log2 = surf->surf_alignment_log2; } } @@ -2931,7 +2931,7 @@ bool ac_surface_override_offset_stride(const struct radeon_info *info, struct ra } } - if (offset & (surf->alignment - 1) || + if (offset & ((1 << surf->alignment_log2) - 1) || offset >= UINT64_MAX - surf->total_size) return false; @@ -3037,7 +3037,7 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, "alignment=%u, swmode=%u, epitch=%u, pitch=%u, blk_w=%u, " "blk_h=%u, bpe=%u, flags=0x%"PRIx64"\n", surf->surf_size, surf->u.gfx9.surf_slice_size, - surf->surf_alignment, surf->u.gfx9.swizzle_mode, + 1 << surf->surf_alignment_log2, surf->u.gfx9.swizzle_mode, surf->u.gfx9.epitch, surf->u.gfx9.surf_pitch, surf->blk_w, surf->blk_h, surf->bpe, surf->flags); @@ -3046,7 +3046,7 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, " FMask: offset=%" PRIu64 ", size=%" PRIu64 ", " "alignment=%u, swmode=%u, epitch=%u\n", surf->fmask_offset, surf->fmask_size, - surf->fmask_alignment, surf->u.gfx9.fmask_swizzle_mode, + 1 << surf->fmask_alignment_log2, surf->u.gfx9.fmask_swizzle_mode, surf->u.gfx9.fmask_epitch); if (surf->cmask_offset) @@ -3054,19 +3054,19 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, " CMask: offset=%" PRIu64 ", size=%u, " "alignment=%u\n", surf->cmask_offset, surf->cmask_size, - surf->cmask_alignment); + 1 << surf->cmask_alignment_log2); if (surf->htile_offset) fprintf(out, " HTile: offset=%" PRIu64 ", size=%u, alignment=%u\n", surf->htile_offset, surf->htile_size, - surf->htile_alignment); + 1 << surf->htile_alignment_log2); if (surf->dcc_offset) fprintf(out, " DCC: offset=%" PRIu64 ", size=%u, " "alignment=%u, pitch_max=%u, num_dcc_levels=%u\n", - surf->dcc_offset, surf->dcc_size, surf->dcc_alignment, + surf->dcc_offset, surf->dcc_size, 1 << surf->dcc_alignment_log2, surf->u.gfx9.display_dcc_pitch_max, surf->num_dcc_levels); if (surf->u.gfx9.stencil_offset) @@ -3079,13 +3079,13 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, fprintf(out, " Surf: size=%" PRIu64 ", alignment=%u, blk_w=%u, blk_h=%u, " "bpe=%u, flags=0x%"PRIx64"\n", - surf->surf_size, surf->surf_alignment, surf->blk_w, + surf->surf_size, 1 << surf->surf_alignment_log2, surf->blk_w, surf->blk_h, surf->bpe, surf->flags); fprintf(out, " Layout: size=%" PRIu64 ", alignment=%u, bankw=%u, bankh=%u, " "nbanks=%u, mtilea=%u, tilesplit=%u, pipeconfig=%u, scanout=%u\n", - surf->surf_size, surf->surf_alignment, + surf->surf_size, 1 << surf->surf_alignment_log2, surf->u.legacy.bankw, surf->u.legacy.bankh, surf->u.legacy.num_banks, surf->u.legacy.mtilea, surf->u.legacy.tile_split, surf->u.legacy.pipe_config, @@ -3097,7 +3097,7 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, "alignment=%u, pitch_in_pixels=%u, bankh=%u, " "slice_tile_max=%u, tile_mode_index=%u\n", surf->fmask_offset, surf->fmask_size, - surf->fmask_alignment, surf->u.legacy.fmask.pitch_in_pixels, + 1 << surf->fmask_alignment_log2, surf->u.legacy.fmask.pitch_in_pixels, surf->u.legacy.fmask.bankh, surf->u.legacy.fmask.slice_tile_max, surf->u.legacy.fmask.tiling_index); @@ -3107,16 +3107,16 @@ void ac_surface_print_info(FILE *out, const struct radeon_info *info, " CMask: offset=%" PRIu64 ", size=%u, alignment=%u, " "slice_tile_max=%u\n", surf->cmask_offset, surf->cmask_size, - surf->cmask_alignment, surf->u.legacy.cmask_slice_tile_max); + 1 << surf->cmask_alignment_log2, surf->u.legacy.cmask_slice_tile_max); if (surf->htile_offset) fprintf(out, " HTile: offset=%" PRIu64 ", size=%u, alignment=%u\n", surf->htile_offset, surf->htile_size, - surf->htile_alignment); + 1 << surf->htile_alignment_log2); if (surf->dcc_offset) fprintf(out, " DCC: offset=%" PRIu64 ", size=%u, alignment=%u\n", - surf->dcc_offset, surf->dcc_size, surf->dcc_alignment); + surf->dcc_offset, surf->dcc_size, 1 << surf->dcc_alignment_log2); if (surf->has_stencil) fprintf(out, " StencilLayout: tilesplit=%u\n", diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h index a926e5a3268..79db9bba415 100644 --- a/src/amd/common/ac_surface.h +++ b/src/amd/common/ac_surface.h @@ -202,7 +202,7 @@ struct gfx9_surf_layout { * A compute shader needs to convert from aligned DCC to unaligned. */ uint32_t display_dcc_size; - uint32_t display_dcc_alignment; + uint8_t display_dcc_alignment_log2; uint16_t display_dcc_pitch_max; /* (mip chain pitch - 1) */ uint16_t dcc_pitch_max; bool dcc_retile_use_uint16; /* if all values fit into uint16_t */ @@ -276,24 +276,27 @@ struct radeon_surf { uint8_t tile_swizzle; uint8_t fmask_tile_swizzle; + /* Use (1 << log2) to compute the alignment. */ + uint8_t surf_alignment_log2; + uint8_t fmask_alignment_log2; + uint8_t dcc_alignment_log2; + uint8_t htile_alignment_log2; + uint8_t cmask_alignment_log2; + uint8_t alignment_log2; + uint64_t surf_size; uint64_t fmask_size; - uint32_t surf_alignment; - uint32_t fmask_alignment; uint64_t fmask_slice_size; /* DCC and HTILE are very small. */ uint32_t dcc_size; uint32_t dcc_slice_size; - uint32_t dcc_alignment; uint32_t htile_size; uint32_t htile_slice_size; - uint32_t htile_alignment; uint32_t cmask_size; uint32_t cmask_slice_size; - uint32_t cmask_alignment; /* All buffers combined. */ uint64_t htile_offset; @@ -302,7 +305,6 @@ struct radeon_surf { uint64_t dcc_offset; uint64_t display_dcc_offset; uint64_t total_size; - uint32_t alignment; union { /* Return values for GFX8 and older. diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index de63bfddec6..757f18b55af 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -6364,7 +6364,7 @@ radv_initialise_color_surface(struct radv_device *device, struct radv_color_buff va += plane->surface.u.legacy.dcc_level[iview->base_mip].dcc_offset; unsigned dcc_tile_swizzle = surf->tile_swizzle; - dcc_tile_swizzle &= (surf->dcc_alignment - 1) >> 8; + dcc_tile_swizzle &= ((1 << surf->dcc_alignment_log2) - 1) >> 8; cb->cb_dcc_base = va >> 8; cb->cb_dcc_base |= dcc_tile_swizzle; diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 2811055e82e..445d87ad8c3 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -705,7 +705,7 @@ si_set_mutable_tex_desc_fields(struct radv_device *device, struct radv_image *im meta_va += plane->surface.u.legacy.dcc_level[base_level].dcc_offset; unsigned dcc_tile_swizzle = plane->surface.tile_swizzle << 8; - dcc_tile_swizzle &= plane->surface.dcc_alignment - 1; + dcc_tile_swizzle &= (1 << plane->surface.dcc_alignment_log2) - 1; meta_va |= dcc_tile_swizzle; } else if (!disable_compression && radv_image_is_tc_compat_htile(image)) { meta_va = gpu_address + plane->surface.htile_offset; @@ -1261,9 +1261,9 @@ radv_image_alloc_single_sample_cmask(const struct radv_device *device, assert(image->info.storage_samples == 1); - surf->cmask_offset = align64(surf->total_size, surf->cmask_alignment); + surf->cmask_offset = align64(surf->total_size, 1 << surf->cmask_alignment_log2); surf->total_size = surf->cmask_offset + surf->cmask_size; - surf->alignment = MAX2(surf->alignment, surf->cmask_alignment); + surf->alignment_log2 = MAX2(surf->alignment_log2, surf->cmask_alignment_log2); } static void @@ -1410,7 +1410,7 @@ radv_image_create_layout(struct radv_device *device, struct radv_image_create_in offset = mod_info->pPlaneLayouts[plane].offset; stride = mod_info->pPlaneLayouts[plane].rowPitch / image->planes[plane].surface.bpe; } else { - offset = align(image->size, image->planes[plane].surface.alignment); + offset = align(image->size, 1 << image->planes[plane].surface.alignment_log2); stride = 0; /* 0 means no override */ } @@ -1434,7 +1434,7 @@ radv_image_create_layout(struct radv_device *device, struct radv_image_create_in } image->size = MAX2(image->size, offset + image->planes[plane].surface.total_size); - image->alignment = MAX2(image->alignment, image->planes[plane].surface.alignment); + image->alignment = MAX2(image->alignment, 1 << image->planes[plane].surface.alignment_log2); image->planes[plane].format = vk_format_get_plane_format(image->vk_format, plane); } diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c index 7f461ac051a..18fac37cb8f 100644 --- a/src/gallium/drivers/r600/r600_texture.c +++ b/src/gallium/drivers/r600/r600_texture.c @@ -653,7 +653,7 @@ void r600_texture_get_fmask_info(struct r600_common_screen *rscreen, out->pitch_in_pixels = fmask.u.legacy.level[0].nblk_x; out->bank_height = fmask.u.legacy.bankh; out->tile_swizzle = fmask.tile_swizzle; - out->alignment = MAX2(256, fmask.surf_alignment); + out->alignment = MAX2(256, 1 << fmask.surf_alignment_log2); out->size = fmask.surf_size; } @@ -804,7 +804,7 @@ static void r600_texture_get_htile_size(struct r600_common_screen *rscreen, pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes; base_align = num_pipes * pipe_interleave_bytes; - rtex->surface.htile_alignment = base_align; + rtex->surface.htile_alignment_log2 = util_logbase2(base_align); rtex->surface.htile_size = util_num_layers(&rtex->resource.b.b, 0) * align(slice_bytes, base_align); @@ -818,7 +818,7 @@ static void r600_texture_allocate_htile(struct r600_common_screen *rscreen, if (!rtex->surface.htile_size) return; - rtex->htile_offset = align(rtex->size, rtex->surface.htile_alignment); + rtex->htile_offset = align(rtex->size, 1 << rtex->surface.htile_alignment_log2); rtex->size = rtex->htile_offset + rtex->surface.htile_size; } @@ -840,7 +840,7 @@ void r600_print_texture_info(struct r600_common_screen *rscreen, u_log_printf(log, " Layout: size=%"PRIu64", alignment=%u, bankw=%u, " "bankh=%u, nbanks=%u, mtilea=%u, tilesplit=%u, pipeconfig=%u, scanout=%u\n", - rtex->surface.surf_size, rtex->surface.surf_alignment, rtex->surface.u.legacy.bankw, + rtex->surface.surf_size, 1 << rtex->surface.surf_alignment_log2, rtex->surface.u.legacy.bankw, rtex->surface.u.legacy.bankh, rtex->surface.u.legacy.num_banks, rtex->surface.u.legacy.mtilea, rtex->surface.u.legacy.tile_split, rtex->surface.u.legacy.pipe_config, (rtex->surface.flags & RADEON_SURF_SCANOUT) != 0); @@ -862,7 +862,7 @@ void r600_print_texture_info(struct r600_common_screen *rscreen, u_log_printf(log, " HTile: offset=%"PRIu64", size=%u " "alignment=%u\n", rtex->htile_offset, rtex->surface.htile_size, - rtex->surface.htile_alignment); + 1 << rtex->surface.htile_alignment_log2); for (i = 0; i <= rtex->resource.b.b.last_level; i++) u_log_printf(log, " Level[%i]: offset=%"PRIu64", slice_size=%"PRIu64", " @@ -971,7 +971,7 @@ r600_texture_create_object(struct pipe_screen *screen, /* Now create the backing buffer. */ if (!buf) { r600_init_resource_fields(rscreen, resource, rtex->size, - rtex->surface.surf_alignment); + 1 << rtex->surface.surf_alignment_log2); if (!r600_alloc_resource(rscreen, resource)) { FREE(rtex); diff --git a/src/gallium/drivers/r600/radeon_video.c b/src/gallium/drivers/r600/radeon_video.c index 1ebb8708de4..6ada9ba1862 100644 --- a/src/gallium/drivers/r600/radeon_video.c +++ b/src/gallium/drivers/r600/radeon_video.c @@ -171,7 +171,7 @@ void rvid_join_surfaces(struct r600_common_context *rctx, continue; /* adjust the texture layer offsets */ - off = align(off, surfaces[i]->surf_alignment); + off = align(off, 1 << surfaces[i]->surf_alignment_log2); /* copy the tiling parameters */ surfaces[i]->u.legacy.bankw = surfaces[best_tiling]->u.legacy.bankw; diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index 97c66a27196..e8b3523b6a9 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -90,7 +90,7 @@ static bool si_alloc_separate_cmask(struct si_screen *sscreen, struct si_texture tex->cmask_buffer = si_aligned_buffer_create(&sscreen->b, SI_RESOURCE_FLAG_UNMAPPABLE, PIPE_USAGE_DEFAULT, - tex->surface.cmask_size, tex->surface.cmask_alignment); + tex->surface.cmask_size, 1 << tex->surface.cmask_alignment_log2); if (tex->cmask_buffer == NULL) return false; diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 2f3642b7d3c..5602f23f01b 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -340,7 +340,7 @@ void si_set_mutable_tex_desc_fields(struct si_screen *sscreen, struct si_texture } unsigned dcc_tile_swizzle = tex->surface.tile_swizzle << 8; - dcc_tile_swizzle &= tex->surface.dcc_alignment - 1; + dcc_tile_swizzle &= (1 << tex->surface.dcc_alignment_log2) - 1; meta_va |= dcc_tile_swizzle; } else if (vi_tc_compat_htile_enabled(tex, first_level, is_stencil ? PIPE_MASK_S : PIPE_MASK_Z)) { diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 64936b5c52b..bf7d4aa937e 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3035,7 +3035,7 @@ static void si_emit_framebuffer_state(struct si_context *sctx) 8; unsigned dcc_tile_swizzle = tex->surface.tile_swizzle; - dcc_tile_swizzle &= (tex->surface.dcc_alignment - 1) >> 8; + dcc_tile_swizzle &= ((1 << tex->surface.dcc_alignment_log2) - 1) >> 8; cb_dcc_base |= dcc_tile_swizzle; } diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c index 0980cc55466..d2bbd99f38e 100644 --- a/src/gallium/drivers/radeonsi/si_texture.c +++ b/src/gallium/drivers/radeonsi/si_texture.c @@ -1310,9 +1310,9 @@ si_texture_create_with_modifier(struct pipe_screen *screen, is_flushed_depth, tc_compatible_htile)) return NULL; - plane_offset[i] = align64(total_size, surface[i].surf_alignment); + plane_offset[i] = align64(total_size, 1 << surface[i].surf_alignment_log2); total_size = plane_offset[i] + surface[i].total_size; - max_alignment = MAX2(max_alignment, surface[i].surf_alignment); + max_alignment = MAX2(max_alignment, 1 << surface[i].surf_alignment_log2); } struct si_texture *plane0 = NULL, *last_plane = NULL; @@ -1625,7 +1625,7 @@ static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *ssc if (ac_surface_get_plane_offset(sscreen->info.chip_class, &tex->surface, 0, 0) + tex->surface.total_size > buf->size || - 1 << buf->alignment_log2 < tex->surface.alignment) { + buf->alignment_log2 < tex->surface.alignment_log2) { si_texture_reference(&tex, NULL); return NULL; } @@ -2366,7 +2366,7 @@ void vi_separate_dcc_try_enable(struct si_context *sctx, struct si_texture *tex) } else { tex->dcc_separate_buffer = si_aligned_buffer_create(sctx->b.screen, SI_RESOURCE_FLAG_UNMAPPABLE, PIPE_USAGE_DEFAULT, - tex->surface.dcc_size, tex->surface.dcc_alignment); + tex->surface.dcc_size, 1 << tex->surface.dcc_alignment_log2); if (!tex->dcc_separate_buffer) return; } diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_surface.c b/src/gallium/winsys/radeon/drm/radeon_drm_surface.c index 00961ea1d7e..2ce9696c90e 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_surface.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_surface.c @@ -146,7 +146,7 @@ static void surf_winsys_to_drm(struct radeon_surface *surf_drm, } surf_drm->bo_size = surf_ws->surf_size; - surf_drm->bo_alignment = surf_ws->surf_alignment; + surf_drm->bo_alignment = 1 << surf_ws->surf_alignment_log2; surf_drm->bankw = surf_ws->u.legacy.bankw; surf_drm->bankh = surf_ws->u.legacy.bankh; @@ -188,7 +188,7 @@ static void surf_drm_to_winsys(struct radeon_drm_winsys *ws, surf_ws->flags = surf_drm->flags; surf_ws->surf_size = surf_drm->bo_size; - surf_ws->surf_alignment = surf_drm->bo_alignment; + surf_ws->surf_alignment_log2 = util_logbase2(surf_drm->bo_alignment); surf_ws->u.legacy.bankw = surf_drm->bankw; surf_ws->u.legacy.bankh = surf_drm->bankh; @@ -276,7 +276,7 @@ static void si_compute_cmask(const struct radeon_info *info, else num_layers = config->info.array_size; - surf->cmask_alignment = MAX2(256, base_align); + surf->cmask_alignment_log2 = util_logbase2(MAX2(256, base_align)); surf->cmask_size = align(slice_bytes, base_align) * num_layers; } @@ -342,7 +342,7 @@ static void si_compute_htile(const struct radeon_info *info, pipe_interleave_bytes = info->pipe_interleave_bytes; base_align = num_pipes * pipe_interleave_bytes; - surf->htile_alignment = base_align; + surf->htile_alignment_log2 = util_logbase2(base_align); surf->htile_size = num_layers * align(slice_bytes, base_align); } @@ -404,7 +404,7 @@ static int radeon_winsys_surface_init(struct radeon_winsys *rws, assert(fmask.u.legacy.level[0].mode == RADEON_SURF_MODE_2D); surf_ws->fmask_size = fmask.surf_size; - surf_ws->fmask_alignment = MAX2(256, fmask.surf_alignment); + surf_ws->fmask_alignment_log2 = util_logbase2(MAX2(256, 1 << fmask.surf_alignment_log2)); surf_ws->fmask_tile_swizzle = fmask.tile_swizzle; surf_ws->u.legacy.fmask.slice_tile_max = @@ -439,19 +439,19 @@ static int radeon_winsys_surface_init(struct radeon_winsys *rws, surf_ws->total_size = surf_ws->surf_size; if (surf_ws->htile_size) { - surf_ws->htile_offset = align64(surf_ws->total_size, surf_ws->htile_alignment); + surf_ws->htile_offset = align64(surf_ws->total_size, 1 << surf_ws->htile_alignment_log2); surf_ws->total_size = surf_ws->htile_offset + surf_ws->htile_size; } if (surf_ws->fmask_size) { assert(tex->nr_samples >= 2); - surf_ws->fmask_offset = align64(surf_ws->total_size, surf_ws->fmask_alignment); + surf_ws->fmask_offset = align64(surf_ws->total_size, 1 << surf_ws->fmask_alignment_log2); surf_ws->total_size = surf_ws->fmask_offset + surf_ws->fmask_size; } /* Single-sample CMASK is in a separate buffer. */ if (surf_ws->cmask_size && tex->nr_samples >= 2) { - surf_ws->cmask_offset = align64(surf_ws->total_size, surf_ws->cmask_alignment); + surf_ws->cmask_offset = align64(surf_ws->total_size, 1 << surf_ws->cmask_alignment_log2); surf_ws->total_size = surf_ws->cmask_offset + surf_ws->cmask_size; } } |