static void ShowParamFull(void) { if (GetParamDevice(iwPrm) == 0) ShowLo(szNoParam); else { if (mpboEnblParams[iwPrm] == false) ShowLo(szBlocked); else { if (LoadParamsTim((wTIMES + iwHardTim - iwTim) % wTIMES) == true) { sprintf(szHi+12,"-%03u",iwTim); float fl = mpreParamsBuff[ PrevSoftTim() ][ iwPrm ]; if (ValidFloat(fl)) sprintf(szLo,"%12.3f", fl); else ShowLo(szEmpty); } else Error(); } } }
//disasm operands //有immediate32(l(a,b,c,d)) immediate64(d(a,b,c,d)) 变量名(r,v,o)这三种形式 void ASMGen::Disasm(std::ostream& out, ShaderOperand const & op, ShaderImmType imm_type) { if (op.neg) { out << '-'; } if (op.abs) { out << '|'; } if (SOT_IMMEDIATE32 == op.type)//l(a,b,c,d) { out << "l("; for (uint32_t i = 0; i < op.comps; ++ i) { if (i != 0) { out << ", "; } switch (imm_type) { case SIT_Float: // Normalized float test if (ValidFloat(op.imm_values[i].f32)) { out << op.imm_values[i].f32; } else { out << op.imm_values[i].i32; } break; case SIT_Int: out << op.imm_values[i].i32; break; case SIT_UInt: out << op.imm_values[i].u32; break; case SIT_Double: default: BOOST_ASSERT(false); break; } } out << ")"; } else if (SOT_IMMEDIATE64 == op.type)//d(a,b,c,d) { out << "d("; for (uint32_t i = 0; i < op.comps; ++ i) { if (i != 0) { out << ", "; } switch (imm_type) { case SIT_Float: case SIT_Int: case SIT_UInt: default: BOOST_ASSERT(false); break; case SIT_Double: out << op.imm_values[i].f64; break; } } out << ")"; } else//应该是类似v1 v2 o0 cb[1]的这种变量名形式 { bool naked = false; //判断naked是否为ture if (sm_dump_short_syntax)//这个值已经在本文件开头设置为true { switch (op.type) { case SOT_TEMP: case SOT_OUTPUT: case SOT_CONSTANT_BUFFER: case SOT_INDEXABLE_TEMP: case SOT_UNORDERED_ACCESS_VIEW: case SOT_THREAD_GROUP_SHARED_MEMORY: case SOT_RESOURCE: case SOT_SAMPLER: case SOT_STREAM: naked = true; break; default: naked = false; break; } } //输出变量名如r,v,o等 out << (sm_dump_short_syntax ? ShaderOperandTypeShortName(op.type) : ShaderOperandTypeName(op.type)); if (op.indices[0].reg) { naked = false;//naked为true代表indices[0]里面没有表达式形如r0[数字或表达式], //naked为false形如r[数字或表达式]。区别在于有没有常数后缀。 } //索引 for (uint32_t i = 0; i < op.num_indices; ++ i) { if (!naked || (i != 0))//第一层索引不需要[],如cb0[22]0为第一层,22是第二层才有[] { out << '['; } if (op.indices[i].reg) { this->Disasm(out, *op.indices[i].reg, imm_type); if (op.indices[i].disp) { out << '+' << op.indices[i].disp; } } else { out << op.indices[i].disp; } if (!naked || (i != 0)) { out << ']'; } } if (op.comps) { switch (op.mode) { case SOSM_MASK://xy,xyz,xyzw out << (sm_dump_short_syntax ? '.' : '!'); for (uint32_t i = 0; i < op.comps; ++ i) { if (op.mask & (1 << i)) { out << "xyzw"[i]; } } break; case SOSM_SWIZZLE://xxyy,xxxx out << '.'; for (uint32_t i = 0; i < op.comps; ++ i) { out << "xyzw"[op.swizzle[i]]; } break; case SOSM_SCALAR: out << (sm_dump_short_syntax ? '.' : ':'); out << "xyzw"[op.swizzle[0]]; break; default: BOOST_ASSERT(false); break; } } }//end else if (op.abs) { out << '|'; } }
//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; } }