/// <summary> /// Gets a single constant description in the constant table. /// </summary> /// <param name="effectHandle">The effect handle.</param> /// <returns>The constant description</returns> /// <unmanaged>HRESULT ID3DXConstantTable::GetConstantDesc([In] D3DXHANDLE hConstant,[Out, Buffer] D3DXCONSTANT_DESC* pConstantDesc,[InOut] unsigned int* pCount)</unmanaged> public ConstantDescription GetConstantDescription(SharpDX.Direct3D9.EffectHandle effectHandle) { int count = 1; var descriptions = new ConstantDescription[1]; GetConstantDescription(effectHandle, descriptions, ref count); return(descriptions[0]); }
/// <summary> /// Gets an array of constant descriptions in the constant table. /// </summary> /// <param name="effectHandle">The effect handle.</param> /// <returns>An array of constant descriptions</returns> /// <unmanaged>HRESULT ID3DXConstantTable::GetConstantDesc([In] D3DXHANDLE hConstant,[Out, Buffer] D3DXCONSTANT_DESC* pConstantDesc,[InOut] unsigned int* pCount)</unmanaged> public ConstantDescription[] GetConstantDescriptionArray(SharpDX.Direct3D9.EffectHandle effectHandle) { int count = 0; GetConstantDescription(effectHandle, null, ref count); var descriptions = new ConstantDescription[count]; GetConstantDescription(effectHandle, descriptions, ref count); return(descriptions); }
private ConstantTable SetupDevice(OpsContext context, ShadeArgs args) { string errStr = null; ConstantTable constantTable; GraphicsStream pshader; GraphicsStream vshader; try { ConstantTable dummyTable; errStr = null; vshader = ShaderLoader.CompileShader(ShadeVertex.VertexShader, "VertexShader", null, null, "vs_3_0", ShaderFlags.None, out errStr, out dummyTable); } finally { if (errStr != null && errStr.Length > 0) { OpsConsole.WriteLine("Vertex Shader Compiler messages: " + errStr); OpsConsole.WriteLine("If this message is regarding your entry point, it may be something other than the default 'main'. Please use the argument 'Shader' to specify it."); } } try { Macro dxopsMacro = new Macro(); dxopsMacro.Name = "__DXOPS"; dxopsMacro.Definition = "1"; errStr = null; pshader = ShaderLoader.CompileShaderFromFile(args.File, args.Shader, new Macro[] { dxopsMacro }, null, "ps_3_0", ShaderFlags.None, out errStr, out constantTable); } finally { if (errStr != null && errStr.Length > 0) { OpsConsole.WriteLine("Pixel Shader Compiler messages: " + errStr); OpsConsole.WriteLine("If this message is regarding your entry point, it may be something other than the default 'main'. Please use the argument 'Shader' to specify it."); } } context.Device.SetRenderState(RenderStates.CullMode, (int)Cull.None); context.Device.SetRenderState(RenderStates.FillMode, (int)FillMode.Solid); context.Device.SetRenderState(RenderStates.AlphaTestEnable, false); context.Device.SetRenderState(RenderStates.AlphaBlendEnable, false); context.Device.SetRenderState(RenderStates.StencilEnable, false); context.Device.SetRenderState(RenderStates.ZEnable, false); context.Device.SetRenderState(RenderStates.ZBufferWriteEnable, false); context.Device.DepthStencilSurface = null; VertexDeclaration decl = new VertexDeclaration(context.Device, ShadeVertex.VertexDeclaration); context.Device.VertexDeclaration = decl; VertexShader vs = new VertexShader(context.Device, vshader); context.Device.VertexShader = vs; PixelShader ps = new PixelShader(context.Device, pshader); context.Device.PixelShader = ps; constantTable.SetDefaults(context.Device); foreach (OpsParsedArgument constant in args.Constants) { EffectHandle h = constantTable.GetConstant(null, constant.Name); if (h == null) { OpsConsole.WriteLine("WARNING: Parameter '{0}' was not found in shader.", constant.Name); continue; } ConstantDescription[] cds = constantTable.GetConstantDescription(h, 1); ConstantDescription cd = cds[0]; switch (cd.Class) { case ParameterClass.Object: { //texture switch (cd.ParameterType) { case ParameterType.Texture: case ParameterType.Texture1D: case ParameterType.Texture2D: case ParameterType.Texture3D: case ParameterType.TextureCube: { OpsTexture container = context.GetTexture(constant.Value); int sampler = constantTable.GetSamplerIndex(h); context.Device.SetTexture(sampler, container.Texture); } break; } break; } case ParameterClass.Scalar: case ParameterClass.Vector: case ParameterClass.MatrixColumns: case ParameterClass.MatrixRows: { ArrayList floatList = new ArrayList(); string[] floatStrings = constant.Value.Split(new char[] { ' ', ',' }); foreach (string floatStr in floatStrings) { if (floatStr.Length > 0) { floatList.Add(float.Parse(floatStr)); } } float[] floats = (float[])floatList.ToArray(typeof(float)); constantTable.SetValue(context.Device, h, floats); } break; } } return(constantTable); }
protected void PopulateDef( ConstantDescription d3DDesc, GpuProgramParameters.GpuConstantDefinition def ) { def.ArraySize = d3DDesc.Elements; switch(d3DDesc.Type) { case ParameterType.Int: switch(d3DDesc.Columns) { case 1: def.ConstantType = GpuProgramParameters.GpuConstantType.Int1; break; case 2: def.ConstantType = GpuProgramParameters.GpuConstantType.Int2; break; case 3: def.ConstantType = GpuProgramParameters.GpuConstantType.Int3; break; case 4: def.ConstantType = GpuProgramParameters.GpuConstantType.Int4; break; } // columns break; case ParameterType.Float: switch(d3DDesc.Class) { case ParameterClass.MatrixColumns: case ParameterClass.MatrixRows: { var firstDim = d3DDesc.RegisterCount / d3DDesc.Elements; var secondDim = d3DDesc.Class == ParameterClass.MatrixRows ? d3DDesc.Columns : d3DDesc.Rows; switch(firstDim) { case 2: switch(secondDim) { case 2: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_2X2; def.ElementSize = 8; // HLSL always packs break; case 3: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_2X3; def.ElementSize = 8; // HLSL always packs break; case 4: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_2X4; def.ElementSize = 8; break; } // columns break; case 3: switch(secondDim) { case 2: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_3X2; def.ElementSize = 12; // HLSL always packs break; case 3: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_3X3; def.ElementSize = 12; // HLSL always packs break; case 4: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_3X4; def.ElementSize = 12; break; } // columns break; case 4: switch(secondDim) { case 2: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_4X2; def.ElementSize = 16; // HLSL always packs break; case 3: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_4X3; def.ElementSize = 16; // HLSL always packs break; case 4: def.ConstantType = GpuProgramParameters.GpuConstantType.Matrix_4X4; def.ElementSize = 16; break; } // secondDim break; } // firstDim } break; case ParameterClass.Scalar: case ParameterClass.Vector: switch(d3DDesc.Columns) { case 1: def.ConstantType = GpuProgramParameters.GpuConstantType.Float1; break; case 2: def.ConstantType = GpuProgramParameters.GpuConstantType.Float2; break; case 3: def.ConstantType = GpuProgramParameters.GpuConstantType.Float3; break; case 4: def.ConstantType = GpuProgramParameters.GpuConstantType.Float4; break; } // columns break; } break; default: // not mapping samplers, don't need to take the space break; }; // D3D9 pads to 4 elements def.ElementSize = GpuProgramParameters.GpuConstantDefinition.GetElementSize(def.ConstantType, true); }