panfrost: Handle fixed-point packing in GenXML

Minimum/maximum LOD and LOD bias are unsigned and signed fixed point formats
respectively. They are not unsigned integers. Introduce fixed-point types into
our GenXML and use them in the XML, rather than packing in sidebands. This makes
the XML more correct and fixes pretty-printing of texture and sampler
descriptors.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20445>
This commit is contained in:
Alyssa Rosenzweig
2022-12-28 15:43:48 -05:00
committed by Marge Bot
parent 17c55e0d12
commit 35985be275
12 changed files with 68 additions and 56 deletions
+4 -4
View File
@@ -252,9 +252,9 @@ panfrost_create_sampler_state(struct pipe_context *pctx,
cfg.minify_nearest = cso->min_img_filter == PIPE_TEX_FILTER_NEAREST;
cfg.normalized_coordinates = !cso->unnormalized_coords;
cfg.lod_bias = FIXED_16(cso->lod_bias, true);
cfg.minimum_lod = FIXED_16(cso->min_lod, false);
cfg.maximum_lod = FIXED_16(cso->max_lod, false);
cfg.lod_bias = cso->lod_bias;
cfg.minimum_lod = cso->min_lod;
cfg.maximum_lod = cso->max_lod;
cfg.wrap_mode_s = translate_tex_wrap(cso->wrap_s, using_nearest);
cfg.wrap_mode_t = translate_tex_wrap(cso->wrap_t, using_nearest);
@@ -278,7 +278,7 @@ panfrost_create_sampler_state(struct pipe_context *pctx,
/* Emulate disabled mipmapping by clamping the LOD as tight as
* possible (from 0 to epsilon = 1/256) */
if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE)
cfg.maximum_lod = cfg.minimum_lod + 1;
cfg.maximum_lod = cfg.minimum_lod + (1.0 / 256.0);
#endif
}
-17
View File
@@ -56,21 +56,4 @@ typedef uint64_t mali_ptr;
*/
#define MAX_MIP_LEVELS (14)
/* Used for lod encoding. Thanks @urjaman for pointing out these routines can
* be cleaned up a lot. */
#define DECODE_FIXED_16(x) ((float)(x / 256.0))
static inline int16_t
FIXED_16(float x, bool allow_negative)
{
/* Clamp inputs, accounting for float error */
float max_lod = (32.0 - (1.0 / 512.0));
float min_lod = allow_negative ? -max_lod : 0.0;
x = ((x > max_lod) ? max_lod : ((x < min_lod) ? min_lod : x));
return (int)(x * 256.0);
}
#endif /* __PANFROST_JOB_H__ */
+30 -2
View File
@@ -88,6 +88,22 @@ __gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
return util_sign_extend(val, size);
}
static inline float
__gen_unpack_ulod(const uint8_t *restrict cl, uint32_t start, uint32_t end)
{
uint32_t u = __gen_unpack_uint(cl, start, end);
return ((float)u) / 256.0;
}
static inline float
__gen_unpack_slod(const uint8_t *restrict cl, uint32_t start, uint32_t end)
{
int32_t u = __gen_unpack_sint(cl, start, end);
return ((float)u) / 256.0;
}
static inline uint64_t
__gen_unpack_padded(const uint8_t *restrict cl, uint32_t start, uint32_t end)
{
@@ -325,7 +341,7 @@ class Field(object):
type = 'uint64_t'
elif self.type == 'bool':
type = 'bool'
elif self.type == 'float':
elif self.type in ['float', 'ulod', 'slod']:
type = 'float'
elif self.type in ['uint', 'hex'] and self.end - self.start > 32:
type = 'uint64_t'
@@ -500,6 +516,14 @@ class Group(object):
elif field.type == "float":
assert(start == 0 and end == 31)
s = "util_bitpack_float({})".format(value)
elif field.type == "ulod":
s = "util_bitpack_ufixed_clamp({}, {}, {}, 8)".format(value,
start,
end)
elif field.type == "slod":
s = "util_bitpack_sfixed_clamp({}, {}, {}, 8)".format(value,
start,
end)
else:
s = "#error unhandled field {}, type {}".format(contributor.path, field.type)
@@ -568,6 +592,10 @@ class Group(object):
convert = "__gen_unpack_uint"
elif field.type == "float":
convert = "__gen_unpack_float"
elif field.type == "ulod":
convert = "__gen_unpack_ulod"
elif field.type == "slod":
convert = "__gen_unpack_slod"
else:
s = "/* unhandled field %s, type %s */\n" % (field.name, field.type)
@@ -606,7 +634,7 @@ class Group(object):
print(' fprintf(fp, "%*s{}: %d\\n", indent, "", {});'.format(name, val))
elif field.type == "bool":
print(' fprintf(fp, "%*s{}: %s\\n", indent, "", {} ? "true" : "false");'.format(name, val))
elif field.type == "float":
elif field.type in ["float", "ulod", "slod"]:
print(' fprintf(fp, "%*s{}: %f\\n", indent, "", {});'.format(name, val))
elif field.type in ["uint", "hex"] and (field.end - field.start) >= 32:
print(' fprintf(fp, "%*s{}: 0x%" PRIx64 "\\n", indent, "", {});'.format(name, val))
+5 -5
View File
@@ -981,10 +981,10 @@
<!--- Set for 0.5, clear for 0.0 -->
<field name="Magnify cutoff" size="1" start="0:29" type="bool" default="false"/>
<field name="Mipmap Mode" size="2" start="0:30" type="Mipmap Mode" default="Nearest"/>
<field name="Minimum LOD" size="13" start="1:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="1:0" type="ulod" default="0"/>
<field name="Compare Function" size="3" start="1:13" type="Func" default="Never"/>
<field name="Maximum LOD" size="13" start="1:16" type="uint" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="int" default="0"/>
<field name="Maximum LOD" size="13" start="1:16" type="ulod" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="slod" default="0"/>
<field name="Maximum anisotropy" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="LOD algorithm" size="2" start="2:24" type="LOD Algorithm" default="Isotropic"/>
<field name="Border Color R" size="32" start="4:0" type="uint/float" default="0.0"/>
@@ -1164,9 +1164,9 @@
<field name="Texel interleave" size="1" start="2:12" type="bool"/>
<field name="Levels" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="Minimum level" size="5" start="2:24" type="uint"/>
<field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="3:0" type="ulod" default="0"/>
<field name="Sample count" size="3" start="3:13" type="uint" default="1" modifier="log2"/>
<field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
<field name="Maximum LOD" size="13" start="3:16" type="ulod" default="0"/>
<field name="Surfaces" size="64" start="4:0" type="address"/>
<field name="Array size" size="16" start="6:0" type="uint" modifier="minus(1)" default="1"/>
<field name="Depth" size="16" start="7:0" type="uint" modifier="minus(1)" default="1"/>
+3 -3
View File
@@ -571,9 +571,9 @@
<field name="Mipmap Mode" size="2" start="3" type="Mipmap Mode" default="Nearest"/>
<field name="Normalized Coordinates" size="1" start="5" type="bool" default="true"/>
<field name="Isotropic LOD" size="1" start="6" type="bool"/>
<field name="LOD Bias" size="16" start="0:16" type="int" default="0"/>
<field name="Minimum LOD" size="16" start="1:0" type="uint" default="0"/>
<field name="Maximum LOD" size="16" start="1:16" type="uint" default="1"/>
<field name="LOD Bias" size="16" start="0:16" type="slod" default="0"/>
<field name="Minimum LOD" size="16" start="1:0" type="ulod" default="0"/>
<field name="Maximum LOD" size="16" start="1:16" type="ulod" default="0"/>
<field name="Wrap Mode S" size="4" start="2:0" type="Wrap Mode" default="Clamp to Edge"/>
<field name="Wrap Mode T" size="4" start="2:4" type="Wrap Mode" default="Clamp to Edge"/>
<field name="Wrap Mode R" size="4" start="2:8" type="Wrap Mode" default="Clamp to Edge"/>
+3 -3
View File
@@ -593,9 +593,9 @@
<field name="Mipmap Mode" size="2" start="3" type="Mipmap Mode" default="Nearest"/>
<field name="Normalized Coordinates" size="1" start="5" type="bool" default="true"/>
<field name="Isotropic LOD" size="1" start="6" type="bool"/>
<field name="LOD Bias" size="16" start="0:16" type="int" default="0"/>
<field name="Minimum LOD" size="16" start="1:0" type="uint" default="0"/>
<field name="Maximum LOD" size="16" start="1:16" type="uint" default="1"/>
<field name="LOD Bias" size="16" start="0:16" type="slod" default="0"/>
<field name="Minimum LOD" size="16" start="1:0" type="ulod" default="0"/>
<field name="Maximum LOD" size="16" start="1:16" type="ulod" default="0"/>
<field name="Wrap Mode S" size="4" start="2:0" type="Wrap Mode" default="Clamp to Edge"/>
<field name="Wrap Mode T" size="4" start="2:4" type="Wrap Mode" default="Clamp to Edge"/>
<field name="Wrap Mode R" size="4" start="2:8" type="Wrap Mode" default="Clamp to Edge"/>
+5 -5
View File
@@ -644,10 +644,10 @@
<!--- Set for 0.5, clear for 0.0 -->
<field name="Magnify cutoff" size="1" start="0:29" type="bool" default="false"/>
<field name="Mipmap Mode" size="2" start="0:30" type="Mipmap Mode" default="Nearest"/>
<field name="Minimum LOD" size="13" start="1:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="1:0" type="ulod" default="0"/>
<field name="Compare Function" size="3" start="1:13" type="Func" default="Never"/>
<field name="Maximum LOD" size="13" start="1:16" type="uint" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="int" default="0"/>
<field name="Maximum LOD" size="13" start="1:16" type="ulod" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="slod" default="0"/>
<field name="Maximum anisotropy" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="LOD algorithm" size="2" start="2:24" type="LOD Algorithm" default="Isotropic"/>
<field name="Border Color R" size="32" start="4:0" type="uint/float" default="0.0"/>
@@ -668,9 +668,9 @@
<field name="Texel ordering" size="4" start="2:12" type="Texture Layout"/>
<field name="Levels" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="Minimum level" size="5" start="2:24" type="uint"/>
<field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="3:0" type="ulod" default="0"/>
<field name="Sample count" size="3" start="3:13" type="uint" default="1" modifier="log2"/>
<field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
<field name="Maximum LOD" size="13" start="3:16" type="ulod" default="0"/>
<field name="Surfaces" size="64" start="4:0" type="address"/>
<field name="Array size" size="16" start="6:0" type="uint" modifier="minus(1)" default="1"/>
<field name="Depth" size="16" start="7:0" type="uint" modifier="minus(1)" default="1"/>
+5 -5
View File
@@ -700,10 +700,10 @@
<!--- Set for 0.5, clear for 0.0 -->
<field name="Magnify cutoff" size="1" start="0:29" type="bool" default="false"/>
<field name="Mipmap Mode" size="2" start="0:30" type="Mipmap Mode" default="Nearest"/>
<field name="Minimum LOD" size="13" start="1:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="1:0" type="ulod" default="0"/>
<field name="Compare Function" size="3" start="1:13" type="Func" default="Never"/>
<field name="Maximum LOD" size="13" start="1:16" type="uint" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="int" default="0"/>
<field name="Maximum LOD" size="13" start="1:16" type="ulod" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="slod" default="0"/>
<field name="Maximum anisotropy" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="LOD algorithm" size="2" start="2:24" type="LOD Algorithm" default="Isotropic"/>
<field name="Border Color R" size="32" start="4:0" type="uint/float" default="0.0"/>
@@ -724,9 +724,9 @@
<field name="Texel ordering" size="4" start="2:12" type="Texture Layout"/>
<field name="Levels" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="Minimum level" size="5" start="2:24" type="uint"/>
<field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="3:0" type="ulod" default="0"/>
<field name="Sample count" size="3" start="3:13" type="uint" default="1" modifier="log2"/>
<field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
<field name="Maximum LOD" size="13" start="3:16" type="ulod" default="0"/>
<field name="Surfaces" size="64" start="4:0" type="address"/>
<field name="Array size" size="16" start="6:0" type="uint" modifier="minus(1)" default="1"/>
<field name="Depth" size="16" start="7:0" type="uint" modifier="minus(1)" default="1"/>
+5 -5
View File
@@ -635,10 +635,10 @@
<!--- Set for 0.5, clear for 0.0 -->
<field name="Magnify cutoff" size="1" start="0:29" type="bool" default="false"/>
<field name="Mipmap Mode" size="2" start="0:30" type="Mipmap Mode" default="Nearest"/>
<field name="Minimum LOD" size="13" start="1:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="1:0" type="ulod" default="0"/>
<field name="Compare Function" size="3" start="1:13" type="Func" default="Never"/>
<field name="Maximum LOD" size="13" start="1:16" type="uint" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="int" default="0"/>
<field name="Maximum LOD" size="13" start="1:16" type="ulod" default="0"/>
<field name="LOD bias" size="16" start="2:0" type="slod" default="0"/>
<field name="Maximum anisotropy" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="LOD algorithm" size="2" start="2:24" type="LOD Algorithm" default="Isotropic"/>
<field name="Border Color R" size="32" start="4:0" type="uint/float" default="0.0"/>
@@ -818,9 +818,9 @@
<field name="Texel interleave" size="1" start="2:12" type="bool"/>
<field name="Levels" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
<field name="Minimum level" size="5" start="2:24" type="uint"/>
<field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
<field name="Minimum LOD" size="13" start="3:0" type="ulod" default="0"/>
<field name="Sample count" size="3" start="3:13" type="uint" default="1" modifier="log2"/>
<field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
<field name="Maximum LOD" size="13" start="3:16" type="ulod" default="0"/>
<field name="Surfaces" size="64" start="4:0" type="address"/>
<field name="Array size" size="16" start="6:0" type="uint" modifier="minus(1)" default="1"/>
<field name="Depth" size="16" start="7:0" type="uint" modifier="minus(1)" default="1"/>
+4 -3
View File
@@ -633,9 +633,10 @@ GENX(panfrost_new_texture)(const struct panfrost_device *dev,
cfg.surfaces = payload->gpu;
/* We specify API-level LOD clamps in the sampler descriptor
* and use these clamps simply for bounds checking */
cfg.minimum_lod = FIXED_16(0, false);
cfg.maximum_lod = FIXED_16(cfg.levels - 1, false);
* and use these clamps simply for bounds checking.
*/
cfg.minimum_lod = 0;
cfg.maximum_lod = cfg.levels - 1;
#else
cfg.manual_stride = true;
#endif
+3 -3
View File
@@ -249,9 +249,9 @@ panvk_per_arch(emit_sampler)(const VkSamplerCreateInfo *pCreateInfo,
cfg.mipmap_mode = panvk_translate_sampler_mipmap_mode(pCreateInfo->mipmapMode);
cfg.normalized_coordinates = !pCreateInfo->unnormalizedCoordinates;
cfg.lod_bias = FIXED_16(pCreateInfo->mipLodBias, true);
cfg.minimum_lod = FIXED_16(pCreateInfo->minLod, false);
cfg.maximum_lod = FIXED_16(pCreateInfo->maxLod, false);
cfg.lod_bias = pCreateInfo->mipLodBias;
cfg.minimum_lod = pCreateInfo->minLod;
cfg.maximum_lod = pCreateInfo->maxLod;
cfg.wrap_mode_s = panvk_translate_sampler_address_mode(pCreateInfo->addressModeU);
cfg.wrap_mode_t = panvk_translate_sampler_address_mode(pCreateInfo->addressModeV);
cfg.wrap_mode_r = panvk_translate_sampler_address_mode(pCreateInfo->addressModeW);
+1 -1
View File
@@ -214,7 +214,7 @@ panvk_per_arch(CreateBufferView)(VkDevice _device,
cfg.levels = 1;
cfg.array_size = 1;
cfg.surfaces = view->bo->ptr.gpu;
cfg.maximum_lod = cfg.minimum_lod = FIXED_16(0, false);
cfg.maximum_lod = cfg.minimum_lod = 0;
}
}