예제 #1
0
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);
}
예제 #2
0
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";
   }
}
예제 #3
0
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";
   }
}
예제 #4
0
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);
}
예제 #5
0
파일: gfdtool.cpp 프로젝트: Subv/decaf-emu
   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);