fix(shader): serialize the pixel layer export flag from request version 23

main allocates request version 22 to the tessellation patches per group, so a version 22 request has no layer export byte.
This commit is contained in:
TideOPL 2026-10-13 15:23:21 +01:00
parent 7015c0443e
commit de5279bc0c
2 changed files with 8 additions and 8 deletions

View File

@ -1844,14 +1844,14 @@ void verifyPixelRequestSerialization() {
minimal.context.pixel->rasterPrimitive = RasterPrimitive::Rectangle;
minimal.context.pixel->layerExported = true;
const auto encoded = serializer.Serialize(minimal);
require(requestPrefix(encoded, 8u) == "NVNQQRYAAAA=", "new requests did not use serialization version 22");
require(requestPrefix(encoded, 8u) == "NVNQQRcAAAA=", "new requests did not use serialization version 23");
require(serializer.Deserialize(encoded).request.context.pixel->rasterPrimitive == RasterPrimitive::Rectangle, "the pixel primitive class did not round-trip");
require(serializer.Deserialize(encoded).request.context.pixel->layerExported, "the pixel layer export did not round-trip");
constexpr std::size_t mappingOffset = 8u + 37u + 18u + 163u;
for (std::size_t bytes = 0; bytes < 22u; ++bytes) {
expectFailure([&] { static_cast<void>(serializer.Deserialize(requestPrefix(encoded, mappingOffset + bytes))); }, "truncated data", "a truncated pixel mapping, packing, dual-source, alpha-to-coverage, stencil reference export flag, primitive class or layer export flag was accepted");
}
for (const auto unsupported : {"NVNQQQAAAAA=", "NVNQQRcAAAA="}) {
for (const auto unsupported : {"NVNQQQAAAAA=", "NVNQQRgAAAA="}) {
expectFailure([&] { static_cast<void>(serializer.Deserialize(unsupported)); }, "serialization version", "an unsupported request version was accepted");
}
static constexpr std::string_view version18Request{
@ -1970,11 +1970,11 @@ void verifyVertexInfoVersion19() {
while (flagOffset < legacyPixel.size() && legacyPixel[flagOffset] == exportedBytes[flagOffset]) ++flagOffset;
require(flagOffset < legacyPixel.size(), "the pixel layer export flag is not serialized");
legacyPixel.erase(legacyPixel.begin() + static_cast<std::ptrdiff_t>(flagOffset));
for (const auto version : {19u, 20u, 21u}) {
for (const auto version : {19u, 20u, 21u, 22u}) {
legacyPixel[4] = static_cast<std::uint8_t>(version);
const auto replayPixel = serializer.Deserialize(encodeBase64(legacyPixel));
require(replayPixel.request.context.pixel.has_value() && replayPixel.request.context.pixel->rasterPrimitive == RasterPrimitive::Rectangle && !replayPixel.request.context.pixel->layerExported, "a main version 19 to 21 request lost its pixel primitive class or read a layer export flag");
require(serializer.Serialize(replayPixel.request) == encodedPixel, "a main version 19 to 21 request misread the fields after its pixel primitive class");
require(replayPixel.request.context.pixel.has_value() && replayPixel.request.context.pixel->rasterPrimitive == RasterPrimitive::Rectangle && !replayPixel.request.context.pixel->layerExported, "a main version 19 to 22 request lost its pixel primitive class or read a layer export flag");
require(serializer.Serialize(replayPixel.request) == encodedPixel, "a main version 19 to 22 request misread the fields after its pixel primitive class");
}
}

View File

@ -386,7 +386,7 @@ ShaderPixelStageInfo readPixelInfo(Reader& reader, std::uint32_t version) {
if (version >= 16u) info.alphaToCoverage = reader.ReadBool();
if (version >= 17u) info.stencilRefExportEnable = reader.ReadBool();
if (version >= 19u) info.rasterPrimitive = readRasterPrimitive(reader);
if (version >= 22u) info.layerExported = reader.ReadBool();
if (version >= 23u) info.layerExported = reader.ReadBool();
if (version < 5u) {
const auto input = [](PixelInput value, bool present) { return present ? PixelInputBit(value) : 0u; };
info.inputAddr = input(PixelInput::PerspectiveSample, info.hasPerspectiveCenterVgpr && inputAddrOrCenterVgpr == 2u) | input(PixelInput::PerspectiveCenter, info.hasPerspectiveCenterVgpr) |
@ -752,7 +752,7 @@ std::string RequestSerializer::Serialize(const RecompileRequest& request) const
std::string buffer;
Writer writer(buffer);
writer.WriteU32(0x41505335u);
writer.WriteU32(22u);
writer.WriteU32(23u);
writeShaderBinary(writer, request.shader);
writeGuestContext(writer, request.context);
writeSpirvTarget(writer, request.target);
@ -784,7 +784,7 @@ DeserializedRequest RequestSerializer::Deserialize(std::string_view text) const
Reader reader(decoded);
if (reader.ReadU32() != 0x41505335u) throw std::runtime_error("invalid recompile request signature");
const auto version = reader.ReadU32();
if (version < 1u || version > 22u) throw std::runtime_error("unsupported recompile request serialization version");
if (version < 1u || version > 23u) throw std::runtime_error("unsupported recompile request serialization version");
DeserializedRequest result{};
result.request.shader = readShaderBinary(reader, result.shaderCode, result.shaderHeader);
result.request.context = readGuestContext(reader, result, version);