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();
    }
  }
}
Exemple #2
0
//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 << '|';
	}
}
Exemple #3
0
//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;
	}
}