ac,radv,radeonsi: add a helper to translate buffer numformat

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29236>
This commit is contained in:
Samuel Pitoiset 2024-05-16 08:45:30 +02:00 committed by Marge Bot
parent 3409015103
commit 5d9bdb6410
5 changed files with 74 additions and 53 deletions

View file

@ -0,0 +1,43 @@
/*
* Copyright 2015 Advanced Micro Devices, Inc.
* Copyright 2024 Valve Corporation
*
* SPDX-License-Identifier: MIT
*/
#include "ac_formats.h"
#include "sid.h"
uint32_t
ac_translate_buffer_numformat(const struct util_format_description *desc,
int first_non_void)
{
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
assert(first_non_void >= 0);
switch (desc->channel[first_non_void].type) {
case UTIL_FORMAT_TYPE_SIGNED:
case UTIL_FORMAT_TYPE_FIXED:
if (desc->channel[first_non_void].size >= 32 || desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_SINT;
else if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_SNORM;
else
return V_008F0C_BUF_NUM_FORMAT_SSCALED;
break;
case UTIL_FORMAT_TYPE_UNSIGNED:
if (desc->channel[first_non_void].size >= 32 || desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_UINT;
else if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_UNORM;
else
return V_008F0C_BUF_NUM_FORMAT_USCALED;
break;
case UTIL_FORMAT_TYPE_FLOAT:
default:
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
}
}

View file

@ -0,0 +1,25 @@
/*
* Copyright 2015 Advanced Micro Devices, Inc.
* Copyright 2024 Valve Corporation
*
* SPDX-License-Identifier: MIT
*/
#ifndef AC_FORMATS_H
#define AC_FORMATS_H
#include "util/format/u_format.h"
#ifdef __cplusplus
extern "C" {
#endif
uint32_t
ac_translate_buffer_numformat(const struct util_format_description *desc,
int first_non_void);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -82,6 +82,8 @@ amd_common_files = files(
'ac_surface.h',
'ac_debug.c',
'ac_debug.h',
'ac_formats.c',
'ac_formats.h',
'ac_shadowed_regs.c',
'ac_shadowed_regs.h',
'ac_spm.c',

View file

@ -24,6 +24,7 @@
#include "util/format_srgb.h"
#include "util/half_float.h"
#include "ac_drm_fourcc.h"
#include "ac_formats.h"
uint32_t
radv_translate_buffer_dataformat(const struct util_format_description *desc, int first_non_void)
@ -105,32 +106,7 @@ radv_translate_buffer_numformat(const struct util_format_description *desc, int
{
assert(util_format_get_num_planes(desc->format) == 1);
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
assert(first_non_void >= 0);
switch (desc->channel[first_non_void].type) {
case UTIL_FORMAT_TYPE_SIGNED:
if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_SNORM;
else if (desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_SINT;
else
return V_008F0C_BUF_NUM_FORMAT_SSCALED;
break;
case UTIL_FORMAT_TYPE_UNSIGNED:
if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_UNORM;
else if (desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_UINT;
else
return V_008F0C_BUF_NUM_FORMAT_USCALED;
break;
case UTIL_FORMAT_TYPE_FLOAT:
default:
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
}
return ac_translate_buffer_numformat(desc, first_non_void);
}
static bool

View file

@ -18,6 +18,7 @@
#include "util/u_upload_mgr.h"
#include "util/u_blend.h"
#include "ac_formats.h"
#include "gfx10_format_table.h"
static unsigned si_map_swizzle(unsigned swizzle)
@ -2537,33 +2538,7 @@ static uint32_t si_translate_buffer_numformat(struct pipe_screen *screen,
{
assert(((struct si_screen *)screen)->info.gfx_level <= GFX9);
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
assert(first_non_void >= 0);
switch (desc->channel[first_non_void].type) {
case UTIL_FORMAT_TYPE_SIGNED:
case UTIL_FORMAT_TYPE_FIXED:
if (desc->channel[first_non_void].size >= 32 || desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_SINT;
else if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_SNORM;
else
return V_008F0C_BUF_NUM_FORMAT_SSCALED;
break;
case UTIL_FORMAT_TYPE_UNSIGNED:
if (desc->channel[first_non_void].size >= 32 || desc->channel[first_non_void].pure_integer)
return V_008F0C_BUF_NUM_FORMAT_UINT;
else if (desc->channel[first_non_void].normalized)
return V_008F0C_BUF_NUM_FORMAT_UNORM;
else
return V_008F0C_BUF_NUM_FORMAT_USCALED;
break;
case UTIL_FORMAT_TYPE_FLOAT:
default:
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
}
return ac_translate_buffer_numformat(desc, first_non_void);
}
static unsigned si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format,