<field name="Slot 2" size="8" start="16" type="uint"/>
</struct>
+ <struct name="Format" size="2">
+ <field name="Channels" size="7" start="0" type="Channels"/>
+ <field name="Type" size="3" start="7" type="Texture Type"/>
+ </struct>
+
<struct name="Render Target" size="16">
<field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
<field name="Layout" size="2" start="4" type="Layout"/>
- <field name="Channels" size="7" start="6" type="Channels"/>
- <field name="Type" size="3" start="13" type="Texture Type"/>
+ <field name="Format" size="10" start="6" type="Pixel Format"/>
<field name="Swizzle R" size="2" start="16" type="Channel"/>
<field name="Swizzle G" size="2" start="18" type="Channel"/>
<field name="Swizzle B" size="2" start="20" type="Channel"/>
<struct name="Texture" size="16">
<field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
<field name="Layout" size="2" start="4" type="Layout"/>
- <field name="Channels" size="7" start="6" type="Channels"/>
- <field name="Type" size="3" start="13" type="Texture Type"/>
+ <field name="Format" size="10" start="6" type="Pixel Format"/>
<field name="Swizzle R" size="3" start="16" type="Channel" default="R"/>
<field name="Swizzle G" size="3" start="19" type="Channel" default="G"/>
<field name="Swizzle B" size="3" start="22" type="Channel" default="B"/>
#define agx_print(fp, T, var, indent) \\
AGX_ ## T ## _print(fp, &(var), indent)
+#define agx_pixel_format_print(fp, format) do {\\
+ fprintf(fp, "%*sFormat: ", indent, ""); \\
+ \\
+ if (agx_channels_as_str((enum agx_channels)(format & 0x7F))) \\
+ fputs(agx_channels_as_str((enum agx_channels)(format & 0x7F)), fp); \\
+ else \\
+ fprintf(fp, "unknown channels %02X", format & 0x7F); \\
+ \\
+ fputs(" ", fp); \\
+ \\
+ if (agx_texture_type_as_str((enum agx_texture_type)(format >> 7))) \\
+ fputs(agx_texture_type_as_str((enum agx_texture_type)(format >> 7)), fp); \\
+ else \\
+ fprintf(fp, "unknown type %02X", format >> 7); \\
+ \\
+ fputs("\\n", fp); \\
+} while(0) \\
+
"""
def to_alphanum(name):
type = 'uint64_t'
elif self.type == 'int':
type = 'int32_t'
- elif self.type in ['uint', 'uint/float', 'hex']:
+ elif self.type in ['uint', 'uint/float', 'Pixel Format', 'hex']:
type = 'uint32_t'
elif self.type in self.parser.structs:
type = 'struct ' + self.parser.gen_prefix(safe_name(self.type.upper()))
elif field.modifier[0] == "log2":
value = "util_logbase2({})".format(value)
- if field.type in ["uint", "hex", "address"]:
+ if field.type in ["uint", "hex", "Pixel Format", "address"]:
s = "__gen_uint(%s, %d, %d)" % \
(value, start, end)
elif field.type in self.parser.enums:
args.append(str(fieldref.start))
args.append(str(fieldref.end))
- if field.type in set(["uint", "uint/float", "address", "hex"]) | self.parser.enums:
+ if field.type in set(["uint", "uint/float", "address", "Pixel Format", "hex"]) | self.parser.enums:
convert = "__gen_unpack_uint"
elif field.type == "int":
convert = "__gen_unpack_sint"
print(' fprintf(fp, "%*s{}: 0x%" PRIx64 "\\n", indent, "", {});'.format(name, val))
elif field.type == "hex":
print(' fprintf(fp, "%*s{}: 0x%" PRIx32 "\\n", indent, "", {});'.format(name, val))
+ elif field.type in "Pixel Format":
+ print(' agx_pixel_format_print(fp, {});'.format(val))
elif field.type == "uint/float":
print(' fprintf(fp, "%*s{}: 0x%X (%f)\\n", indent, "", {}, uif({}));'.format(name, val, val))
else:
sizeof(struct agx_bo *) * count);
}
+#define AGX_TEXTURE_FORMAT(channels, type) \
+ ((AGX_CHANNELS_ ## channels) | ((AGX_TEXTURE_TYPE_ ## type) << 7))
+
/* Channels agree for RGBA but are weird for force 0/1 */
static enum agx_channel
agx_pack(so->desc->ptr.cpu, TEXTURE, cfg) {
assert(state->format == PIPE_FORMAT_B8G8R8A8_UNORM); // TODO: format table
cfg.layout = agx_translate_layout(rsrc->modifier);
- cfg.channels = AGX_CHANNELS_R8G8B8A8;
- cfg.type = AGX_TEXTURE_TYPE_UNORM;
+ cfg.format = AGX_TEXTURE_FORMAT(R8G8B8A8, UNORM);
cfg.swizzle_r = agx_channel_from_pipe(out_swizzle[0]);
cfg.swizzle_g = agx_channel_from_pipe(out_swizzle[1]);
cfg.swizzle_b = agx_channel_from_pipe(out_swizzle[2]);
agx_pack(ctx->render_target[i], RENDER_TARGET, cfg) {
assert(surf->format == PIPE_FORMAT_B8G8R8A8_UNORM); // TODO: format table
cfg.layout = agx_translate_layout(tex->modifier);
- cfg.channels = AGX_CHANNELS_R8G8B8A8;
- cfg.type = AGX_TEXTURE_TYPE_UNORM;
+ cfg.format = AGX_TEXTURE_FORMAT(R8G8B8A8, UNORM);
cfg.swizzle_r = AGX_CHANNEL_B;
cfg.swizzle_g = AGX_CHANNEL_G;
cfg.swizzle_b = AGX_CHANNEL_R;