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); }