Fixed DescribePixelFormatPFD

When using the PFD codepath, we now call DescribePixelFormat to retrieve
an exact interpretation of the pixel format selected by the driver.
This commit is contained in:
Stefanos A. 2013-12-21 23:35:55 +01:00
parent 1723be8a8b
commit 956bbe6491

View file

@ -191,7 +191,7 @@ namespace OpenTK.Platform.Windows
#region ChoosePixelFormatPFD #region ChoosePixelFormatPFD
GraphicsMode ChoosePixelFormatPFD(IntPtr Device, GraphicsMode mode, AccelerationType requested_acceleration_type) GraphicsMode ChoosePixelFormatPFD(IntPtr device, GraphicsMode mode, AccelerationType requested_acceleration_type)
{ {
PixelFormatDescriptor pfd = new PixelFormatDescriptor(); PixelFormatDescriptor pfd = new PixelFormatDescriptor();
pfd.Size = (short)BlittableValueType<PixelFormatDescriptor>.Stride; pfd.Size = (short)BlittableValueType<PixelFormatDescriptor>.Stride;
@ -209,6 +209,10 @@ namespace OpenTK.Platform.Windows
{ {
pfd.DepthBits = (byte)mode.Depth; pfd.DepthBits = (byte)mode.Depth;
} }
else
{
pfd.Flags |= PixelFormatDescriptorFlags.DEPTH_DONTCARE;
}
if (mode.Stencil > 0) if (mode.Stencil > 0)
{ {
@ -224,10 +228,14 @@ namespace OpenTK.Platform.Windows
pfd.AccumBits = (byte)mode.AccumulatorFormat.BitsPerPixel; pfd.AccumBits = (byte)mode.AccumulatorFormat.BitsPerPixel;
} }
if (mode.Buffers > 0) if (mode.Buffers > 1)
{ {
pfd.Flags |= PixelFormatDescriptorFlags.DOUBLEBUFFER; pfd.Flags |= PixelFormatDescriptorFlags.DOUBLEBUFFER;
} }
else if (mode.Buffers == 0)
{
pfd.Flags |= PixelFormatDescriptorFlags.DOUBLEBUFFER_DONTCARE;
}
if (mode.Stereo) if (mode.Stereo)
{ {
@ -242,7 +250,7 @@ namespace OpenTK.Platform.Windows
} }
GraphicsMode created_mode = null; GraphicsMode created_mode = null;
int pixelformat = Functions.ChoosePixelFormat(Device, ref pfd); int pixelformat = Functions.ChoosePixelFormat(device, ref pfd);
if (pixelformat > 0) if (pixelformat > 0)
{ {
AccelerationType acceleration_type = AccelerationType.ICD; AccelerationType acceleration_type = AccelerationType.ICD;
@ -260,7 +268,7 @@ namespace OpenTK.Platform.Windows
if (acceleration_type == requested_acceleration_type) if (acceleration_type == requested_acceleration_type)
{ {
created_mode = DescribePixelFormatPFD(ref pfd, pixelformat); created_mode = DescribePixelFormatPFD(device, ref pfd, pixelformat);
} }
} }
return created_mode; return created_mode;
@ -270,18 +278,23 @@ namespace OpenTK.Platform.Windows
#region DescribePixelFormatPFD #region DescribePixelFormatPFD
static GraphicsMode DescribePixelFormatPFD(ref PixelFormatDescriptor pfd, int pixelformat) static GraphicsMode DescribePixelFormatPFD(IntPtr device, ref PixelFormatDescriptor pfd, int pixelformat)
{ {
return new GraphicsMode( GraphicsMode created_mode = null;
if (Functions.DescribePixelFormat(device, pixelformat, pfd.Size, ref pfd) > 0)
{
created_mode = new GraphicsMode(
new IntPtr(pixelformat), new IntPtr(pixelformat),
new ColorFormat(pfd.RedBits, pfd.GreenBits, pfd.BlueBits, pfd.AlphaBits), new ColorFormat(pfd.RedBits, pfd.GreenBits, pfd.BlueBits, pfd.AlphaBits),
pfd.DepthBits, pfd.DepthBits,
pfd.StencilBits, pfd.StencilBits,
0, // MSAA not supported 0, // MSAA not supported when using PixelFormatDescriptor
new ColorFormat(pfd.AccumRedBits, pfd.AccumGreenBits, pfd.AccumBlueBits, pfd.AccumAlphaBits), new ColorFormat(pfd.AccumRedBits, pfd.AccumGreenBits, pfd.AccumBlueBits, pfd.AccumAlphaBits),
(pfd.Flags & PixelFormatDescriptorFlags.DOUBLEBUFFER) != 0 ? 2 : 1, (pfd.Flags & PixelFormatDescriptorFlags.DOUBLEBUFFER) != 0 ? 2 : 1,
(pfd.Flags & PixelFormatDescriptorFlags.STEREO) != 0); (pfd.Flags & PixelFormatDescriptorFlags.STEREO) != 0);
} }
return created_mode;
}
#endregion #endregion