Example #1
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;
	}
}
Example #2
0
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;
	}
}