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:
committed by
Marge Bot
parent
17c55e0d12
commit
35985be275
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user