//disasm declarations void ASMGen::Disasm(std::ostream& out, ShaderDecl const & dcl) { out << ShaderOpcodeName(dcl.opcode); switch (dcl.opcode) { case SO_DCL_GLOBAL_FLAGS: { bool first_flag = true; if (dcl.dcl_global_flags.allow_refactoring) { out << " refactoringAllowed"; first_flag = false; } if (dcl.dcl_global_flags.early_depth_stencil) { if (!first_flag) { out << " |"; } out << " forceEarlyDepthStencil"; first_flag = false; } if (dcl.dcl_global_flags.fp64) { if (!first_flag) { out << " |"; } out << " enableDoublePrecisionFloatOps"; first_flag = false; } if (dcl.dcl_global_flags.enable_raw_and_structured_in_non_cs) { if (!first_flag) { out << " |"; } out << " enableRawAndStructuredBuffers"; first_flag = false; } if (dcl.dcl_global_flags.skip_optimization) { if (!first_flag) { out << " |"; } out << " skipOptimization"; first_flag = false; } if (dcl.dcl_global_flags.enable_minimum_precision) { if (!first_flag) { out << " |"; } out << " enableMinimumPrecision"; first_flag = false; } if (dcl.dcl_global_flags.enable_raw_and_structured_in_non_cs) { if (!first_flag) { out << " |"; } out << " enableDoubleExtensions"; first_flag = false; } if (dcl.dcl_global_flags.enable_raw_and_structured_in_non_cs) { if (!first_flag) { out << " |"; } out << " enableShaderExtensions"; first_flag = false; } } break; case SO_DCL_INPUT_PS: case SO_DCL_INPUT_PS_SIV: case SO_DCL_INPUT_PS_SGV: out << ' ' << ShaderInterpolationModeName(dcl.dcl_input_ps.interpolation); break; case SO_DCL_TEMPS: out << ' ' << dcl.num; break; case SO_DCL_INDEXABLE_TEMP: dcl.op->type = SOT_INDEXABLE_TEMP; break; case SO_DCL_RESOURCE: out << "_" << ShaderResourceDimensionName(dcl.dcl_resource.target); if ((SRD_TEXTURE2DMS == dcl.dcl_resource.target) || (SRD_TEXTURE2DMSARRAY == dcl.dcl_resource.target)) { if (dcl.dcl_resource.nr_samples) { out << " (" << dcl.dcl_resource.nr_samples << ")"; } out << " (" << ShaderResourceReturnTypeName(dcl.rrt.x) << "," << ShaderResourceReturnTypeName(dcl.rrt.y) << "," << ShaderResourceReturnTypeName(dcl.rrt.z) << "," << ShaderResourceReturnTypeName(dcl.rrt.w) << ")"; } break; case SO_DCL_UNORDERED_ACCESS_VIEW_TYPED: out << "_" << ShaderResourceDimensionName(dcl.dcl_resource.target); out << " (" << ShaderResourceReturnTypeName(dcl.rrt.x) << "," << ShaderResourceReturnTypeName(dcl.rrt.y) << "," << ShaderResourceReturnTypeName(dcl.rrt.z) << "," << ShaderResourceReturnTypeName(dcl.rrt.w) << ")"; break; case SO_IMMEDIATE_CONSTANT_BUFFER: { float const * data = reinterpret_cast<float const *>(&dcl.data[0]); out << "{\n"; uint32_t vector_num = dcl.num / 4; for (uint32_t i = 0; i < vector_num; ++ i) { if (i != 0) { out << ",\n"; } out << "{"; for (int j = 0; j < 4; ++ j) { // Normalized float test if (ValidFloat(data[i * 4 + j])) { out << data[i * 4 + j]; } else { out << *reinterpret_cast<int const *>(&data[i * 4 + j]); } if (j != 3) { out << ","; } } out << "}"; } out << "\n}\n"; } break; default: break; } if (dcl.op) { out << ' '; this->Disasm(out, *dcl.op, GetOpInType(dcl.opcode)); } switch (dcl.opcode) { case SO_DCL_INDEX_RANGE: out << ' ' << dcl.num; break; case SO_DCL_INDEXABLE_TEMP: out << dcl.op->indices[0].disp << "[" << dcl.indexable_temp.num << "]" << ", " << dcl.indexable_temp.comps; break; case SO_DCL_CONSTANT_BUFFER: out << ", " << (dcl.dcl_constant_buffer.dynamic ? "dynamicIndexed" : "immediateIndexed"); break; case SO_DCL_INPUT_SIV: case SO_DCL_INPUT_SGV: case SO_DCL_OUTPUT_SIV: case SO_DCL_OUTPUT_SGV: case SO_DCL_INPUT_PS_SIV: case SO_DCL_INPUT_PS_SGV: out << ", " << ShaderSystemValueName(static_cast<ShaderSystemValue>(dcl.num)); break; case SO_DCL_SAMPLER: //out<<", "<<dcl.dcl_sampler. if (dcl.dcl_sampler.mono) { out << ", mode_mono"; } else if (dcl.dcl_sampler.shadow) { out << ", mode_comparison"; } else { out << ", mode_default"; } break; case SO_DCL_GS_INPUT_PRIMITIVE: out << ' ' << ShaderPrimitiveName(dcl.dcl_gs_input_primitive.primitive); break; case SO_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY: out << ' ' << ShaderPrimitiveTopologyName(dcl.dcl_gs_output_primitive_topology.primitive_topology); break; case SO_DCL_MAX_OUTPUT_VERTEX_COUNT: case SO_DCL_GS_INSTANCE_COUNT: out << ' ' << dcl.num; break; case SO_DCL_INPUT_CONTROL_POINT_COUNT: out << ' ' << dcl.dcl_input_control_point_count.control_points; break; case SO_DCL_OUTPUT_CONTROL_POINT_COUNT: out << ' ' << dcl.dcl_output_control_point_count.control_points; break; case SO_DCL_TESS_DOMAIN: out << ' ' << ShaderTessellatorDomainName(dcl.dcl_tess_domain.domain); break; case SO_DCL_TESS_PARTITIONING: out << ' ' << ShaderTessellatorPartitioningName(dcl.dcl_tess_partitioning.partitioning); break; case SO_DCL_TESS_OUTPUT_PRIMITIVE: out << ' ' << ShaderTessellatorOutputPrimitiveName(dcl.dcl_tess_output_primitive.primitive); break; case SO_DCL_HS_MAX_TESSFACTOR: out << ' ' << dcl.f32; break; case SO_DCL_HS_FORK_PHASE_INSTANCE_COUNT: out << ' ' << dcl.num; break; case SO_DCL_RESOURCE_STRUCTURED: case SO_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED: out << ' ' << dcl.structured.stride; break; case SO_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED: out << ' ' << dcl.structured.stride << ' ' << dcl.structured.count; break; case SO_DCL_THREAD_GROUP: out << ' ' << dcl.thread_group_size[0] << ',' << dcl.thread_group_size[1] << ',' << dcl.thread_group_size[2]; break; default: break; } }
int main(int argc, char** argv) { if (argc < 2) { usage(); return 1; } std::vector<char> data; std::ifstream in(argv[1], std::ios_base::in | std::ios_base::binary); std::ofstream out; bool screen_only = false; if (argc < 3) { screen_only = true; } else { out.open(argv[2]); } char c; in >> std::noskipws; while (in >> c) { data.push_back(c); } in.close(); try { DXBC2GLSL::DXBC2GLSL dxbc2glsl; dxbc2glsl.FeedDXBC(&data[0], true, true, STP_Fractional_Odd, STOP_Triangle_CW, GSV_430); std::string glsl = dxbc2glsl.GLSLString(); if (!screen_only) { out << glsl; } std::cout << glsl << std::endl; if (dxbc2glsl.NumInputParams() > 0) { std::cout << "Input:" << std::endl; for (uint32_t i = 0; i < dxbc2glsl.NumInputParams(); ++ i) { std::cout << "\t" << dxbc2glsl.InputParam(i).semantic_name << dxbc2glsl.InputParam(i).semantic_index << std::endl; } std::cout << std::endl; } if (dxbc2glsl.NumOutputParams() > 0) { std::cout << "Output:" << std::endl; for (uint32_t i = 0; i < dxbc2glsl.NumOutputParams(); ++ i) { std::cout << "\t" << dxbc2glsl.OutputParam(i).semantic_name << dxbc2glsl.OutputParam(i).semantic_index << std::endl; } std::cout << std::endl; } for (uint32_t i = 0; i < dxbc2glsl.NumCBuffers(); ++ i) { std::cout << "CBuffer " << i << ":" << std::endl; for (uint32_t j = 0; j < dxbc2glsl.NumVariables(i); ++ j) { std::cout << "\t" << dxbc2glsl.VariableName(i, j) << ' ' << (dxbc2glsl.VariableUsed(i, j) ? "USED" : "UNUSED"); std::cout << std::endl; } std::cout << std::endl; } if (dxbc2glsl.NumResources() > 0) { std::cout << "Resource:" << std::endl; for (uint32_t i = 0; i < dxbc2glsl.NumResources(); ++ i) { std::cout << "\t" << dxbc2glsl.ResourceName(i) << " : " << dxbc2glsl.ResourceBindPoint(i) << ' ' << (dxbc2glsl.ResourceUsed(i) ? "USED" : "UNUSED"); std::cout << std::endl; } std::cout << std::endl; } if (dxbc2glsl.GSInputPrimitive() != SP_Undefined) { std::cout << "GS input primitive: " << ShaderPrimitiveName(dxbc2glsl.GSInputPrimitive()) << std::endl; std::cout << "GS output:" << std::endl; for (uint32_t i = 0; i < dxbc2glsl.NumGSOutputTopology(); ++ i) { std::cout << "\t" << ShaderPrimitiveTopologyName(dxbc2glsl.GSOutputTopology(i)) << std::endl; } std::cout << "Max GS output vertex " << dxbc2glsl.MaxGSOutputVertex() << std::endl << std::endl; } } catch (std::exception& ex) { std::cout << "Error(s) in conversion:" << std::endl; std::cout << ex.what() << std::endl; std::cout << "Please send this information and your bytecode file to webmaster at klayge.org. We'll fix this ASAP." << std::endl; } }