void GX2DebugDumpTexture(const GX2Texture *texture) { if (!config::gx2::dump_textures) { return; } createDumpDirectory(); // Write text dump of GX2Texture structure to texture_X.txt auto filename = "texture_" + GX2PointerAsString(texture); if (platform::fileExists("dump/" + filename + ".txt")) { return; } auto file = std::ofstream { "dump/" + filename + ".txt", std::ofstream::out }; auto format = fmt::MemoryWriter {}; format << "surface.dim = " << GX2EnumAsString(texture->surface.dim) << '\n' << "surface.width = " << texture->surface.width << '\n' << "surface.height = " << texture->surface.height << '\n' << "surface.depth = " << texture->surface.depth << '\n' << "surface.mipLevels = " << texture->surface.mipLevels << '\n' << "surface.format = " << GX2EnumAsString(texture->surface.format) << '\n' << "surface.aa = " << GX2EnumAsString(texture->surface.aa) << '\n' << "surface.use = " << GX2EnumAsString(texture->surface.use) << '\n' << "surface.resourceFlags = " << texture->surface.resourceFlags << '\n' << "surface.imageSize = " << texture->surface.imageSize << '\n' << "surface.image = " << GX2PointerAsString(texture->surface.image) << '\n' << "surface.mipmapSize = " << texture->surface.mipmapSize << '\n' << "surface.mipmaps = " << GX2PointerAsString(texture->surface.mipmaps) << '\n' << "surface.tileMode = " << GX2EnumAsString(texture->surface.tileMode) << '\n' << "surface.swizzle = " << texture->surface.swizzle << '\n' << "surface.alignment = " << texture->surface.alignment << '\n' << "surface.pitch = " << texture->surface.pitch << '\n' << "viewFirstMip = " << texture->viewFirstMip << '\n' << "viewNumMips = " << texture->viewNumMips << '\n' << "viewFirstSlice = " << texture->viewFirstSlice << '\n' << "viewNumSlices = " << texture->viewNumSlices << '\n'; file << format.str(); if (!texture->surface.image || !texture->surface.imageSize) { return; } // Write GTX GX2DebugDumpGTX(texture); }
static void formatSamplerVars(fmt::MemoryWriter &out, uint32_t count, GX2SamplerVar *vars) { out << " samplerVarCount: " << count << "\n"; for (auto i = 0u; i < count; ++i) { out << " Var " << i << "\n" << " name: " << vars[i].name.get() << "\n" << " type: " << GX2EnumAsString(vars[i].type) << "\n" << " location: " << vars[i].location << "\n"; } }
static void formatUniformVars(fmt::MemoryWriter &out, uint32_t count, GX2UniformVar *vars) { out << " uniformVarCount: " << count << "\n"; for (auto i = 0u; i < count; ++i) { out << " Var " << i << "\n" << " name: " << vars[i].name.get() << "\n" << " type: " << GX2EnumAsString(vars[i].type) << "\n" << " count: " << vars[i].count << "\n" << " offset: " << vars[i].offset << "\n" << " block: " << vars[i].block << "\n"; } }
void GX2DebugDumpShader(GX2VertexShader *shader) { if (!config::gx2::dump_shaders) { return; } fmt::MemoryWriter out; out << "GX2VertexShader:\n" << " size: " << shader->size << "\n" << " mode: " << GX2EnumAsString(shader->mode) << "\n"; formatUniformBlocks(out, shader->uniformBlockCount, shader->uniformBlocks); formatUniformVars(out, shader->uniformVarCount, shader->uniformVars); formatSamplerVars(out, shader->samplerVarCount, shader->samplerVars); out << " initialValueCount: " << shader->initialValueCount << "\n"; out << " loopVarCount: " << shader->loopVarCount << "\n"; GX2DebugDumpShader("shader_vertex_" + GX2PointerAsString(shader), out.str(), shader->data, shader->size); }
if (!file.read(filename)) { return false; } // TODO: Before we can print full shader info we must do pointer fixup in GFD::read OutputState out; for (auto &block : file.blocks) { switch (block.header.type) { case gfd::BlockType::VertexShaderHeader: startGroup(out, "VertexShaderHeader"); { auto shader = reinterpret_cast<GX2VertexShader *>(block.data.data()); writeField(out, "index", block.header.index); writeField(out, "size", shader->size); writeField(out, "mode", GX2EnumAsString(shader->mode)); writeField(out, "uniformBlocks", shader->uniformBlockCount); writeField(out, "uniformVars", shader->uniformVarCount); writeField(out, "initVars", shader->initialValueCount); writeField(out, "loopVars", shader->loopVarCount); writeField(out, "samplerVars", shader->samplerVarCount); writeField(out, "attribVars", shader->attribVarCount); writeField(out, "ringItemsize", shader->ringItemsize); writeField(out, "hasStreamOut", shader->hasStreamOut); startGroup(out, "SQ_PGM_RESOURCES_VS"); { auto sq_pgm_resources_vs = shader->regs.sq_pgm_resources_vs.value(); writeField(out, "NUM_GPRS", sq_pgm_resources_vs.NUM_GPRS); writeField(out, "STACK_SIZE", sq_pgm_resources_vs.STACK_SIZE); writeField(out, "DX10_CLAMP", sq_pgm_resources_vs.DX10_CLAMP);