058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/*
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Utility functions for the WineD3D Library
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2002-2004 Jason Edmeades
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2003-2004 Raphael Junqueira
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2004 Christian Costa
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2005 Oliver Stieber
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2006-2008 Henri Verbeet
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Copyright 2009-2010 Henri Verbeet for CodeWeavers
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * This library is free software; you can redistribute it and/or
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * modify it under the terms of the GNU Lesser General Public
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * License as published by the Free Software Foundation; either
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * version 2.1 of the License, or (at your option) any later version.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * This library is distributed in the hope that it will be useful,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * but WITHOUT ANY WARRANTY; without even the implied warranty of
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Lesser General Public License for more details.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * You should have received a copy of the GNU Lesser General Public
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * License along with this library; if not, write to the Free Software
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync/*
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * a choice of LGPL license versions is made available with the language indicating
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * that LGPLv2 or any later version may be used, or where a choice of which version
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync * of the LGPL is applied is otherwise unspecified.
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync */
4237d5a79f48789aacc67dc43378d2d7813a39f4vboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#include "config.h"
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#include "wine/port.h"
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#include <stdio.h>
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#include "wined3d_private.h"
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncWINE_DEFAULT_DEBUG_CHANNEL(d3d);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstruct wined3d_format_channels
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD red_size, green_size, blue_size, alpha_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD red_offset, green_offset, blue_offset, alpha_offset;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT bpp;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE depth_size, stencil_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const struct wined3d_format_channels formats[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* size offset
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * format id r g b a r g b a bpp depth stencil */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_UNKNOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* FourCC formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_UYVY, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YUY2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YV12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_MULTI2_ARGB8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_G8R8_G8B8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_B8G8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* IEEE formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_FLOAT, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_FLOAT, 32, 32, 0, 0, 0, 32, 0, 0, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_FLOAT, 32, 32, 32, 0, 0, 32, 64, 0, 12, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_FLOAT, 32, 32, 32, 32, 0, 32, 64, 96, 16, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Hmm? */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM_Cx, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Float */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_FLOAT, 16, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_FLOAT, 16, 16, 0, 0, 0, 16, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SINT, 16, 16, 0, 0, 0, 16, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_FLOAT, 16, 16, 16, 16, 0, 16, 32, 48, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_SINT, 16, 16, 16, 16, 0, 16, 32, 48, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Palettized formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_P8_UINT_A8_UNORM, 0, 0, 0, 8, 0, 0, 0, 8, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_P8_UINT, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Standard ARGB formats. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8_UNORM, 8, 8, 8, 0, 16, 8, 0, 0, 3, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8A8_UNORM, 8, 8, 8, 8, 16, 8, 0, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8X8_UNORM, 8, 8, 8, 0, 16, 8, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G6R5_UNORM, 5, 6, 5, 0, 11, 5, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5X1_UNORM, 5, 5, 5, 0, 10, 5, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5A1_UNORM, 5, 5, 5, 1, 10, 5, 0, 15, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4A4_UNORM, 4, 4, 4, 4, 8, 4, 0, 12, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B2G3R3_UNORM, 3, 3, 2, 0, 5, 2, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_A8_UNORM, 0, 0, 0, 8, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B2G3R3A8_UNORM, 3, 3, 2, 8, 5, 2, 0, 8, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4X4_UNORM, 4, 4, 4, 0, 8, 4, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_UNORM, 10, 10, 10, 2, 0, 10, 20, 30, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_UINT, 10, 10, 10, 2, 0, 10, 20, 30, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_SNORM, 10, 10, 10, 2, 0, 10, 20, 30, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UNORM, 8, 8, 8, 8, 0, 8, 16, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UINT, 8, 8, 8, 8, 0, 8, 16, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8X8_UNORM, 8, 8, 8, 0, 0, 8, 16, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_UNORM, 16, 16, 0, 0, 0, 16, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B10G10R10A2_UNORM, 10, 10, 10, 2, 20, 10, 0, 30, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_UNORM, 16, 16, 16, 16, 0, 16, 32, 48, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Luminance */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L8_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L8A8_UNORM, 0, 0, 0, 8, 0, 0, 0, 8, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L4A4_UNORM, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L16_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Bump mapping stuff */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM, 8, 8, 0, 0, 0, 8, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R5G5_SNORM_L6_UNORM, 5, 5, 0, 0, 0, 5, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, 8, 8, 0, 0, 0, 8, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_SNORM, 8, 8, 8, 8, 0, 8, 16, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SNORM, 16, 16, 0, 0, 0, 16, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G11B11_SNORM, 10, 11, 11, 0, 0, 10, 21, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10_SNORM_A2_UNORM, 10, 10, 10, 2, 0, 10, 20, 30, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Depth stencil formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D16_LOCKABLE, 0, 0, 0, 0, 0, 0, 0, 0, 2, 16, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D32_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 4, 32, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S1_UINT_D15_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 2, 15, 1},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D24_UNORM_S8_UINT, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 8},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_X8D24_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S4X4_UINT_D24_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 4},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D16_UNORM, 0, 0, 0, 0, 0, 0, 0, 0, 2, 16, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D32_FLOAT, 0, 0, 0, 0, 0, 0, 0, 0, 4, 32, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S8_UINT_D24_FLOAT, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 8},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_VERTEXDATA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_UINT, 16, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_UINT, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_UINT, 32, 32, 0, 0, 0, 32, 0, 0, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_UINT, 32, 32, 32, 0, 0, 32, 64, 0, 12, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_UINT, 32, 32, 32, 32, 0, 32, 64, 96, 16, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_SNORM, 16, 16, 16, 16, 0, 16, 32, 48, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Vendor-specific formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_ATI2N, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_NVDB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_INST, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_INTZ, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 8},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_RESZ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_NVHU, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_NVHS, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_NULL, 8, 8, 8, 8, 0, 8, 16, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Unsure about them, could not find a Windows driver that supports them */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16, 16, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_AL16, 0, 0, 0, 16, 0, 0, 0, 16, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Typeless */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8_TYPELESS, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_TYPELESS, 8, 8, 0, 0, 0, 8, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_TYPELESS, 8, 8, 8, 8, 0, 8, 16, 24, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_TYPELESS, 16, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_TYPELESS, 16, 16, 0, 0, 0, 16, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_TYPELESS, 16, 16, 16, 16, 0, 16, 32, 48, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_TYPELESS, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_TYPELESS, 32, 32, 0, 0, 0, 32, 0, 0, 8, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_TYPELESS, 32, 32, 32, 0, 0, 32, 64, 0, 12, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_TYPELESS, 32, 32, 32, 32, 0, 32, 64, 96, 16, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstruct wined3d_format_base_flags
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD flags;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* The ATI2N format behaves like an uncompressed format in LockRect(), but
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * still needs to use the correct block based calculation for e.g. the
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * resource size. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const struct wined3d_format_base_flags format_base_flags[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_P8_UINT, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4A4_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_BROKEN_PITCH},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D32_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S8_UINT_D24_FLOAT, WINED3DFMT_FLAG_FLOAT},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstruct wined3d_format_block_info
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT block_width;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT block_height;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT block_byte_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const struct wined3d_format_block_info format_block_info[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT1, 4, 4, 8},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT2, 4, 4, 16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT3, 4, 4, 16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT4, 4, 4, 16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT5, 4, 4, 16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_ATI2N, 4, 4, 16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YUY2, 2, 1, 4},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_UYVY, 2, 1, 4},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstruct wined3d_format_vertex_info
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_ffp_emit_idx emit_idx;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint component_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLenum gl_vtx_type;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_vtx_format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLboolean gl_normalized;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int component_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const struct wined3d_format_vertex_info format_vertex_info[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_FLOAT, WINED3D_FFP_EMIT_FLOAT1, 1, GL_FLOAT, 1, GL_FALSE, sizeof(float)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_FLOAT, WINED3D_FFP_EMIT_FLOAT2, 2, GL_FLOAT, 2, GL_FALSE, sizeof(float)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_FLOAT, WINED3D_FFP_EMIT_FLOAT3, 3, GL_FLOAT, 3, GL_FALSE, sizeof(float)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_FLOAT, WINED3D_FFP_EMIT_FLOAT4, 4, GL_FLOAT, 4, GL_FALSE, sizeof(float)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8A8_UNORM, WINED3D_FFP_EMIT_D3DCOLOR, 4, GL_UNSIGNED_BYTE, 4, GL_TRUE, sizeof(BYTE)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UINT, WINED3D_FFP_EMIT_UBYTE4, 4, GL_UNSIGNED_BYTE, 4, GL_FALSE, sizeof(BYTE)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SINT, WINED3D_FFP_EMIT_SHORT2, 2, GL_SHORT, 2, GL_FALSE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_SINT, WINED3D_FFP_EMIT_SHORT4, 4, GL_SHORT, 4, GL_FALSE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UNORM, WINED3D_FFP_EMIT_UBYTE4N, 4, GL_UNSIGNED_BYTE, 4, GL_TRUE, sizeof(BYTE)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SNORM, WINED3D_FFP_EMIT_SHORT2N, 2, GL_SHORT, 2, GL_TRUE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_SNORM, WINED3D_FFP_EMIT_SHORT4N, 4, GL_SHORT, 4, GL_TRUE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_UNORM, WINED3D_FFP_EMIT_USHORT2N, 2, GL_UNSIGNED_SHORT, 2, GL_TRUE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_UNORM, WINED3D_FFP_EMIT_USHORT4N, 4, GL_UNSIGNED_SHORT, 4, GL_TRUE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_UINT, WINED3D_FFP_EMIT_UDEC3, 3, GL_UNSIGNED_SHORT, 3, GL_FALSE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_SNORM, WINED3D_FFP_EMIT_DEC3N, 3, GL_SHORT, 3, GL_TRUE, sizeof(short int)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_FLOAT, WINED3D_FFP_EMIT_FLOAT16_2, 2, GL_FLOAT, 2, GL_FALSE, sizeof(GLhalfNV)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_FLOAT, WINED3D_FFP_EMIT_FLOAT16_4, 4, GL_FLOAT, 4, GL_FALSE, sizeof(GLhalfNV)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_UINT, WINED3D_FFP_EMIT_INVALID, 1, GL_UNSIGNED_INT, 1, GL_FALSE, sizeof(UINT)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_UINT, WINED3D_FFP_EMIT_INVALID, 2, GL_UNSIGNED_INT, 2, GL_FALSE, sizeof(UINT)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32_UINT, WINED3D_FFP_EMIT_INVALID, 3, GL_UNSIGNED_INT, 3, GL_FALSE, sizeof(UINT)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_UINT, WINED3D_FFP_EMIT_INVALID, 4, GL_UNSIGNED_INT, 4, GL_FALSE, sizeof(UINT)},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstruct wined3d_format_texture_info
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_srgb_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_rt_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint gl_type;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int conv_byte_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int flags;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_gl_extension extension;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_l4a4_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * format+type combination to load it. Thus convert it to A8L8, then load it
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * with A4L4 internal, but A8L8 format+type
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const unsigned char *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = pitch * 2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = src + y * pitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * outpitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ ) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* A */ Dest[1] = (color & 0xf0) << 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* L */ Dest[0] = (color & 0x0f) << 4;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const WORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned short *Dest_s = (unsigned short *) (dst + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const WORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char l = ((color >> 10) & 0xfc);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short v = ((color >> 5) & 0x3e);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short u = ((color ) & 0x1f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short v_conv = v + 16;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short u_conv = u + 16;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *Dest_s = ((v_conv << 11) & 0xf800) | ((l << 5) & 0x7e0) | (u_conv & 0x1f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest_s += 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const WORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = (pitch * 3)/2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* This makes the gl surface bigger(24 bit instead of 16), but it works with
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * fixed function and shaders without further conversion once the surface is
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * loaded
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const WORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * outpitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ ) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync short color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char l = ((color >> 10) & 0xfc);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char v = ((color >> 5) & 0x3e);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char u = ((color ) & 0x1f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * and doubles the positive range. Thus shift left only once, gl does the 2nd
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * shift. GL reads a signed value and converts it into an unsigned value.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* M */ Dest[2] = l << 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Those are read as signed, but kept signed. Just left-shift 3 times to scale
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * from 5 bit values to 8 bit values.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* V */ Dest[1] = v << 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* U */ Dest[0] = u << 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r8g8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const short *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = (pitch * 3)/2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const short *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * outpitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const short color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* B */ Dest[0] = 0xff;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* G */ Dest[1] = (color >> 8) + 128; /* V */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* R */ Dest[2] = (color & 0xff) + 128; /* U */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Doesn't work correctly with the fixed function pipeline, but can work in
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * shaders if the shader is adjusted. (There's no use for this format in gl's
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * standard fixed function pipeline anyway).
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * pitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync LONG color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* R */ Dest[2] = (color & 0xff) + 128; /* U */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 4;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* This implementation works with the fixed function pipeline and shaders
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * without further modification after converting the surface.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * pitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync LONG color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* U */ Dest[0] = (color & 0xff); /* U */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* I */ Dest[3] = 255; /* X */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 4;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned char *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = dst + y * pitch;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync LONG color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* R */ Dest[2] = (color & 0xff) + 128; /* U */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 4;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r16g16_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned short *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = (pitch * 3)/2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = (unsigned short *) (dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD color = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* B */ Dest[0] = 0xffff;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* G */ Dest[1] = (color >> 16) + 32768; /* V */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* R */ Dest[2] = (color & 0xffff) + 32768; /* U */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r16g16(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const WORD *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WORD *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = (pitch * 3)/2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const WORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = (WORD *) (dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WORD green = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WORD red = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[0] = green;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[1] = red;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Strictly speaking not correct for R16G16F, but it doesn't matter because the
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * shader overwrites it anyway
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[2] = 0xffff;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_r32g32_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const float *Source;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float *Dest;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = (pitch * 3)/2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(y = 0; y < height; y++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Source = (const float *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest = (float *) (dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; x++ )
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float green = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float red = (*Source++);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[0] = green;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[1] = red;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest[2] = 1.0f;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync Dest += 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_s1_uint_d15_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = pitch * 2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (y = 0; y < height; ++y)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const WORD *source = (const WORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD *dest = (DWORD *)(dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; ++x)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* The depth data is normalized, so needs to be scaled,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the stencil data isn't. Scale depth data by
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WORD d15 = source[x] >> 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD d24 = (d15 << 9) + (d15 >> 6);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync dest[x] = (d24 << 8) | (source[x] & 0x1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_s4x4_uint_d24_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (y = 0; y < height; ++y)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD *dest = (DWORD *)(dst + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; ++x)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Just need to clear out the X4 part. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync dest[x] = source[x] & ~0xf0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int x, y;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT outpitch = pitch * 2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (y = 0; y < height; ++y)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const DWORD *source = (const DWORD *)(src + y * pitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float *dest_f = (float *)(dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD *dest_s = (DWORD *)(dst + y * outpitch);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (x = 0; x < width; ++x)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync dest_s[x * 2 + 1] = source[x] & 0xff;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* The following formats explicitly don't have WINED3DFMT_FLAG_TEXTURE set:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * These are never supported on native.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_B8G8R8_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_B2G3R3_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_L4A4_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_S1_UINT_D15_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_S4X4_UINT_D24_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of ddraw.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Since it is not widely available, don't offer it. Further no Windows driver
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * offers WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_P8_UINT
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_P8_UINT_A8_UNORM
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * These formats seem to be similar to the HILO formats in
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * GL_NV_texture_shader. NVHU is said to be GL_UNSIGNED_HILO16,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * NVHS GL_SIGNED_HILO16. Rumours say that D3D computes a 3rd channel
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * similarly to D3DFMT_CxV8U8 (So NVHS could be called D3DFMT_CxV16U16). ATI
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * refused to support formats which can easily be emulated with pixel shaders,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * so applications have to deal with not having NVHS and NVHU.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_NVHU
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_NVHS */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const struct wined3d_format_texture_info format_texture_info[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* format id gl_internal gl_srgb_internal gl_rt_internal
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_format gl_type conv_byte_count
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync flags
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync extension convert */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* FourCC formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * d3d9 test however shows that the opposite is true. Since the extension is from 2002, it predates the x86 based
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Macs, so probably the endianness differs. This could be tested as soon as we have a Windows and MacOS on a big
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * endian machine
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync APPLE_YCBCR_422, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync APPLE_YCBCR_422, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_TEXTURE_COMPRESSION_S3TC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_TEXTURE_COMPRESSION_S3TC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_TEXTURE_COMPRESSION_S3TC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_TEXTURE_COMPRESSION_S3TC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_TEXTURE_COMPRESSION_S3TC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* IEEE formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RED, GL_FLOAT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RED, GL_FLOAT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_RG, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_FLOAT, 12,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, convert_r32g32_float},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RG, GL_FLOAT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_RG, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_FLOAT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Float */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RED, GL_HALF_FLOAT_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RED, GL_HALF_FLOAT_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_RG, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_HALF_FLOAT_ARB, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, convert_r16g16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RG, GL_HALF_FLOAT_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_RG, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_HALF_FLOAT_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_RENDERTARGET
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_FLOAT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Palettized formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_P8_UINT, GL_RGBA, GL_RGBA, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAGMENT_PROGRAM, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_P8_UINT, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_COLOR_INDEX, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_PALETTED_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Standard ARGB formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGR, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_VTF,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_RGB5, GL_RGB8,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5_A1, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_UNSIGNED_SHORT, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r16g16},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_UNORM, GL_RG16, GL_RG16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RG, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_RG, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Luminance */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_SRGB_READ,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_l4a4_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Bump mapping stuff */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGR, GL_UNSIGNED_BYTE, 3,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r8g8_snorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DSDT_NV, GL_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync NV_TEXTURE_SHADER, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r5g5_snorm_l6_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DSDT_MAG_NV, GL_BYTE, 3,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync NV_TEXTURE_SHADER, convert_r5g5_snorm_l6_unorm_nv},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r8g8_snorm_l8x8_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync NV_TEXTURE_SHADER, convert_r8g8_snorm_l8x8_unorm_nv},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_BYTE, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r8g8b8a8_snorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync NV_TEXTURE_SHADER, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGR, GL_UNSIGNED_SHORT, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, convert_r16g16_snorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_HILO_NV, GL_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_BUMPMAP,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync NV_TEXTURE_SHADER, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Depth stencil formats */
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3DFMT_FLAG_DEPTH,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {WINED3DFMT_D32_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3DFMT_FLAG_DEPTH,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D32_UNORM, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_PACKED_DEPTH_STENCIL, convert_s1_uint_d15_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAMEBUFFER_OBJECT, convert_s1_uint_d15_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_PACKED_DEPTH_STENCIL, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAMEBUFFER_OBJECT, NULL},
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3DFMT_FLAG_DEPTH,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_PACKED_DEPTH_STENCIL, convert_s4x4_uint_d24_unorm},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAMEBUFFER_OBJECT, convert_s4x4_uint_d24_unorm},
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3DFMT_FLAG_DEPTH,
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_TEXTURE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE, GL_UNSIGNED_SHORT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_GL_EXT_NONE, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_COMPONENT, GL_FLOAT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_BUFFER_FLOAT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_DEPTH_BUFFER_FLOAT, convert_s8_uint_d24_float},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Vendor-specific formats */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ATI_TEXTURE_COMPRESSION_3DC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_COMPRESSED,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_TEXTURE_COMPRESSION_RGTC, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_INTZ, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync EXT_PACKED_DEPTH_STENCIL, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_INTZ, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAMEBUFFER_OBJECT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_NULL, 0, 0, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ARB_FRAMEBUFFER_OBJECT, NULL},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic inline int getFmtIdx(enum wined3d_format_id format_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* First check if the format is at the position of its value.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * This will catch the argb formats before the loop is entered. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format_id < (sizeof(formats) / sizeof(*formats))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && formats[format_id].id == format_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return format_id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < (sizeof(formats) / sizeof(*formats)); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (formats[i].id == format_id) return i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return -1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT format_count = sizeof(formats) / sizeof(*formats);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->formats));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->formats)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Failed to allocate memory.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < format_count; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format = &gl_info->formats[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->id = formats[i].id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->red_size = formats[i].red_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->green_size = formats[i].green_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->blue_size = formats[i].blue_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->alpha_size = formats[i].alpha_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->red_offset = formats[i].red_offset;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->green_offset = formats[i].green_offset;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->blue_offset = formats[i].blue_offset;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->alpha_offset = formats[i].alpha_offset;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->byte_count = formats[i].bpp;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->depth_size = formats[i].depth_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->stencil_size = formats[i].stencil_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_width = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_height = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_byte_count = formats[i].bpp;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < (sizeof(format_base_flags) / sizeof(*format_base_flags)); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int fmt_idx = getFmtIdx(format_base_flags[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (fmt_idx == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Format %s (%#x) not found.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format_base_flags[i].id), format_base_flags[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync HeapFree(GetProcessHeap(), 0, gl_info->formats);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[fmt_idx].flags |= format_base_flags[i].flags;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL init_format_block_info(struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < (sizeof(format_block_info) / sizeof(*format_block_info)); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int fmt_idx = getFmtIdx(format_block_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (fmt_idx == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Format %s (%#x) not found.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format_block_info[i].id), format_block_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format = &gl_info->formats[fmt_idx];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_width = format_block_info[i].block_width;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_height = format_block_info[i].block_height;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->block_byte_count = format_block_info[i].block_byte_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_BLOCKS;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined3d_format *format)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Check if the default internal format is supported as a frame buffer
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * target, otherwise fall back to the render target internal.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Try to stick to the standard format if possible, this limits precision differences. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLenum status;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLuint tex;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync while (gl_info->gl_ops.gl.p_glGetError());
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, format->glInternal, 16, 16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glFormat, format->glType, NULL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("Framebuffer format check");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (status == GL_FRAMEBUFFER_COMPLETE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s is supported as FBO color attachment.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!format->rtInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & WINED3DFMT_FLAG_RENDERTARGET)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Format %s with rendertarget flag is not supported as FBO color attachment,"
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync " and no fallback specified.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s is not supported as FBO color attachment, trying rtInternal format as fallback.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync while (gl_info->gl_ops.gl.p_glGetError());
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, format->rtInternal, 16, 16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glFormat, format->glType, NULL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("Framebuffer format check");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (status == GL_FRAMEBUFFER_COMPLETE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s rtInternal format is supported as FBO color attachment.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Format %s rtInternal format is not supported as FBO color attachment.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (status == GL_FRAMEBUFFER_COMPLETE && ((format->flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || !(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && format->id != WINED3DFMT_NULL && format->id != WINED3DFMT_P8_UINT
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && format->glFormat != GL_LUMINANCE && format->glFormat != GL_LUMINANCE_ALPHA
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && (format->red_size || format->alpha_size))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD readback[16 * 16], color, r_range, a_range;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE r, a;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BOOL match = TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLuint rb;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glGenRenderbuffers(1, &rb);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, rb);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 16, 16);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rb);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("RB attachment");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_BLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->gl_ops.gl.p_glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync while (gl_info->gl_ops.gl.p_glGetError());
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format doesn't support post-pixelshader blending.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glViewport(0, 0, 16, 16);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_LIGHTING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadIdentity();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glMatrixMode(GL_PROJECTION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadIdentity();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Draw a full-black quad */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(-1.0f, -1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(1.0f, -1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(-1.0f, 1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(1.0f, 1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnd();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_BLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Draw a half-transparent red quad */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(-1.0f, -1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(1.0f, -1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(-1.0f, 1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex3f(1.0f, 1.0f, 0.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnd();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Rebinding texture to workaround a fglrx bug. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, readback);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("Post-pixelshader blending check");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync color = readback[7 * 16 + 7];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync a = color >> 24;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync r = (color & 0x00ff0000) >> 16;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync r_range = format->red_size < 8 ? 1 << (8 - format->red_size) : 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync a_range = format->alpha_size < 8 ? 1 << (8 - format->alpha_size) : 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->red_size && (r < 0x7f - r_range || r > 0x7f + r_range))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync match = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (format->alpha_size > 1 && (a < 0xbf - a_range || a > 0xbf + a_range))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync match = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!match)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format doesn't support post-pixelshader blending.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Color output: %#x\n", color);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format supports post-pixelshader blending.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Color output: %#x\n", color);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glDeleteRenderbuffers(1, &rb);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("RB cleanup");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->glInternal != format->glGammaInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, format->glGammaInternal, 16, 16, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glFormat, format->glType, NULL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("Framebuffer format check");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (status == GL_FRAMEBUFFER_COMPLETE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s's sRGB format is FBO attachable.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Format %s's sRGB format is not FBO attachable.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (status == GL_FRAMEBUFFER_COMPLETE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void query_format_flag(struct wined3d_gl_info *gl_info, struct wined3d_format *format,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint internal, GLenum pname, DWORD flag, const char *string)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint value;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.ext.p_glGetInternalformativ(GL_TEXTURE_2D, internal, pname, 1, &value);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (value == GL_FULL_SUPPORT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s supports %s.\n", debug_d3dformat(format->id), string);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= flag;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s doesn't support %s.\n", debug_d3dformat(format->id), string);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~flag;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLuint fbo;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLint value;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format = &gl_info->formats[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!format->glInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.ext.p_glGetInternalformativ(GL_TEXTURE_2D, format->glInternal,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_FRAMEBUFFER_RENDERABLE, 1, &value);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (value == GL_FULL_SUPPORT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s is supported as FBO color attachment.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync query_format_flag(gl_info, format, format->glInternal, GL_FRAMEBUFFER_BLEND,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING, "post-pixelshader blending");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!format->rtInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & WINED3DFMT_FLAG_RENDERTARGET)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Format %s with rendertarget flag is not supported as FBO color attachment"
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync " and no fallback specified.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.ext.p_glGetInternalformativ(GL_TEXTURE_2D, format->rtInternal,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_FRAMEBUFFER_RENDERABLE, 1, &value);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (value == GL_FULL_SUPPORT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s rtInternal format is supported as FBO color attachment.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Format %s rtInternal format is not supported as FBO color attachment.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->glInternal != format->glGammaInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.ext.p_glGetInternalformativ(GL_TEXTURE_2D, format->glGammaInternal,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_FRAMEBUFFER_RENDERABLE, 1, &value);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (value == GL_FULL_SUPPORT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s's sRGB format is FBO attachable.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Format %s's sRGB format is not FBO attachable.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (format->flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDrawBuffer(GL_COLOR_ATTACHMENT0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glReadBuffer(GL_COLOR_ATTACHMENT0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format = &gl_info->formats[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!format->glInternal) continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Skipping format %s because it's a depth/stencil format.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & WINED3DFMT_FLAG_COMPRESSED)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Skipping format %s because it's a compressed format.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync check_fbo_compat(gl_info, format);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct fragment_caps fragment_caps;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct shader_caps shader_caps;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BOOL srgb_write;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync srgb_write = (fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_SRGB_WRITE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && (shader_caps.wined3d_caps & WINED3D_SHADER_CAP_SRGB_WRITE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(format_texture_info) / sizeof(*format_texture_info); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int fmt_idx = getFmtIdx(format_texture_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (fmt_idx == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Format %s (%#x) not found.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format_texture_info[i].id), format_texture_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[format_texture_info[i].extension]) continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format = &gl_info->formats[fmt_idx];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* ARB_texture_rg defines floating point formats, but only if
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * ARB_texture_float is also supported. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[ARB_TEXTURE_FLOAT]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && (format->flags & WINED3DFMT_FLAG_FLOAT))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glInternal = format_texture_info[i].gl_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glGammaInternal = format_texture_info[i].gl_srgb_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->rtInternal = format_texture_info[i].gl_rt_internal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glFormat = format_texture_info[i].gl_format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glType = format_texture_info[i].gl_type;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->color_fixup = COLOR_FIXUP_IDENTITY;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= format_texture_info[i].flags;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->height_scale.numerator = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->height_scale.denominator = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync query_format_flag(gl_info, format, format->glInternal, GL_VERTEX_TEXTURE,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_VTF, "vertex texture usage");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync query_format_flag(gl_info, format, format->glInternal, GL_FILTER,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_FILTERING, "filtering");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->glGammaInternal != format->glInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync query_format_flag(gl_info, format, format->glGammaInternal, GL_SRGB_READ,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_SRGB_READ, "sRGB read");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (srgb_write)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync query_format_flag(gl_info, format, format->glGammaInternal, GL_SRGB_WRITE,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_FLAG_SRGB_WRITE, "sRGB write");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_SRGB_WRITE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!(format->flags & (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE)))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glGammaInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glInternal = format->glGammaInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->limits.vertex_samplers)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_VTF;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FILTERING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (format->id != WINED3DFMT_R32G32B32A32_FLOAT && format->id != WINED3DFMT_R32_FLOAT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_VTF;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->glGammaInternal != format->glInternal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Filter sRGB capabilities if EXT_texture_sRGB is not supported. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[EXT_TEXTURE_SRGB])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glGammaInternal = format->glInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~(WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->glInternal = format->glGammaInternal;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if ((format->flags & WINED3DFMT_FLAG_SRGB_WRITE) && !srgb_write)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_SRGB_WRITE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Texture conversion stuff */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->convert = format_texture_info[i].convert;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->conv_byte_count = format_texture_info[i].conv_byte_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL color_match(DWORD c1, DWORD c2, BYTE max_diff)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync c1 >>= 8; c2 >>= 8;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync c1 >>= 8; c2 >>= 8;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync c1 >>= 8; c2 >>= 8;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* A context is provided by the caller */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const DWORD data[] = {0x00000000, 0xffffffff};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLuint tex, fbo, buffer;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD readback[16 * 1];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BOOL ret = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Render a filtered texture and see what happens. This is intended to detect the lack of
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * float16 filtering on ATI X1000 class cards. The drivers disable filtering instead of
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * falling back to software. If this changes in the future this code will get fooled and
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * apps might hit the software path due to incorrectly advertised caps.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Its unlikely that this changes however. GL Games like Mass Effect depend on the filter
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * disable fallback, if Apple or ATI ever change the driver behavior they will break more
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * than Wine. The Linux binary <= r500 driver is not maintained any more anyway
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync while (gl_info->gl_ops.gl.p_glGetError());
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glGenTextures(1, &buffer);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, buffer);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memset(readback, 0x7e, sizeof(readback));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 1, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, readback);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, internal, 2, 1, 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDrawBuffer(GL_COLOR_ATTACHMENT0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glViewport(0, 0, 16, 1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_LIGHTING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadIdentity();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glMatrixMode(GL_PROJECTION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadIdentity();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glClearColor(0, 1, 0, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexCoord2f(0.0, 0.0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex2f(-1.0f, -1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexCoord2f(1.0, 0.0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex2f(1.0f, -1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexCoord2f(0.0, 1.0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex2f(-1.0f, 1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glTexCoord2f(1.0, 1.0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glVertex2f(1.0f, 1.0f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnd();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, buffer);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memset(readback, 0x7f, sizeof(readback));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, readback);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (color_match(readback[6], 0xffffffff, 5) || color_match(readback[6], 0x00000000, 5)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || color_match(readback[9], 0xffffffff, 5) || color_match(readback[9], 0x00000000, 5))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Read back colors 0x%08x and 0x%08x close to unfiltered color, assuming no filtering\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync readback[6], readback[9]);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Read back colors are 0x%08x and 0x%08x, assuming texture is filtered\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync readback[6], readback[9]);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret = TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDeleteTextures(1, &buffer);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->gl_ops.gl.p_glGetError())
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Error during filtering test for format %x, returning no filtering\n", internal);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return ret;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int fmt_idx, i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const enum wined3d_format_id fmts16[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_R16_FLOAT,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_R16G16_FLOAT,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DFMT_R16G16B16A16_FLOAT,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync };
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BOOL filtered;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* This was already handled by init_format_texture_info(). */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (vendor == HW_VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Nvidia card with texture_float support: Assuming float16 blending\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync filtered = TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (gl_info->limits.glsl_varyings > 44)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("More than 44 GLSL varyings - assuming d3d10 card with float16 blending\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync filtered = TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Assuming no float16 blending\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync filtered = FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if(filtered)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fmt_idx = getFmtIdx(fmts16[i]);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[fmt_idx].flags |= WINED3DFMT_FLAG_FILTERING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fmt_idx = getFmtIdx(fmts16[i]);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format = &gl_info->formats[fmt_idx];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!format->glInternal) continue; /* Not supported by GL */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync filtered = check_filter(gl_info, gl_info->formats[fmt_idx].glInternal);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if(filtered)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s supports filtering\n", debug_d3dformat(fmts16[i]));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags |= WINED3DFMT_FLAG_FILTERING;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Format %s does not support filtering\n", debug_d3dformat(fmts16[i]));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int idx;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R32G32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* V8U8 is supported natively by GL_ATI_envmap_bumpmap and GL_NV_texture_shader.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * V16U16 is only supported by GL_NV_texture_shader. The formats need fixup if
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * their extensions are not available. GL_ATI_envmap_bumpmap is not used because
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the only driver that implements it(fglrx) has a buggy implementation.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * V8U8 and V16U16 need a fixup of the undefined blue channel. OpenGL
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * returns 0.0 when sampling from it, DirectX 1.0. So we always have in-shader
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * conversion for this format.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[NV_TEXTURE_SHADER])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R8G8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R8G8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[NV_TEXTURE_SHADER])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* If GL_NV_texture_shader is not supported, those formats are converted, incompatibly
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * with each other
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R5G5_SNORM_L6_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R8G8_SNORM_L8X8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R8G8B8A8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 1, CHANNEL_SOURCE_Z, 1, CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* If GL_NV_texture_shader is supported, WINED3DFMT_L6V5U5 and WINED3DFMT_X8L8V8U8
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * are converted at surface loading time, but they do not need any modification in
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the shader, thus they are compatible with all WINED3DFMT_UNKNOWN group formats.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * WINED3DFMT_Q8W8V8U8 doesn't even need load-time conversion
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_ATI2N);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_ATI2N);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup= create_color_fixup_desc(
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_W, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[APPLE_YCBCR_422])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_YUY2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_UYVY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_YV12);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags |= WINED3DFMT_FLAG_HEIGHT_SCALE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].height_scale.numerator = 3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].height_scale.denominator = 2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_P8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].gl_vtx_format = GL_BGRA;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_HALF_FLOAT_VERTEX])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Do not change the size of the type, it is CPU side. We have to change the GPU-side information though.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * It is the job of the vertex buffer code to make sure that the vbos have the right format */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].gl_vtx_type = GL_HALF_FLOAT; /* == GL_HALF_FLOAT_NV */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16B16A16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].gl_vtx_type = GL_HALF_FLOAT;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[ARB_HALF_FLOAT_PIXEL])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags &= ~WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags &= ~WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16B16A16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags &= ~WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->quirks & WINED3D_QUIRK_BROKEN_RGBA16)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_R16G16B16A16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags &= ~WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* ATI instancing hack: Although ATI cards do not support Shader Model
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * 3.0, they support instancing. To query if the card supports instancing
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * CheckDeviceFormat() with the special format MAKEFOURCC('I','N','S','T')
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * is used. Should an application check for this, provide a proper return
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * value. We can do instancing with all shader versions, but we need
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * vertex shaders.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Additionally applications have to set the D3DRS_POINTSIZE render state
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * to MAKEFOURCC('I','N','S','T') once to enable instancing. Wined3d
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * doesn't need that and just ignores it.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * With Shader Model 3.0 capable cards Instancing 'just works' in Windows. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* FIXME: This should just check the shader backend caps. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_VERTEX_SHADER])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_INST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags |= WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Depth bound test. To query if the card supports it CheckDeviceFormat()
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * with the special format MAKEFOURCC('N','V','D','B') is used. It is
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * enabled by setting D3DRS_ADAPTIVETESS_X render state to
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * MAKEFOURCC('N','V','D','B') and then controlled by setting
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * D3DRS_ADAPTIVETESS_Z (zMin) and D3DRS_ADAPTIVETESS_W (zMax) to test
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * value. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[EXT_DEPTH_BOUNDS_TEST])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_NVDB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags |= WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* RESZ aka AMD DX9-level hack for multisampled depth buffer resolve. You query for RESZ
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * support by checking for availability of MAKEFOURCC('R','E','S','Z') surfaces with
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * RENDERTARGET usage. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_RESZ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats[idx].flags |= WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format = &gl_info->formats[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!(format->flags & WINED3DFMT_FLAG_TEXTURE))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!adapter->shader_backend->shader_color_fixup_supported(format->color_fixup)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || !adapter->fragment_pipe->color_fixup_supported(format->color_fixup))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->flags &= ~WINED3DFMT_FLAG_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < (sizeof(format_vertex_info) / sizeof(*format_vertex_info)); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_format *format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int fmt_idx = getFmtIdx(format_vertex_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (fmt_idx == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Format %s (%#x) not found.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format_vertex_info[i].id), format_vertex_info[i].id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format = &gl_info->formats[fmt_idx];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->emit_idx = format_vertex_info[i].emit_idx;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->component_count = format_vertex_info[i].component_count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->gl_vtx_type = format_vertex_info[i].gl_vtx_type;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->gl_vtx_format = format_vertex_info[i].gl_vtx_format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->gl_normalized = format_vertex_info[i].gl_normalized;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync format->component_size = format_vertex_info[i].component_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncBOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_base_info(gl_info)) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_block_info(gl_info))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync HeapFree(GetProcessHeap(), 0, gl_info->formats);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats = NULL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncBOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_gl_info *gl_info = &adapter->gl_info;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_base_info(gl_info)) return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_block_info(gl_info)) goto fail;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_texture_info(adapter, gl_info)) goto fail;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!init_format_vertex_info(gl_info)) goto fail;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync apply_format_fixups(adapter, gl_info);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync init_format_fbo_compat_info(gl_info);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync init_format_filter_info(gl_info, adapter->driver_info.vendor);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncfail:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync HeapFree(GetProcessHeap(), 0, gl_info->formats);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->formats = NULL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst struct wined3d_format *wined3d_get_format(const struct wined3d_gl_info *gl_info,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id format_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int idx = getFmtIdx(format_id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (idx == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Can't find format %s (%#x) in the format lookup table\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync debug_d3dformat(format_id), format_id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Get the caller a valid pointer */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync idx = getFmtIdx(WINED3DFMT_UNKNOWN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return &gl_info->formats[idx];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncUINT wined3d_format_calculate_size(const struct wined3d_format *format, UINT alignment, UINT width, UINT height)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->id == WINED3DFMT_UNKNOWN)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (format->flags & WINED3DFMT_FLAG_BLOCKS)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT row_block_count = (width + format->block_width - 1) / format->block_width;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT row_count = (height + format->block_height - 1) / format->block_height;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size = row_count * (((row_block_count * format->block_byte_count) + alignment - 1) & ~(alignment - 1));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size = height * (((width * format->byte_count) + alignment - 1) & ~(alignment - 1));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->flags & WINED3DFMT_FLAG_HEIGHT_SCALE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* The D3D format requirements make sure that the resulting format is an integer again */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size *= format->height_scale.numerator;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size /= format->height_scale.denominator;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/*****************************************************************************
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Trace formatting of useful values
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dformat(enum wined3d_format_id format_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (format_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define FMT_TO_STR(format_id) case format_id: return #format_id
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_UNKNOWN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B8G8R8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B5G5R5X1_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B4G4R4A4_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B2G3R3_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B2G3R3A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B4G4R4X4_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8X8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B10G10R10A2_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_P8_UINT_A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_P8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_L8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_L8A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_L4A4_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R5G5_SNORM_L6_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_SNORM_L8X8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G11B11_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G10B10_SNORM_A2_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_UYVY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_YUY2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_YV12);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_DXT1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_DXT2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_DXT3);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_DXT4);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_DXT5);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_MULTI2_ARGB8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_G8R8_G8B8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_B8G8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D16_LOCKABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D32_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_S1_UINT_D15_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_X8D24_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_S4X4_UINT_D24_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_L16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_S8_UINT_D24_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_VERTEXDATA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_SNORM_Cx);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_ATI2N);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_NVDB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_NVHU);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_NVHS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32A32_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32A32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32A32_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32A32_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32B32_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16B16A16_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G32_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32G8X24_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D32_FLOAT_S8X24_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32_FLOAT_X8X24_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_X32_TYPELESS_G8X24_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G10B10A2_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G10B10A2_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G10B10A2_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R10G10B10A2_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R11G11B10_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM_SRGB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8B8A8_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16G16_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R32_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R24G8_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D24_UNORM_S8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R24_UNORM_X8_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_X24_TYPELESS_G8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_FLOAT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_D16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8_UINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8_SINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R1_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R9G9B9E5_SHAREDEXP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R8G8_B8G8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_G8R8_G8B8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC1_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC1_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC1_UNORM_SRGB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC2_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC2_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC2_UNORM_SRGB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC3_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC3_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC3_UNORM_SRGB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC4_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC4_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC4_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC5_TYPELESS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC5_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_BC5_SNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B5G6R5_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B5G5R5A1_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B8G8R8A8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_B8G8R8X8_UNORM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_INTZ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_RESZ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_NULL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_R16);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FMT_TO_STR(WINED3DFMT_AL16);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef FMT_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char fourcc[5];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fourcc[0] = (char)(format_id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fourcc[1] = (char)(format_id >> 8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fourcc[2] = (char)(format_id >> 16);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fourcc[3] = (char)(format_id >> 24);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync fourcc[4] = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3]))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %#x (as fourcc: %s) WINED3DFORMAT!\n", format_id, fourcc);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %#x WINED3DFORMAT!\n", format_id);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3ddevicetype(enum wined3d_device_type device_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (device_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define DEVTYPE_TO_STR(dev) case dev: return #dev
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DEVTYPE_TO_STR(WINED3D_DEVICE_TYPE_HAL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DEVTYPE_TO_STR(WINED3D_DEVICE_TYPE_REF);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DEVTYPE_TO_STR(WINED3D_DEVICE_TYPE_SW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef DEVTYPE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized device type %#x.\n", device_type);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dusage(DWORD usage)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char buf[333];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync buf[0] = '\0';
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3DUSAGE_TO_STR(u) if (usage & u) { strcat(buf, " | "#u); usage &= ~u; }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_RENDERTARGET);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_DEPTHSTENCIL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_WRITEONLY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_SOFTWAREPROCESSING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_DONOTCLIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_POINTS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_RTPATCHES);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_NPATCHES);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_DYNAMIC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_AUTOGENMIPMAP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_DMAP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_STATICDECL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGE_TO_STR(WINED3DUSAGE_OVERLAY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3DUSAGE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (usage) FIXME("Unrecognized usage flag(s) %#x\n", usage);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dusagequery(DWORD usagequery)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char buf[238];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync buf[0] = '\0';
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3DUSAGEQUERY_TO_STR(u) if (usagequery & u) { strcat(buf, " | "#u); usagequery &= ~u; }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_FILTER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_SRGBREAD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_SRGBWRITE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_VERTEXTEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_WRAPANDMIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3DUSAGEQUERY_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (usagequery) FIXME("Unrecognized usage query flag(s) %#x\n", usagequery);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3ddeclmethod(enum wined3d_decl_method method)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (method)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3DDECLMETHOD_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_DEFAULT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_PARTIAL_U);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_PARTIAL_V);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_CROSS_UV);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_UV);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_LOOKUP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLMETHOD_TO_STR(WINED3D_DECL_METHOD_LOOKUP_PRESAMPLED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3DDECLMETHOD_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized declaration method %#x.\n", method);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3ddeclusage(enum wined3d_decl_usage usage)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (usage)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3DDECLUSAGE_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_POSITION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_BLEND_WEIGHT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_BLEND_INDICES);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_NORMAL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_PSIZE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_TEXCOORD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_TANGENT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_BINORMAL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_TESS_FACTOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_POSITIONT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_COLOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_FOG);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_DEPTH);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3DDECLUSAGE_TO_STR(WINED3D_DECL_USAGE_SAMPLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3DDECLUSAGE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %u declaration usage!\n", usage);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dresourcetype(enum wined3d_resource_type resource_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (resource_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define RES_TO_STR(res) case res: return #res
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_SURFACE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_VOLUME);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_TEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_VOLUME_TEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_CUBE_TEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync RES_TO_STR(WINED3D_RTYPE_BUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef RES_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized resource type %#x.\n", resource_type);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dprimitivetype(enum wined3d_primitive_type primitive_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (primitive_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define PRIM_TO_STR(prim) case prim: return #prim
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_UNDEFINED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_POINTLIST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_LINELIST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_LINESTRIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_TRIANGLELIST);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_TRIANGLESTRIP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_TRIANGLEFAN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_LINELIST_ADJ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_LINESTRIP_ADJ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_TRIANGLELIST_ADJ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PRIM_TO_STR(WINED3D_PT_TRIANGLESTRIP_ADJ);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef PRIM_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %u primitive type!\n", primitive_type);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3drenderstate(enum wined3d_render_state state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define D3DSTATE_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ANTIALIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_TEXTUREPERSPECTIVE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAPU);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAPV);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ZENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FILLMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SHADEMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_LINEPATTERN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MONOENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ROP2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_PLANEMASK);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ZWRITEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ALPHATESTENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_LASTPIXEL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SRCBLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DESTBLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CULLMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ZFUNC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ALPHAREF);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ALPHAFUNC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DITHERENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ALPHABLENDENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SPECULARENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ZVISIBLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SUBPIXEL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SUBPIXELX);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STIPPLEDALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGCOLOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGTABLEMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGSTART);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGDENSITY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STIPPLEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_EDGEANTIALIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORKEYENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MIPMAPLODBIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_RANGEFOGENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ANISOTROPY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FLUSHBATCH);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILFAIL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILZFAIL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILPASS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILFUNC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILREF);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILMASK);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_STENCILWRITEMASK);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_TEXTUREFACTOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP3);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP4);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP5);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP6);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP7);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CLIPPING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_LIGHTING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_EXTENTS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_AMBIENT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_FOGVERTEXMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORVERTEX);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_LOCALVIEWER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_NORMALIZENORMALS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORKEYBLENDENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DIFFUSEMATERIALSOURCE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SPECULARMATERIALSOURCE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_AMBIENTMATERIALSOURCE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_EMISSIVEMATERIALSOURCE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_VERTEXBLEND);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CLIPPLANEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SOFTWAREVERTEXPROCESSING);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSIZE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSIZE_MIN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSPRITEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSCALEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSCALE_A);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSCALE_B);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSCALE_C);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MULTISAMPLEANTIALIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MULTISAMPLEMASK);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_PATCHEDGESTYLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_PATCHSEGMENTS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DEBUGMONITORTOKEN);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POINTSIZE_MAX);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_INDEXEDVERTEXBLENDENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_TWEENFACTOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_BLENDOP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_POSITIONDEGREE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_NORMALDEGREE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SCISSORTESTENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SLOPESCALEDEPTHBIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ANTIALIASEDLINEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MINTESSELLATIONLEVEL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_MAXTESSELLATIONLEVEL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ADAPTIVETESS_X);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ADAPTIVETESS_Y);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ADAPTIVETESS_Z);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ADAPTIVETESS_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_ENABLEADAPTIVETESSELLATION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_TWOSIDEDSTENCILMODE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CCW_STENCILFAIL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CCW_STENCILZFAIL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CCW_STENCILPASS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_CCW_STENCILFUNC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE3);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_BLENDFACTOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SRGBWRITEENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DEPTHBIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP9);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP10);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP11);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP12);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP13);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP14);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_WRAP15);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SEPARATEALPHABLENDENABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_SRCBLENDALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_DESTBLENDALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_RS_BLENDOPALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef D3DSTATE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %u render state!\n", state);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dsamplerstate(enum wined3d_sampler_state state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define D3DSTATE_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_BORDER_COLOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_ADDRESS_U);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_ADDRESS_V);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_ADDRESS_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MAG_FILTER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MIN_FILTER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MIP_FILTER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MIPMAP_LOD_BIAS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MAX_MIP_LEVEL);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_MAX_ANISOTROPY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_SRGB_TEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_ELEMENT_INDEX);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_SAMP_DMAP_OFFSET);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef D3DSTATE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %u sampler state!\n", state);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dtexturefiltertype(enum wined3d_texture_filter_type filter_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (filter_type)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define D3DTEXTUREFILTERTYPE_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_NONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_POINT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_LINEAR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_ANISOTROPIC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_FLAT_CUBIC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_GAUSSIAN_CUBIC);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_PYRAMIDAL_QUAD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTEXTUREFILTERTYPE_TO_STR(WINED3D_TEXF_GAUSSIAN_QUAD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef D3DTEXTUREFILTERTYPE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognied texture filter type 0x%08x.\n", filter_type);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dtexturestate(enum wined3d_texture_stage_state state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define D3DSTATE_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_COLOR_OP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_COLOR_ARG1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_COLOR_ARG2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_ALPHA_OP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_ALPHA_ARG1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_ALPHA_ARG2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_MAT00);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_MAT01);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_MAT10);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_MAT11);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_TEXCOORD_INDEX);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_LSCALE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_BUMPENV_LOFFSET);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_COLOR_ARG0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_ALPHA_ARG0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_RESULT_ARG);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DSTATE_TO_STR(WINED3D_TSS_CONSTANT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef D3DSTATE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized %u texture state!\n", state);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dtop(enum wined3d_texture_op d3dtop)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (d3dtop)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define D3DTOP_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_DISABLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_SELECT_ARG1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_SELECT_ARG2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_2X);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_4X);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_ADD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_ADD_SIGNED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_ADD_SIGNED_2X);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_SUBTRACT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_ADD_SMOOTH);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BLEND_DIFFUSE_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BLEND_TEXTURE_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BLEND_FACTOR_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BLEND_CURRENT_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_PREMODULATE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BUMPENVMAP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_BUMPENVMAP_LUMINANCE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_DOTPRODUCT3);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_MULTIPLY_ADD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync D3DTOP_TO_STR(WINED3D_TOP_LERP);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef D3DTOP_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized texture op %#x.\n", d3dtop);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dtstype(enum wined3d_transform_state tstype)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (tstype)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define TSTYPE_TO_STR(tstype) case tstype: return #tstype
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_VIEW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_PROJECTION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE3);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE4);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE5);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE6);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_TEXTURE7);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TSTYPE_TO_STR(WINED3D_TS_WORLD_MATRIX(0));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef TSTYPE_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (tstype > 256 && tstype < 512)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("WINED3D_TS_WORLD_MATRIX(%u). 1..255 not currently supported.\n", tstype);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return ("WINED3D_TS_WORLD_MATRIX > 0");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized transform state %#x.\n", tstype);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dstate(DWORD state)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_RENDER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_RENDER(%s)", debug_d3drenderstate(state - STATE_RENDER(0)));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_TEXTURESTAGE(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD texture_stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD texture_state = state - STATE_TEXTURESTAGE(texture_stage, 0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_TEXTURESTAGE(%#x, %s)",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync texture_stage, debug_d3dtexturestate(texture_state));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_SAMPLER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_PIXELSHADER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_PIXELSHADER";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_TRANSFORM(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_TRANSFORM(%s)", debug_d3dtstype(state - STATE_TRANSFORM(0)));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_STREAMSRC(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_STREAMSRC";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_INDEXBUFFER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_INDEXBUFFER";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_VDECL(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_VDECL";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_VSHADER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_VSHADER";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_GEOMETRY_SHADER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_GEOMETRY_SHADER";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_VIEWPORT(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_VIEWPORT";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_VERTEXSHADERCONSTANT(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_VERTEXSHADERCONSTANT";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_PIXELSHADERCONSTANT(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_PIXELSHADERCONSTANT";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_LIGHT_TYPE(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_LIGHT_TYPE";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_ACTIVELIGHT(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_SCISSORRECT(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_SCISSORRECT";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_CLIPPLANE(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_MATERIAL(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_MATERIAL";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_FRONTFACE(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_FRONTFACE";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_POINTSPRITECOORDORIGIN(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_POINTSPRITECOORDORIGIN";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_BASEVERTEXINDEX(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_BASEVERTEXINDEX";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_FRAMEBUFFER(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_FRAMEBUFFER";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (STATE_IS_POINT_SIZE_ENABLE(state))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "STATE_POINT_SIZE_ENABLE";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_d3dpool(enum wined3d_pool pool)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (pool)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define POOL_TO_STR(p) case p: return #p
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync POOL_TO_STR(WINED3D_POOL_DEFAULT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync POOL_TO_STR(WINED3D_POOL_MANAGED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync POOL_TO_STR(WINED3D_POOL_SYSTEM_MEM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync POOL_TO_STR(WINED3D_POOL_SCRATCH);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef POOL_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized pool %#x.\n", pool);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_fbostatus(GLenum status) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch(status) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define FBOSTATUS_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_COMPLETE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNSUPPORTED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNDEFINED);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef FBOSTATUS_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognied FBO status 0x%08x\n", status);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_glerror(GLenum error) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch(error) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define GLERROR_TO_STR(u) case u: return #u
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_NO_ERROR);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_INVALID_ENUM);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_INVALID_VALUE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_INVALID_OPERATION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_STACK_OVERFLOW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_STACK_UNDERFLOW);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_OUT_OF_MEMORY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLERROR_TO_STR(GL_INVALID_FRAMEBUFFER_OPERATION);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef GLERROR_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognied GL error 0x%08x\n", error);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const char *debug_fixup_channel_source(enum fixup_channel_source source)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch(source)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3D_TO_STR(x) case x: return #x
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_ZERO);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_ONE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_X);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_Y);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_Z);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_W);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX1);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3D_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized fixup_channel_source %#x\n", source);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic const char *debug_complex_fixup(enum complex_fixup fixup)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch(fixup)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define WINED3D_TO_STR(x) case x: return #x
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(COMPLEX_FIXUP_YUY2);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(COMPLEX_FIXUP_UYVY);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(COMPLEX_FIXUP_YV12);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WINED3D_TO_STR(COMPLEX_FIXUP_P8);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#undef WINED3D_TO_STR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unrecognized complex fixup %#x\n", fixup);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return "unrecognized";
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid dump_color_fixup_desc(struct color_fixup_desc fixup)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (is_complex_fixup(fixup))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("\tComplex: %s\n", debug_complex_fixup(get_complex_fixup(fixup)));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("\tX: %s%s\n", debug_fixup_channel_source(fixup.x_source), fixup.x_sign_fixup ? ", SIGN_FIXUP" : "");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("\tY: %s%s\n", debug_fixup_channel_source(fixup.y_source), fixup.y_sign_fixup ? ", SIGN_FIXUP" : "");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("\tZ: %s%s\n", debug_fixup_channel_source(fixup.z_source), fixup.z_sign_fixup ? ", SIGN_FIXUP" : "");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("\tW: %s%s\n", debug_fixup_channel_source(fixup.w_source), fixup.w_sign_fixup ? ", SIGN_FIXUP" : "");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst char *debug_surflocation(DWORD flag) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync char buf[128];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync buf[0] = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INSYSMEM) strcat(buf, " | SFLAG_INSYSMEM"); /* 17 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INDRAWABLE) strcat(buf, " | SFLAG_INDRAWABLE"); /* 19 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INTEXTURE) strcat(buf, " | SFLAG_INTEXTURE"); /* 18 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INSRGBTEX) strcat(buf, " | SFLAG_INSRGBTEX"); /* 18 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INRB_MULTISAMPLE) strcat(buf, " | SFLAG_INRB_MULTISAMPLE"); /* 25 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flag & SFLAG_INRB_RESOLVED) strcat(buf, " | SFLAG_INRB_RESOLVED"); /* 22 */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return wine_dbg_sprintf("%s", buf[0] ? buf + 3 : "0");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncBOOL is_invalid_op(const struct wined3d_state *state, int stage,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (op == WINED3D_TOP_DISABLE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->textures[stage])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if ((arg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && op != WINED3D_TOP_SELECT_ARG2)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if ((arg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && op != WINED3D_TOP_SELECT_ARG1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if ((arg3 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && (op == WINED3D_TOP_MULTIPLY_ADD || op == WINED3D_TOP_LERP))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Setup this textures matrix according to the texture flags. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller (state handler). */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat, DWORD flags,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BOOL calculatedCoords, BOOL transformed, enum wined3d_format_id vtx_fmt, BOOL ffp_proj_control)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float mat[16];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glMatrixMode(GL_TEXTURE);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glMatrixMode(GL_TEXTURE)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flags == WINED3D_TTFF_DISABLE || flags == WINED3D_TTFF_COUNT1 || transformed)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadIdentity();
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glLoadIdentity()");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flags == (WINED3D_TTFF_COUNT1 | WINED3D_TTFF_PROJECTED))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Invalid texture transform flags: WINED3D_TTFF_COUNT1 | WINED3D_TTFF_PROJECTED.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memcpy(mat, smat, 16 * sizeof(float));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (flags & WINED3D_TTFF_PROJECTED)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!ffp_proj_control)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (flags & ~WINED3D_TTFF_PROJECTED)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_TTFF_COUNT2:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 3] = mat[ 1];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 7] = mat[ 5];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[11] = mat[ 9];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[15] = mat[13];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 1] = mat[ 5] = mat[ 9] = mat[13] = 0.0f;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_TTFF_COUNT3:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 3] = mat[ 2];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 7] = mat[ 6];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[11] = mat[10];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[15] = mat[14];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[ 2] = mat[ 6] = mat[10] = mat[14] = 0.0f;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync } else { /* under directx the R/Z coord can be used for translation, under opengl we use the Q coord instead */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if(!calculatedCoords) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch(vtx_fmt)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R32_FLOAT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Direct3D passes the default 1.0 in the 2nd coord, while gl passes it in the 4th.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * swap 2nd and 4th coord. No need to store the value of mat[12] in mat[4] because
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the input value to the transformation will be 0, so the matrix value is irrelevant
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[12] = mat[4];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[13] = mat[5];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[14] = mat[6];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[15] = mat[7];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R32G32_FLOAT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* See above, just 3rd and 4th coord
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[12] = mat[8];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[13] = mat[9];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[14] = mat[10];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[15] = mat[11];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R32G32B32_FLOAT: /* Opengl defaults match dx defaults */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R32G32B32A32_FLOAT: /* No defaults apply, all app defined */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* This is to prevent swapping the matrix lines and put the default 4th coord = 1.0
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * into a bad place. The division elimination below will apply to make sure the
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * 1.0 doesn't do anything bad. The caller will set this value if the stride is 0
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_UNKNOWN: /* No texture coords, 0/0/0/1 defaults are passed */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unexpected fixed function texture coord input\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!ffp_proj_control)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (flags & ~WINED3D_TTFF_PROJECTED)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* case WINED3D_TTFF_COUNT1: Won't ever get here. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_TTFF_COUNT2:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[2] = mat[6] = mat[10] = mat[14] = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* OpenGL divides the first 3 vertex coord by the 4th by default,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * which is essentially the same as D3DTTFF_PROJECTED. Make sure that
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the 4th coord evaluates to 1.0 to eliminate that.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * If the fixed function pipeline is used, the 4th value remains unused,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * so there is no danger in doing this. With vertex shaders we have a
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * problem. Should an app hit that problem, the code here would have to
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * check for pixel shaders, and the shader has to undo the default gl divide.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * A more serious problem occurs if the app passes 4 coordinates in, and the
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * or a replacement shader. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mat[3] = mat[7] = mat[11] = 0; mat[15] = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glLoadMatrixf(mat);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glLoadMatrixf(mat)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* This small helper function is used to convert a bitmask into the number of masked bits */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncunsigned int count_bits(unsigned int mask)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (count = 0; mask; ++count)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync mask &= mask - 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return count;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Helper function for retrieving color info for ChoosePixelFormat and wglChoosePixelFormatARB.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * The later function requires individual color components. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncBOOL getColorBits(const struct wined3d_format *format,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE *redSize, BYTE *greenSize, BYTE *blueSize, BYTE *alphaSize, BYTE *totalSize)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("format %s.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (format->id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B10G10R10A2_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R10G10B10A2_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B8G8R8X8_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B8G8R8_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B8G8R8A8_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_R8G8B8A8_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B5G5R5X1_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B5G5R5A1_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B5G6R5_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B4G4R4X4_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B4G4R4A4_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_B2G3R3_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_P8_UINT_A8_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_P8_UINT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unsupported format %s.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *redSize = format->red_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *greenSize = format->green_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *blueSize = format->blue_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *alphaSize = format->alpha_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *totalSize = *redSize + *greenSize + *blueSize + *alphaSize;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Returning red: %d, green: %d, blue: %d, alpha: %d, total: %d for format %s.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *redSize, *greenSize, *blueSize, *alphaSize, *totalSize, debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Helper function for retrieving depth/stencil info for ChoosePixelFormat and wglChoosePixelFormatARB */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncBOOL getDepthStencilBits(const struct wined3d_format *format, BYTE *depthSize, BYTE *stencilSize)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("format %s.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (format->id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_D16_LOCKABLE:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_D16_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_S1_UINT_D15_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_X8D24_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_S4X4_UINT_D24_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_D24_UNORM_S8_UINT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_S8_UINT_D24_FLOAT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_D32_UNORM:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_D32_FLOAT:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFMT_INTZ:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unsupported depth/stencil format %s.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return FALSE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *depthSize = format->depth_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *stencilSize = format->stencil_size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Returning depthSize: %d and stencilSize: %d for format %s.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync *depthSize, *stencilSize, debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return TRUE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Note: It's the caller's responsibility to ensure values can be expressed
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * in the requested format. UNORM formats for example can only express values
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * in the range 0.0f -> 1.0f. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncDWORD wined3d_format_convert_from_float(const struct wined3d_surface *surface, const struct wined3d_color *color)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const struct
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync enum wined3d_format_id format_id;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float r_mul;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float g_mul;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float b_mul;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync float a_mul;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE r_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE g_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE b_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE a_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync conv[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8A8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8X8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B8G8R8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G6R5_UNORM, 31.0f, 63.0f, 31.0f, 0.0f, 11, 5, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5A1_UNORM, 31.0f, 31.0f, 31.0f, 1.0f, 10, 5, 0, 15},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B5G5R5X1_UNORM, 31.0f, 31.0f, 31.0f, 1.0f, 10, 5, 0, 15},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_A8_UNORM, 0.0f, 0.0f, 0.0f, 255.0f, 0, 0, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4A4_UNORM, 15.0f, 15.0f, 15.0f, 15.0f, 8, 4, 0, 12},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B4G4R4X4_UNORM, 15.0f, 15.0f, 15.0f, 15.0f, 8, 4, 0, 12},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B2G3R3_UNORM, 7.0f, 7.0f, 3.0f, 0.0f, 5, 2, 0, 0},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8A8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 0, 8, 16, 24},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R8G8B8X8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 0, 8, 16, 24},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_B10G10R10A2_UNORM, 1023.0f, 1023.0f, 1023.0f, 3.0f, 20, 10, 0, 30},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {WINED3DFMT_R10G10B10A2_UNORM, 1023.0f, 1023.0f, 1023.0f, 3.0f, 0, 10, 20, 30},
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync };
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_format *format = surface->resource.format;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Converting color {%.8e %.8e %.8e %.8e} to format %s.\n",
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync color->r, color->g, color->b, color->a, debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(conv) / sizeof(*conv); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD ret;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->id != conv[i].format_id) continue;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret = ((DWORD)((color->r * conv[i].r_mul) + 0.5f)) << conv[i].r_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret |= ((DWORD)((color->g * conv[i].g_mul) + 0.5f)) << conv[i].g_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret |= ((DWORD)((color->b * conv[i].b_mul) + 0.5f)) << conv[i].b_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ret |= ((DWORD)((color->a * conv[i].a_mul) + 0.5f)) << conv[i].a_shift;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync TRACE("Returning 0x%08x.\n", ret);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return ret;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (format->id == WINED3DFMT_P8_UINT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync PALETTEENTRY *e;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync BYTE r, g, b, a;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!surface->palette)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Surface doesn't have a palette, returning 0.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync r = (BYTE)((color->r * 255.0f) + 0.5f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync g = (BYTE)((color->g * 255.0f) + 0.5f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync b = (BYTE)((color->b * 255.0f) + 0.5f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync a = (BYTE)((color->a * 255.0f) + 0.5f);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync e = &surface->palette->palents[a];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (e->peRed == r && e->peGreen == g && e->peBlue == b)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return a;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync WARN("Alpha didn't match index, searching full palette.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < 256; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync e = &surface->palette->palents[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (e->peRed == r && e->peGreen == g && e->peBlue == b)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Unable to convert color to palette index.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync FIXME("Conversion for format %s not implemented.\n", debug_d3dformat(format->id));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* DirectDraw stuff */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncenum wined3d_format_id pixelformat_for_depth(DWORD depth)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (depth)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case 8: return WINED3DFMT_P8_UINT;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case 15: return WINED3DFMT_B5G5R5X1_UNORM;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case 16: return WINED3DFMT_B5G6R5_UNORM;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case 24: return WINED3DFMT_B8G8R8X8_UNORM; /* Robots needs 24bit to be WINED3DFMT_B8G8R8X8_UNORM */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case 32: return WINED3DFMT_B8G8R8X8_UNORM; /* EVE online and the Fur demo need 32bit AdapterDisplayMode to return WINED3DFMT_B8G8R8X8_UNORM */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default: return WINED3DFMT_UNKNOWN;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid multiply_matrix(struct wined3d_matrix *dest, const struct wined3d_matrix *src1,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_matrix *src2)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_matrix temp;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Now do the multiplication 'by hand'.
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync I know that all this could be optimised, but this will be done later :-) */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._11 = (src1->u.s._11 * src2->u.s._11) + (src1->u.s._21 * src2->u.s._12) + (src1->u.s._31 * src2->u.s._13) + (src1->u.s._41 * src2->u.s._14);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._21 = (src1->u.s._11 * src2->u.s._21) + (src1->u.s._21 * src2->u.s._22) + (src1->u.s._31 * src2->u.s._23) + (src1->u.s._41 * src2->u.s._24);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._31 = (src1->u.s._11 * src2->u.s._31) + (src1->u.s._21 * src2->u.s._32) + (src1->u.s._31 * src2->u.s._33) + (src1->u.s._41 * src2->u.s._34);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._41 = (src1->u.s._11 * src2->u.s._41) + (src1->u.s._21 * src2->u.s._42) + (src1->u.s._31 * src2->u.s._43) + (src1->u.s._41 * src2->u.s._44);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._12 = (src1->u.s._12 * src2->u.s._11) + (src1->u.s._22 * src2->u.s._12) + (src1->u.s._32 * src2->u.s._13) + (src1->u.s._42 * src2->u.s._14);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._22 = (src1->u.s._12 * src2->u.s._21) + (src1->u.s._22 * src2->u.s._22) + (src1->u.s._32 * src2->u.s._23) + (src1->u.s._42 * src2->u.s._24);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._32 = (src1->u.s._12 * src2->u.s._31) + (src1->u.s._22 * src2->u.s._32) + (src1->u.s._32 * src2->u.s._33) + (src1->u.s._42 * src2->u.s._34);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._42 = (src1->u.s._12 * src2->u.s._41) + (src1->u.s._22 * src2->u.s._42) + (src1->u.s._32 * src2->u.s._43) + (src1->u.s._42 * src2->u.s._44);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._13 = (src1->u.s._13 * src2->u.s._11) + (src1->u.s._23 * src2->u.s._12) + (src1->u.s._33 * src2->u.s._13) + (src1->u.s._43 * src2->u.s._14);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._23 = (src1->u.s._13 * src2->u.s._21) + (src1->u.s._23 * src2->u.s._22) + (src1->u.s._33 * src2->u.s._23) + (src1->u.s._43 * src2->u.s._24);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._33 = (src1->u.s._13 * src2->u.s._31) + (src1->u.s._23 * src2->u.s._32) + (src1->u.s._33 * src2->u.s._33) + (src1->u.s._43 * src2->u.s._34);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._43 = (src1->u.s._13 * src2->u.s._41) + (src1->u.s._23 * src2->u.s._42) + (src1->u.s._33 * src2->u.s._43) + (src1->u.s._43 * src2->u.s._44);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._14 = (src1->u.s._14 * src2->u.s._11) + (src1->u.s._24 * src2->u.s._12) + (src1->u.s._34 * src2->u.s._13) + (src1->u.s._44 * src2->u.s._14);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._24 = (src1->u.s._14 * src2->u.s._21) + (src1->u.s._24 * src2->u.s._22) + (src1->u.s._34 * src2->u.s._23) + (src1->u.s._44 * src2->u.s._24);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._34 = (src1->u.s._14 * src2->u.s._31) + (src1->u.s._24 * src2->u.s._32) + (src1->u.s._34 * src2->u.s._33) + (src1->u.s._44 * src2->u.s._34);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync temp.u.s._44 = (src1->u.s._14 * src2->u.s._41) + (src1->u.s._24 * src2->u.s._42) + (src1->u.s._34 * src2->u.s._43) + (src1->u.s._44 * src2->u.s._44);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* And copy the new matrix in the good storage.. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memcpy(dest, &temp, 16 * sizeof(float));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncDWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD size = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync int numTextures = (d3dvtVertexType & WINED3DFVF_TEXCOUNT_MASK) >> WINED3DFVF_TEXCOUNT_SHIFT;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (d3dvtVertexType & WINED3DFVF_NORMAL) size += 3 * sizeof(float);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (d3dvtVertexType & WINED3DFVF_DIFFUSE) size += sizeof(DWORD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (d3dvtVertexType & WINED3DFVF_SPECULAR) size += sizeof(DWORD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (d3dvtVertexType & WINED3DFVF_PSIZE) size += sizeof(DWORD);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (d3dvtVertexType & WINED3DFVF_POSITION_MASK) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZ: size += 3 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZRHW: size += 4 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZB1: size += 4 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZB2: size += 5 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZB3: size += 6 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZB4: size += 7 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZB5: size += 8 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3DFVF_XYZW: size += 4 * sizeof(float); break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync default: ERR("Unexpected position mask\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < numTextures; i++) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync size += GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, i) * sizeof(float);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return size;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d_state *state,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct ffp_frag_settings *settings, BOOL ignore_textype)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define ARG1 0x01
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define ARG2 0x02
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#define ARG0 0x04
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const unsigned char args[WINED3D_TOP_LERP + 1] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* undefined */ 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_DISABLE */ 0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_SELECTARG1 */ ARG1,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_SELECTARG2 */ ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATE */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATE2X */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATE4X */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_ADD */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_ADDSIGNED */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_ADDSIGNED2X */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_SUBTRACT */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_ADDSMOOTH */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BLENDDIFFUSEALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BLENDTEXTUREALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BLENDFACTORALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BLENDTEXTUREALPHAPM */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BLENDCURRENTALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_PREMODULATE */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATEALPHA_ADDCOLOR */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATECOLOR_ADDALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATEINVALPHA_ADDCOLOR */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MODULATEINVCOLOR_ADDALPHA */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BUMPENVMAP */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_BUMPENVMAPLUMINANCE */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_DOTPRODUCT3 */ ARG1 | ARG2,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_MULTIPLYADD */ ARG1 | ARG2 | ARG0,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* D3DTOP_LERP */ ARG1 | ARG2 | ARG0
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync };
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD ttff;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_surface *rt = state->fb->render_targets[0];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_gl_info *gl_info = context->gl_info;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_d3d_info *d3d_info = context->d3d_info;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#ifdef VBOX_WITH_WINE_FIX_INITCLEAR
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memset(settings, 0, sizeof(*settings));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync#endif
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < d3d_info->limits.ffp_blend_stages; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_texture *texture;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].padding = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->texture_states[i][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_DISABLE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].cop = WINED3D_TOP_DISABLE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aop = WINED3D_TOP_DISABLE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].carg0 = settings->op[i].carg1 = settings->op[i].carg2 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aarg0 = settings->op[i].aarg1 = settings->op[i].aarg2 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].color_fixup = COLOR_FIXUP_IDENTITY;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].dst = resultreg;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_1d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].projected = proj_none;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync i++;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if ((texture = state->textures[i]))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].color_fixup = texture->resource.format->color_fixup;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (ignore_textype)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_1d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (texture->target)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_1D:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_1d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_2D:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_2d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_3D:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_3d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_CUBE_MAP_ARB:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_cube;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_RECTANGLE_ARB:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_rect;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync } else {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].color_fixup = COLOR_FIXUP_IDENTITY;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].tex_type = tex_1d;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync cop = state->texture_states[i][WINED3D_TSS_COLOR_OP];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = state->texture_states[i][WINED3D_TSS_ALPHA_OP];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg1 = (args[cop] & ARG1) ? state->texture_states[i][WINED3D_TSS_COLOR_ARG1] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg2 = (args[cop] & ARG2) ? state->texture_states[i][WINED3D_TSS_COLOR_ARG2] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg0 = (args[cop] & ARG0) ? state->texture_states[i][WINED3D_TSS_COLOR_ARG0] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (is_invalid_op(state, i, cop, carg1, carg2, carg0))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg0 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg2 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync carg1 = WINED3DTA_CURRENT;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync cop = WINED3D_TOP_SELECT_ARG1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (cop == WINED3D_TOP_DOTPRODUCT3)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* A dotproduct3 on the colorop overwrites the alphaop operation and replicates
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the color result to the alpha component of the destination
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = cop;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg1 = carg1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg2 = carg2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg0 = carg0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg1 = (args[aop] & ARG1) ? state->texture_states[i][WINED3D_TSS_ALPHA_ARG1] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg2 = (args[aop] & ARG2) ? state->texture_states[i][WINED3D_TSS_ALPHA_ARG2] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg0 = (args[aop] & ARG0) ? state->texture_states[i][WINED3D_TSS_ALPHA_ARG0] : ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!i && state->textures[0] && state->render_states[WINED3D_RS_COLORKEYENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync GLenum texture_dimensions;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync texture = state->textures[0];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync texture_dimensions = texture->target;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_surface *surf = surface_from_resource(texture->sub_resources[0]);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format->alpha_size)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (aop == WINED3D_TOP_DISABLE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg1 = WINED3DTA_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = WINED3D_TOP_SELECT_ARG1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (aop == WINED3D_TOP_SELECT_ARG1 && aarg1 != WINED3DTA_TEXTURE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->render_states[WINED3D_RS_ALPHABLENDENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg2 = WINED3DTA_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = WINED3D_TOP_MODULATE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else aarg1 = WINED3DTA_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (aop == WINED3D_TOP_SELECT_ARG2 && aarg2 != WINED3DTA_TEXTURE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->render_states[WINED3D_RS_ALPHABLENDENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg1 = WINED3DTA_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = WINED3D_TOP_MODULATE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else aarg2 = WINED3DTA_TEXTURE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (is_invalid_op(state, i, aop, aarg1, aarg2, aarg0))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg0 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg2 = ARG_UNUSED;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aarg1 = WINED3DTA_CURRENT;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync aop = WINED3D_TOP_SELECT_ARG1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (carg1 == WINED3DTA_TEXTURE || carg2 == WINED3DTA_TEXTURE || carg0 == WINED3DTA_TEXTURE
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || aarg1 == WINED3DTA_TEXTURE || aarg2 == WINED3DTA_TEXTURE || aarg0 == WINED3DTA_TEXTURE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ttff = state->texture_states[i][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (ttff == (WINED3D_TTFF_PROJECTED | WINED3D_TTFF_COUNT3))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].projected = proj_count3;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (ttff & WINED3D_TTFF_PROJECTED)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].projected = proj_count4;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].projected = proj_none;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].projected = proj_none;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].cop = cop;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aop = aop;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].carg0 = carg0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].carg1 = carg1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].carg2 = carg2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aarg0 = aarg0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aarg1 = aarg1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].aarg2 = aarg2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->texture_states[i][WINED3D_TSS_RESULT_ARG] == WINED3DTA_TEMP)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].dst = tempreg;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->op[i].dst = resultreg;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Clear unsupported stages */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for(; i < MAX_TEXTURES; i++) {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memset(&settings->op[i], 0xff, sizeof(settings->op[i]));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!state->render_states[WINED3D_RS_FOGENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_OFF;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (use_vs(state) || state->vertex_declaration->position_transformed)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_LINEAR;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (state->render_states[WINED3D_RS_FOGVERTEXMODE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_NONE:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_LINEAR:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_LINEAR;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_EXP:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_EXP;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_EXP2:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_EXP2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (state->render_states[WINED3D_RS_FOGTABLEMODE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_LINEAR:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_LINEAR;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_EXP:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_EXP;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case WINED3D_FOG_EXP2:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog = WINED3D_FFP_PS_FOG_EXP2;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!gl_info->supported[ARB_FRAMEBUFFER_SRGB]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && state->render_states[WINED3D_RS_SRGBWRITEENABLE]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->sRGB_write = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync } else {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->sRGB_write = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (d3d_info->vs_clipping || !use_vs(state) || !state->render_states[WINED3D_RS_CLIPPING]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync || !state->render_states[WINED3D_RS_CLIPPLANEENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* No need to emulate clipplanes if GL supports native vertex shader clipping or if
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * the fixed function vertex pipeline is used(which always supports clipplanes), or
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * if no clipplane is enabled
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->emul_clipplanes = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync } else {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->emul_clipplanes = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct ffp_frag_settings *settings)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wine_rb_entry *entry = wine_rb_get(fragment_shaders, settings);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return entry ? WINE_RB_ENTRY_VALUE(entry, struct ffp_frag_desc, entry) : NULL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Note that the key is the implementation independent part of the ffp_frag_desc structure,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * whereas desc points to an extended structure with implementation specific parts. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (wine_rb_put(shaders, &desc->settings, &desc->entry) == -1)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ERR("Failed to insert ffp frag shader.\n");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Activates the texture dimension according to the bound D3D texture. Does
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * not care for the colorop or correct gl texture unit (when using nvrc).
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * Requires the caller to activate the correct unit. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller (state handler). */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid texture_activate_dimensions(const struct wined3d_texture *texture, const struct wined3d_gl_info *gl_info)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (texture)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync switch (texture->target)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_2D:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_3D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_3D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_CUBE_MAP_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_RECTANGLE_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glEnable(GL_TEXTURE_2D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_RECTANGLE_ARB:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_2D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_3D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_3D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_CUBE_MAP_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_RECTANGLE_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_3D:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_CUBE_MAP_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_RECTANGLE_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_2D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_3D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glEnable(GL_TEXTURE_3D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync case GL_TEXTURE_CUBE_MAP_ARB:
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_2D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_3D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_3D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_RECTANGLE_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_CUBE_MAP_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync break;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_2D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glEnable(GL_TEXTURE_2D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_3D);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_3D)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_CUBE_MAP_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_RECTANGLE_ARB);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* Binding textures is done by samplers. A dummy texture will be bound */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync/* Context activation is done by the caller (state handler). */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid sampler_texdim(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD sampler = state_id - STATE_SAMPLER(0);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync DWORD mapped_stage = context->swapchain->device->texUnitMap[sampler];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync /* No need to enable / disable anything here for unused samplers. The
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * tex_colorop handler takes care. Also no action is needed with pixel
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync * shaders, or if tex_colorop will take care of this business. */
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (sampler >= state->lowest_disabled_stage)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3D_TSS_COLOR_OP)))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync texture_activate_dimensions(state->textures[sampler], context->gl_info);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid *wined3d_rb_alloc(size_t size)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return HeapAlloc(GetProcessHeap(), 0, size);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid *wined3d_rb_realloc(void *ptr, size_t size)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return HeapReAlloc(GetProcessHeap(), 0, ptr, size);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid wined3d_rb_free(void *ptr)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync HeapFree(GetProcessHeap(), 0, ptr);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic int ffp_frag_program_key_compare(const void *key, const struct wine_rb_entry *entry)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct ffp_frag_settings *ka = key;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct ffp_frag_settings *kb = &WINE_RB_ENTRY_VALUE(entry, const struct ffp_frag_desc, entry)->settings;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return memcmp(ka, kb, sizeof(*ka));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst struct wine_rb_functions wined3d_ffp_frag_program_rb_functions =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_alloc,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_realloc,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_free,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ffp_frag_program_key_compare,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct wined3d_stream_info *si,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync struct wined3d_ffp_vs_settings *settings)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int coord_idx, i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (si->position_transformed)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync memset(settings, 0, sizeof(*settings));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
1675f41731e9e75ac43352afd2b690c08795b032vboxsync settings->transformed = 1;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->point_size = state->gl_primitive_type == GL_POINTS;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!state->render_states[WINED3D_RS_FOGENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_OFF;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (state->render_states[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_FOGCOORD;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < MAX_TEXTURES; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (coord_idx < MAX_TEXTURES && (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coord_idx))))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->texcoords |= 1 << i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->texgen[i] = (state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] >> WINED3D_FFP_TCI_SHIFT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync & WINED3D_FFP_TCI_MASK;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
1675f41731e9e75ac43352afd2b690c08795b032vboxsync settings->transformed = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->clipping = state->render_states[WINED3D_RS_CLIPPING]
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync && state->render_states[WINED3D_RS_CLIPPLANEENABLE];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->normal = !!(si->use_map & (1 << WINED3D_FFP_NORMAL));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->localviewer = !!state->render_states[WINED3D_RS_LOCALVIEWER];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->point_size = state->gl_primitive_type == GL_POINTS;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->render_states[WINED3D_RS_COLORVERTEX] && (si->use_map & (1 << WINED3D_FFP_DIFFUSE)))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->diffuse_source = state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->emission_source = state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->ambient_source = state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->specular_source = state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->diffuse_source = WINED3D_MCS_MATERIAL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->emission_source = WINED3D_MCS_MATERIAL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->ambient_source = WINED3D_MCS_MATERIAL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->specular_source = WINED3D_MCS_MATERIAL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->texcoords = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < MAX_TEXTURES; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (coord_idx < MAX_TEXTURES && (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coord_idx))))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->texcoords |= 1 << i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->texgen[i] = (state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] >> WINED3D_FFP_TCI_SHIFT)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync & WINED3D_FFP_TCI_MASK;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->light_type = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < MAX_ACTIVE_LIGHTS; ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->lights[i])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->light_type |= (state->lights[i]->OriginalParms.type
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync & WINED3D_FFP_LIGHT_TYPE_MASK) << WINED3D_FFP_LIGHT_TYPE_SHIFT(i);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync settings->ortho_fog = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (!state->render_states[WINED3D_RS_FOGENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_OFF;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (state->render_states[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH;
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync if (state->transforms[WINED3D_TS_PROJECTION].u.m[0][3] == 0.0f
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync && state->transforms[WINED3D_TS_PROJECTION].u.m[1][3] == 0.0f
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync && state->transforms[WINED3D_TS_PROJECTION].u.m[2][3] == 0.0f
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync && state->transforms[WINED3D_TS_PROJECTION].u.m[3][3] == 1.0f)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync settings->ortho_fog = 1;
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_FOGCOORD;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else if (state->render_states[WINED3D_RS_RANGEFOGENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_RANGE;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync else
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync settings->padding = 0;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncstatic int wined3d_ffp_vertex_program_key_compare(const void *key, const struct wine_rb_entry *entry)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_ffp_vs_settings *ka = key;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_ffp_vs_settings *kb = &WINE_RB_ENTRY_VALUE(entry,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_ffp_vs_desc, entry)->settings;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return memcmp(ka, kb, sizeof(*ka));
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst struct wine_rb_functions wined3d_ffp_vertex_program_rb_functions =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_alloc,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_realloc,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_rb_free,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync wined3d_ffp_vertex_program_key_compare,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync};
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncUINT wined3d_log2i(UINT32 x)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const UINT l[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync ~0U, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync };
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync UINT32 i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return (i = x >> 16) ? (x = i >> 8) ? l[x] + 24 : l[i] + 16 : (i = x >> 8) ? l[i] + 8 : l[x];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncconst struct blit_shader *wined3d_select_blitter(const struct wined3d_gl_info *gl_info, enum wined3d_blit_op blit_op,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const RECT *src_rect, DWORD src_usage, enum wined3d_pool src_pool, const struct wined3d_format *src_format,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const RECT *dst_rect, DWORD dst_usage, enum wined3d_pool dst_pool, const struct wined3d_format *dst_format)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync static const struct blit_shader * const blitters[] =
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync &arbfp_blit,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync &ffp_blit,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync &cpu_blit,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync };
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync unsigned int i;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync for (i = 0; i < sizeof(blitters) / sizeof(*blitters); ++i)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync {
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (blitters[i]->blit_supported(gl_info, blit_op,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync src_rect, src_usage, src_pool, src_format,
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync dst_rect, dst_usage, dst_pool, dst_format))
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return blitters[i];
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync }
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync return NULL;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsyncvoid wined3d_get_draw_rect(const struct wined3d_state *state, RECT *rect)
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync{
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync const struct wined3d_viewport *vp = &state->viewport;
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync SetRect(rect, vp->x, vp->y, vp->x + vp->width, vp->y + vp->height);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync if (state->render_states[WINED3D_RS_SCISSORTESTENABLE])
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync IntersectRect(rect, rect, &state->scissor_rect);
058c0c53c37f5cb271aeb3c385c10766f84f4aefvboxsync}
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync/* Print a floating point value with the %.8e format specifier, always using
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * '.' as decimal separator. */
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsyncvoid wined3d_ftoa(float value, char *s)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync{
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync int idx = 1;
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#ifdef VBOX_WITH_WINE_FIX_FTOA
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync const char * pszFormat = "%.8e";
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#endif
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync if (copysignf(1.0f, value) < 0.0f)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync {
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#ifdef VBOX_WITH_WINE_FIX_FTOA
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync /* s passed here is char[16]*/
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync pszFormat = "%.7e";
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#endif
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync ++idx;
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync }
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#ifdef VBOX_WITH_WINE_FIX_FTOA
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync sprintf(s, pszFormat, value);
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#else
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync sprintf(s, "%.8e", value);
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync#endif
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync if (isfinite(value))
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync s[idx] = '.';
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync}
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsyncvoid wined3d_release_dc(HWND window, HDC dc)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync{
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync /* You'd figure ReleaseDC() would fail if the DC doesn't match the window.
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * However, that's not what actually happens, and there are user32 tests
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * that confirm ReleaseDC() with the wrong window is supposed to succeed.
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * So explicitly check that the DC belongs to the window, since we want to
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * avoid releasing a DC that belongs to some other window if the original
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync * window was already destroyed. */
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync if (WindowFromDC(dc) != window)
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync WARN("DC %p does not belong to window %p.\n", dc, window);
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync else if (!ReleaseDC(window, dc))
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync ERR("Failed to release device context %p, last error %#x.\n", dc, GetLastError());
76f3927069cc452e77bf72f32d9175c0256ed3b3vboxsync}