Special case D3D12 dlls in xml codec as well rather than dumping as hex

This commit is contained in:
baldurk
2023-03-08 15:04:40 +00:00
parent 760bfdcb40
commit e74144670d
+100 -33
View File
@@ -43,6 +43,35 @@ static const char *typeNames[] = {
"uint", "int", "float", "bool", "char", "ResourceId",
};
struct LiteralFileSection
{
SectionType type;
rdcstr filename;
rdcstr chunkName;
};
static const LiteralFileSection literalFileSections[] = {
{SectionType::EmbeddedLogfile, "diagnostic.log", "diagnostic_log"},
{SectionType::D3D12Core, "D3D12Core.dll", "d3d12core"},
{SectionType::D3D12SDKLayers, "D3D12SDKLayers.dll", "d3d12sdklayers"},
};
static bool isLiteralFileChunkName(const rdcstr &chunkName)
{
for(const LiteralFileSection &section : literalFileSections)
if(chunkName == section.chunkName)
return true;
return false;
}
static bool isLiteralFileFileName(const rdcstr &filename)
{
for(const LiteralFileSection &section : literalFileSections)
if(filename == section.filename)
return true;
return false;
}
template <typename inttype>
rdcstr GetBufferName(inttype i)
{
@@ -368,13 +397,24 @@ static RDResult Structured2XML(const rdcstr &filename, const RDCFile &file, uint
delete reader;
continue;
}
else if(props.type == SectionType::EmbeddedLogfile)
else
{
pugi::xml_node xLogfile = xRoot.append_child("diagnostic_log");
xLogfile.text() = "diagnostic.log";
bool literalSection = false;
delete reader;
continue;
for(const LiteralFileSection &section : literalFileSections)
{
if(section.type == props.type)
{
pugi::xml_node xFile = xRoot.append_child(section.chunkName.c_str());
xFile.text() = section.filename.c_str();
delete reader;
literalSection = true;
}
}
if(literalSection)
continue;
}
pugi::xml_node xSection = xRoot.append_child("section");
@@ -578,7 +618,8 @@ static SDObject *XML2Obj(pugi::xml_node &obj)
}
static RDResult XML2Structured(const rdcstr &xml, const ThumbTypeAndData &thumb,
const ThumbTypeAndData &extThumb, const bytebuf &logfile,
const ThumbTypeAndData &extThumb,
const std::map<SectionType, bytebuf> &literalFiles,
const StructuredBufferList &buffers, RDCFile *rdc, uint64_t &version,
StructuredChunkList &chunks, RENDERDOC_ProgressCallback progress)
{
@@ -659,7 +700,7 @@ static RDResult XML2Structured(const rdcstr &xml, const ThumbTypeAndData &thumb,
pugi::xml_node xSection = xHeader.next_sibling();
while(!strcmp(xSection.name(), "section") || !strcmp(xSection.name(), "extended_thumbnail") ||
!strcmp(xSection.name(), "diagnostic_log"))
isLiteralFileChunkName(xSection.name()))
{
if(!strcmp(xSection.name(), "extended_thumbnail"))
{
@@ -683,21 +724,36 @@ static RDResult XML2Structured(const rdcstr &xml, const ThumbTypeAndData &thumb,
xSection = xSection.next_sibling();
continue;
}
else if(!strcmp(xSection.name(), "diagnostic_log"))
else
{
SectionProperties props = {};
props.type = SectionType::EmbeddedLogfile;
props.version = 1;
props.flags = SectionFlags::LZ4Compressed;
bool literalSection = false;
StreamWriter *w = rdc->WriteSection(props);
w->Write(logfile.data(), logfile.size());
w->Finish();
for(const LiteralFileSection &section : literalFileSections)
{
if(section.chunkName == xSection.name())
{
auto litIt = literalFiles.find(section.type);
if(litIt != literalFiles.end())
{
SectionProperties props = {};
props.type = section.type;
props.version = 1;
props.flags = SectionFlags::LZ4Compressed;
delete w;
StreamWriter *w = rdc->WriteSection(props);
w->Write(litIt->second.data(), litIt->second.size());
w->Finish();
xSection = xSection.next_sibling();
continue;
delete w;
xSection = xSection.next_sibling();
literalSection = true;
}
}
}
if(literalSection)
continue;
}
SectionProperties props;
@@ -918,18 +974,25 @@ static RDResult Buffers2ZIP(const rdcstr &filename, const RDCFile &file,
delete reader;
continue;
}
else if(props.type == SectionType::EmbeddedLogfile)
else
{
StreamReader *reader = file.ReadSection(i);
for(const LiteralFileSection &section : literalFileSections)
{
if(section.type == props.type)
{
StreamReader *reader = file.ReadSection(i);
bytebuf log;
log.resize((size_t)reader->GetSize());
reader->Read(log.data(), log.size());
bytebuf literalFile;
literalFile.resize((size_t)reader->GetSize());
reader->Read(literalFile.data(), literalFile.size());
mz_zip_writer_add_mem(&zip, "diagnostic.log", log.data(), log.size(), MZ_BEST_SPEED);
mz_zip_writer_add_mem(&zip, section.filename.c_str(), literalFile.data(),
literalFile.size(), MZ_BEST_SPEED);
delete reader;
continue;
delete reader;
break;
}
}
}
}
@@ -940,7 +1003,7 @@ static RDResult Buffers2ZIP(const rdcstr &filename, const RDCFile &file,
}
static RDResult ZIP2Buffers(const rdcstr &filename, ThumbTypeAndData &thumb,
ThumbTypeAndData &extThumb, bytebuf &logfile,
ThumbTypeAndData &extThumb, std::map<SectionType, bytebuf> &literalFiles,
StructuredBufferList &buffers, RENDERDOC_ProgressCallback progress)
{
rdcstr zipFile = strip_extension(filename);
@@ -991,10 +1054,14 @@ static RDResult ZIP2Buffers(const rdcstr &filename, ThumbTypeAndData &thumb,
thumb.data.assign(buf, sz);
}
}
else if(strstr(zstat.m_filename, "diagnostic.log"))
else if(isLiteralFileFileName(zstat.m_filename))
{
// same for logfile
logfile.assign(buf, sz);
// same for literal files (log file, D3D12 dlls, etc)
for(const LiteralFileSection &section : literalFileSections)
{
if(section.filename == zstat.m_filename)
literalFiles[section.type].assign(buf, sz);
}
}
else
{
@@ -1023,10 +1090,10 @@ RDResult importXMLZ(const rdcstr &filename, StreamReader &reader, RDCFile *rdc,
RENDERDOC_ProgressCallback progress)
{
ThumbTypeAndData thumb, extThumb;
bytebuf logfile;
std::map<SectionType, bytebuf> literalFiles;
if(!filename.empty())
{
RDResult res = ZIP2Buffers(filename, thumb, extThumb, logfile, structData.buffers, progress);
RDResult res = ZIP2Buffers(filename, thumb, extThumb, literalFiles, structData.buffers, progress);
if(res != ResultCode::Succeeded)
return res;
}
@@ -1035,7 +1102,7 @@ RDResult importXMLZ(const rdcstr &filename, StreamReader &reader, RDCFile *rdc,
buf.resize((size_t)reader.GetSize());
reader.Read(buf.data(), buf.size());
return XML2Structured(buf.c_str(), thumb, extThumb, logfile, structData.buffers, rdc,
return XML2Structured(buf.c_str(), thumb, extThumb, literalFiles, structData.buffers, rdc,
structData.version, structData.chunks, progress);
}