예제 #1
0
        public RenderStateDesc_NativeInterop(ref RenderStateDesc desc)
        {
            renderPass   = ((RenderPass)desc.renderPass).handle;
            shaderEffect = ((ShaderEffect)desc.shaderEffect).handle;

            constantBufferCount = desc.constantBuffers.Length;
            constantBuffers     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * constantBufferCount);
            for (int i = 0; i != constantBufferCount; ++i)
            {
                constantBuffers[i] = ((ConstantBuffer)desc.constantBuffers[i]).handle;
            }

            textureCount = desc.textures.Length;
            textures     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * textureCount);
            for (int i = 0; i != textureCount; ++i)
            {
                textures[i] = desc.textures[i].GetHandle();
            }

            vertexBuffer         = ((VertexBuffer)desc.vertexBuffer).handle;
            vertexBufferTopology = desc.vertexBufferTopology;
            depthEnable          = (byte)(desc.depthEnable ? 1 : 0);
            stencilEnable        = (byte)(desc.stencilEnable ? 1 : 0);
            msaaLevel            = desc.msaaLevel;
        }
        public RenderStateDesc_NativeInterop(ref RenderStateDesc desc)
        {
            renderPass   = ((RenderPass)desc.renderPass).handle;
            shaderEffect = ((ShaderEffect)desc.shaderEffect).handle;

            if (desc.constantBuffers != null)
            {
                constantBufferCount = desc.constantBuffers.Length;
                constantBuffers     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * constantBufferCount);
                for (int i = 0; i != constantBufferCount; ++i)
                {
                    constantBuffers[i] = ((ConstantBuffer)desc.constantBuffers[i]).handle;
                }
            }
            else
            {
                constantBufferCount = 0;
                constantBuffers     = null;
            }

            if (desc.textures != null)
            {
                textureCount = desc.textures.Length;
                textures     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * textureCount);
                for (int i = 0; i != textureCount; ++i)
                {
                    textures[i] = desc.textures[i].GetHandle();
                }
            }
            else
            {
                textureCount = 0;
                textures     = null;
            }

            if (desc.textureDepthStencils != null)
            {
                textureDepthStencilCount = desc.textureDepthStencils.Length;
                textureDepthStencils     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * textureDepthStencilCount);
                for (int i = 0; i != textureDepthStencilCount; ++i)
                {
                    textureDepthStencils[i] = desc.textureDepthStencils[i].GetHandle();
                }
            }
            else
            {
                textureDepthStencilCount = 0;
                textureDepthStencils     = null;
            }

            if (desc.randomAccessBuffers != null)
            {
                randomAccessBufferCount = desc.randomAccessBuffers.Length;
                randomAccessBuffers     = (IntPtr *)Marshal.AllocHGlobal(Marshal.SizeOf <IntPtr>() * randomAccessBufferCount);
                randomAccessTypes       = (RandomAccessBufferType *)Marshal.AllocHGlobal(sizeof(RandomAccessBufferType) * randomAccessBufferCount);
                for (int i = 0; i != randomAccessBufferCount; ++i)
                {
                    var buffer = desc.randomAccessBuffers[i];
                    var type   = buffer.GetType();
                    if (typeof(Texture2DBase).IsAssignableFrom(type))
                    {
                        randomAccessBuffers[i] = ((Texture2DBase)buffer).GetHandle();
                        randomAccessTypes[i]   = RandomAccessBufferType.Texture;
                    }
                    else
                    {
                        throw new NotSupportedException("Unsupported ComputeShader random access buffer type: " + type.ToString());
                    }
                }
            }
            else
            {
                randomAccessBufferCount = 0;
                randomAccessBuffers     = null;
                randomAccessTypes       = null;
            }

            vertexBufferTopology = desc.vertexBufferTopology;
            vertexBufferStreamer = ((VertexBufferStreamer)desc.vertexBufferStreamer).handle;
            if (desc.indexBuffer != null)
            {
                indexBuffer = ((IndexBuffer)desc.indexBuffer).handle;
            }
            else
            {
                indexBuffer = IntPtr.Zero;
            }
            triangleCulling  = desc.triangleCulling;
            triangleFillMode = desc.triangleFillMode;
            blendDesc        = new BlendDesc_NativeInterop(ref desc.blendDesc);
            depthStencilDesc = new DepthStencilDesc_NativeInterop(ref desc.depthStencilDesc);
        }