- sync wined3d, ddraw, d3d8 and d3d9 with Wine 1.1.40
authorKamil Hornicek <kamil.hornicek@reactos.org>
Sat, 6 Mar 2010 14:49:14 +0000 (14:49 +0000)
committerKamil Hornicek <kamil.hornicek@reactos.org>
Sat, 6 Mar 2010 14:49:14 +0000 (14:49 +0000)
svn path=/trunk/; revision=45947

37 files changed:
reactos/dll/directx/wine/d3d8/d3d8_main.c
reactos/dll/directx/wine/d3d8/d3d8_private.h
reactos/dll/directx/wine/d3d8/device.c
reactos/dll/directx/wine/d3d9/d3d9_main.c
reactos/dll/directx/wine/d3d9/d3d9_private.h
reactos/dll/directx/wine/d3d9/device.c
reactos/dll/directx/wine/d3d9/directx.c
reactos/dll/directx/wine/d3d9/query.c
reactos/dll/directx/wine/d3d9/stateblock.c
reactos/dll/directx/wine/d3d9/swapchain.c
reactos/dll/directx/wine/ddraw/device.c
reactos/dll/directx/wine/ddraw/main.c
reactos/dll/directx/wine/ddraw/vertexbuffer.c
reactos/dll/directx/wine/ddraw/viewport.c
reactos/dll/directx/wine/wined3d/arb_program_shader.c
reactos/dll/directx/wine/wined3d/ati_fragment_shader.c
reactos/dll/directx/wine/wined3d/baseshader.c [deleted file]
reactos/dll/directx/wine/wined3d/buffer.c
reactos/dll/directx/wine/wined3d/context.c
reactos/dll/directx/wine/wined3d/device.c
reactos/dll/directx/wine/wined3d/directx.c
reactos/dll/directx/wine/wined3d/drawprim.c
reactos/dll/directx/wine/wined3d/glsl_shader.c
reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c
reactos/dll/directx/wine/wined3d/query.c
reactos/dll/directx/wine/wined3d/shader.c
reactos/dll/directx/wine/wined3d/shader_sm1.c
reactos/dll/directx/wine/wined3d/shader_sm4.c
reactos/dll/directx/wine/wined3d/state.c
reactos/dll/directx/wine/wined3d/surface.c
reactos/dll/directx/wine/wined3d/swapchain.c
reactos/dll/directx/wine/wined3d/utils.c
reactos/dll/directx/wine/wined3d/wined3d.rbuild
reactos/dll/directx/wine/wined3d/wined3d_gl.h
reactos/dll/directx/wine/wined3d/wined3d_private.h
reactos/include/reactos/wine/config.h
reactos/include/reactos/wine/wined3d.idl

index 6300371..c471049 100644 (file)
@@ -35,7 +35,7 @@ void WINAPI DebugSetMute(void) {
     /* nothing to do */
 }
 
-IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
+IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) {
     IDirect3D8Impl* object;
     TRACE("SDKVersion = %x\n", SDKVersion);
 
@@ -79,7 +79,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD* reserved2, BOOL bool, DWORD* toto)
 {
   HRESULT ret;
-  FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
+  static BOOL warned;
+
+  if (TRACE_ON(d3d8) || !warned) {
+      FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
+      warned = TRUE;
+  }
 
   if (!vertexshader)
       return E_FAIL;
@@ -109,7 +114,12 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD
 HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bool, DWORD* toto)
 {
   HRESULT ret;
-  FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+  static BOOL warned;
+
+  if (TRACE_ON(d3d8) || !warned) {
+      FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+      warned = TRUE;
+  }
 
   if (!pixelshader)
       return E_FAIL;
index 2c5f66f..4ba399b 100644 (file)
@@ -275,18 +275,6 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
         UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
         DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN;
 
-/* ------------------ */
-/* IDirect3DResource8 */
-/* ------------------ */
-
-/*****************************************************************************
- * Predeclare the interface implementation structures
- */
-extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl DECLSPEC_HIDDEN;
-
-/*****************************************************************************
- * IDirect3DResource8 implementation structure
- */
 struct IDirect3DResource8Impl
 {
     /* IUnknown fields */
index 5365640..11697b2 100644 (file)
@@ -1047,7 +1047,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) {
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
     HRESULT hr;
 
index 339cc61..c405a57 100644 (file)
@@ -33,7 +33,7 @@ void WINAPI DebugSetMute(void) {
     /* nothing to do */
 }
 
-IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
+IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) {
     IDirect3D9Impl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D9Impl));
 
     object->lpVtbl = &Direct3D9_Vtbl;
@@ -53,7 +53,7 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
     return (IDirect3D9*) object;
 }
 
-HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
+HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
     IDirect3D9 *ret;
     IDirect3D9Impl* object;
 
index 7736bea..eb3a032 100644 (file)
@@ -187,11 +187,6 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface,
         UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN;
 extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
-        D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface,
-        IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface,
         IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface,
@@ -228,9 +223,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevi
         UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface,
         UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
-        D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery) DECLSPEC_HIDDEN;
-
 
 /* ---------------- */
 /* IDirect3DVolume9 */
@@ -470,6 +462,8 @@ typedef struct  IDirect3DStateBlock9Impl {
     LPDIRECT3DDEVICE9EX       parentDevice;
 } IDirect3DStateBlock9Impl;
 
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+        D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) DECLSPEC_HIDDEN;
 
 /* --------------------------- */
 /* IDirect3DVertexDeclaration9 */
@@ -564,4 +558,7 @@ typedef struct IDirect3DQuery9Impl {
     LPDIRECT3DDEVICE9EX    parentDevice;
 } IDirect3DQuery9Impl;
 
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device,
+        D3DQUERYTYPE type) DECLSPEC_HIDDEN;
+
 #endif /* __WINE_D3D9_PRIVATE_H */
index 6b70c84..79a9ba0 100644 (file)
@@ -248,7 +248,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_AddRef(LPDIRECT3DDEVICE9EX iface) {
     return ref;
 }
 
-static ULONG WINAPI  IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
+static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     ULONG ref;
 
@@ -452,7 +452,7 @@ static BOOL     WINAPI  IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX ifac
     return ret;
 }
 
-static HRESULT WINAPI  IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
         D3DPRESENT_PARAMETERS *present_parameters, IDirect3DSwapChain9 **swapchain)
 {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
@@ -541,7 +541,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data
     return ret;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     WINED3DPRESENT_PARAMETERS localParameters;
     HRESULT hr;
@@ -619,7 +619,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DP
     return hr;
 }
 
-static HRESULT  WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
  pDirtyRegion) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
@@ -1182,7 +1182,7 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9EX ifac
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -1388,7 +1388,7 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9EX if
     return hr;
 }
 
-static HRESULT  WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -1414,6 +1414,97 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9EX
     return hr;
 }
 
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
+        D3DSTATEBLOCKTYPE type, IDirect3DStateBlock9 **stateblock)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IDirect3DStateBlock9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, type %#x, stateblock %p.\n", iface, type, stateblock);
+
+    if (type != D3DSBT_ALL && type != D3DSBT_PIXELSTATE && type != D3DSBT_VERTEXSTATE)
+    {
+        WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL.\n");
+        return D3DERR_INVALIDCALL;
+    }
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate stateblock memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    hr = stateblock_init(object, This, type, NULL);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created stateblock %p.\n", object);
+    *stateblock = (IDirect3DStateBlock9 *)object;
+
+    return D3D_OK;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    HRESULT hr;
+
+    TRACE("iface %p.\n", iface);
+
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
+    wined3d_mutex_unlock();
+
+    return hr;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **stateblock)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IWineD3DStateBlock *wined3d_stateblock;
+    IDirect3DStateBlock9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, stateblock %p.\n", iface, stateblock);
+
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice, &wined3d_stateblock);
+    wined3d_mutex_unlock();
+    if (FAILED(hr))
+    {
+       WARN("IWineD3DDevice_EndStateBlock() failed, hr %#x.\n", hr);
+       return hr;
+    }
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate stateblock memory.\n");
+        IWineD3DStateBlock_Release(wined3d_stateblock);
+        return E_OUTOFMEMORY;
+    }
+
+    hr = stateblock_init(object, This, 0, wined3d_stateblock);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+        IWineD3DStateBlock_Release(wined3d_stateblock);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created stateblock %p.\n", object);
+    *stateblock = (IDirect3DStateBlock9 *)object;
+
+    return D3D_OK;
+}
+
 static HRESULT  WINAPI  IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9EX iface, CONST D3DCLIPSTATUS9* pClipStatus) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
@@ -1559,7 +1650,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(IDirect3DDevice9Ex *i
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -2178,6 +2269,37 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9EX ifa
     return hr;
 }
 
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
+        D3DQUERYTYPE type, IDirect3DQuery9 **query)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IDirect3DQuery9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, type %#x, query %p.\n", iface, type, query);
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate query memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    hr = query_init(object, This, type);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize query, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created query %p.\n", object);
+    if (query) *query = (IDirect3DQuery9 *)object;
+    else IDirect3DQuery9_Release((IDirect3DQuery9 *)object);
+
+    return D3D_OK;
+}
+
 static HRESULT WINAPI IDirect3DDevice9ExImpl_SetConvolutionMonoKernel(IDirect3DDevice9Ex *iface,
         UINT width, UINT height, float *rows, float *columns)
 {
index 5f5e8f9..1fcc8c4 100644 (file)
@@ -407,7 +407,7 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN
     return ret;
 }
 
-static HRESULT WINAPI IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
         D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters,
         IDirect3DDevice9 **device)
 {
@@ -465,7 +465,7 @@ static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterDisplayModeEx(IDirect3D9Ex *ifa
     return D3DERR_DRIVERINTERNALERROR;
 }
 
-static HRESULT WINAPI IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
         UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags,
         D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode, IDirect3DDevice9Ex **device)
 {
index ecb2e71..a38dc9d 100644 (file)
@@ -150,49 +150,24 @@ static const IDirect3DQuery9Vtbl Direct3DQuery9_Vtbl =
     IDirect3DQuery9Impl_GetData
 };
 
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3DQUERYTYPE type)
+{
+    HRESULT hr;
 
-/* IDirect3DDevice9 IDirect3DQuery9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) {
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-    IDirect3DQuery9Impl *object = NULL;
-    HRESULT hr = D3D_OK;
-
-    TRACE("iface %p, type %#x, query %p.\n", iface, Type, ppQuery);
+    query->lpVtbl = &Direct3DQuery9_Vtbl;
+    query->ref = 1;
 
-    if (!ppQuery)
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery, (IUnknown *)query);
+    wined3d_mutex_unlock();
+    if (FAILED(hr))
     {
-        wined3d_mutex_lock();
-        hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, NULL, NULL);
-        wined3d_mutex_unlock();
-
+        WARN("Failed to create wined3d query, hr %#x.\n", hr);
         return hr;
     }
 
-    /* Allocate the storage for the device */
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DQuery9Impl));
-    if (NULL == object) {
-        ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n");
-        return D3DERR_OUTOFVIDEOMEMORY;
-    }
+    query->parentDevice = (IDirect3DDevice9Ex *)device;
+    IDirect3DDevice9Ex_AddRef(query->parentDevice);
 
-    object->lpVtbl = &Direct3DQuery9_Vtbl;
-    object->ref = 1;
-
-    wined3d_mutex_lock();
-    hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, &object->wineD3DQuery, (IUnknown *)object);
-    wined3d_mutex_unlock();
-
-    if (FAILED(hr)) {
-
-        /* free up object */
-        WARN("(%p) call to IWineD3DDevice_CreateQuery failed\n", This);
-        HeapFree(GetProcessHeap(), 0, object);
-    } else {
-        IDirect3DDevice9Ex_AddRef(iface);
-        object->parentDevice = iface;
-        *ppQuery = (LPDIRECT3DQUERY9) object;
-        TRACE("(%p) : Created query %p\n", This , object);
-    }
-    TRACE("(%p) : returning %x\n", This, hr);
-    return hr;
+    return D3D_OK;
 }
index 7cd3ba6..c4941db 100644 (file)
@@ -123,87 +123,33 @@ static const IDirect3DStateBlock9Vtbl Direct3DStateBlock9_Vtbl =
     IDirect3DStateBlock9Impl_Apply
 };
 
-
-/* IDirect3DDevice9 IDirect3DStateBlock9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppStateBlock) {
-   IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-   IDirect3DStateBlock9Impl* object;
-   HRESULT hrc = D3D_OK;
-
-   TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, ppStateBlock);
-
-   if(Type != D3DSBT_ALL         && Type != D3DSBT_PIXELSTATE &&
-      Type != D3DSBT_VERTEXSTATE                              ) {
-       WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL\n");
-       return D3DERR_INVALIDCALL;
-   }
-
-   object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
-   if (NULL == object) return E_OUTOFMEMORY;
-   object->lpVtbl = &Direct3DStateBlock9_Vtbl;
-   object->ref = 1;
-
-   wined3d_mutex_lock();
-   hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown*)object);
-   wined3d_mutex_unlock();
-
-   if(hrc != D3D_OK){
-       FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This);
-       HeapFree(GetProcessHeap(), 0, object);
-   } else {
-        IDirect3DDevice9Ex_AddRef(iface);
-        object->parentDevice = iface;
-        *ppStateBlock = (IDirect3DStateBlock9*)object;
-        TRACE("(%p) : Created stateblock %p\n", This, object);
-   }
-   TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object);
-   return hrc;
-}
-
-HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+        D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock)
 {
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
-    TRACE("iface %p.\n", iface);
-
-    wined3d_mutex_lock();
-    hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
-    wined3d_mutex_unlock();
-
-    return hr;
-}
+    stateblock->lpVtbl = &Direct3DStateBlock9_Vtbl;
+    stateblock->ref = 1;
 
-HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **ppSB)
-{
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-    IWineD3DStateBlock *wineD3DStateBlock;
-    IDirect3DStateBlock9Impl *object;
-    HRESULT hr;
-
-    TRACE("iface %p, stateblock %p.\n", iface, ppSB);
-
-    /* Tell wineD3D to endstateblock before anything else (in case we run out
-     * of memory later and cause locking problems) */
-    wined3d_mutex_lock();
-    hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock);
-    wined3d_mutex_unlock();
-
-    if (hr!= D3D_OK)
+    if (wined3d_stateblock)
     {
-       WARN("IWineD3DDevice_EndStateBlock returned an error\n");
-       return hr;
+        stateblock->wineD3DStateBlock = wined3d_stateblock;
     }
-    /* allocate a new IDirectD3DStateBlock */
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
-    if (!object) return E_OUTOFMEMORY;
-    object->ref = 1;
-    object->lpVtbl = &Direct3DStateBlock9_Vtbl;
-    object->wineD3DStateBlock = wineD3DStateBlock;
-
-    IDirect3DDevice9Ex_AddRef(iface);
-    object->parentDevice = iface;
-    *ppSB=(IDirect3DStateBlock9*)object;
-    TRACE("(%p) Returning *ppSB %p, wineD3DStateBlock %p\n", This, *ppSB, wineD3DStateBlock);
+    else
+    {
+        wined3d_mutex_lock();
+        hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)type,
+                &stateblock->wineD3DStateBlock, (IUnknown *)stateblock);
+        wined3d_mutex_unlock();
+        if (FAILED(hr))
+        {
+            WARN("Failed to create wined3d stateblock, hr %#x.\n", hr);
+            return hr;
+        }
+    }
+
+    stateblock->parentDevice = (IDirect3DDevice9Ex *)device;
+    IDirect3DDevice9Ex_AddRef(stateblock->parentDevice);
+
     return D3D_OK;
 }
index 2075045..c692371 100644 (file)
@@ -79,7 +79,7 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface)
 }
 
 /* IDirect3DSwapChain9 parts follow: */
-static HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
     IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
     HRESULT hr;
 
@@ -269,7 +269,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
     return D3D_OK;
 }
 
-HRESULT  WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
+HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hrc = D3D_OK;
     IWineD3DSwapChain *swapchain = NULL;
index 67fc6f5..13ecfa1 100644 (file)
@@ -1705,13 +1705,13 @@ IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface)
     else return D3DERR_SCENE_NOT_IN_SCENE;
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 IDirect3DDeviceImpl_7_EndScene_FPUSetup(IDirect3DDevice7 *iface)
 {
     return IDirect3DDeviceImpl_7_EndScene(iface);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
 {
     HRESULT hr;
@@ -1724,7 +1724,7 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
     return hr;
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device3(iface);
@@ -1732,7 +1732,7 @@ Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device2(iface);
@@ -1740,7 +1740,7 @@ Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device1(iface);
@@ -2580,7 +2580,8 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
                 }
 
                 if (!(colorop == WINED3DTOP_MODULATE && colorarg1 == WINED3DTA_TEXTURE && colorarg2 == WINED3DTA_CURRENT &&
-                      alphaop == WINED3DTOP_SELECTARG1 && alphaarg1 == (tex_alpha ? WINED3DTA_TEXTURE : WINED3DTA_CURRENT)))
+                      alphaop == (tex_alpha ? WINED3DTOP_SELECTARG1 : WINED3DTOP_SELECTARG2) &&
+                      alphaarg1 == WINED3DTA_TEXTURE && alphaarg2 == WINED3DTA_CURRENT))
                 {
                     ERR("Unexpected texture stage state setup, returning D3DTBLEND_MODULATE - likely erroneous\n");
                 }
@@ -2852,16 +2853,12 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
                         IWineD3DBaseTexture_Release(tex);
                     }
 
-                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
                     if (tex_alpha)
-                    {
-                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
-                    }
+                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
                     else
-                    {
-                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
-                    }
-
+                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
+                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
+                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG2, WINED3DTA_CURRENT);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG1, WINED3DTA_TEXTURE);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG2, WINED3DTA_CURRENT);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLOROP, WINED3DTOP_MODULATE);
@@ -4664,15 +4661,11 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
             IWineD3DBaseTexture_Release(tex);
         }
 
-        /* alphaop is WINED3DTOP_SELECTARG1 if it's D3DTBLEND_MODULATE, so only modify alphaarg1 */
+        /* Arg 1/2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */
         if (tex_alpha)
-        {
-            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
-        }
+            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
         else
-        {
-            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
-        }
+            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
     }
 
     LeaveCriticalSection(&ddraw_cs);
index 079800d..bc23987 100644 (file)
@@ -302,7 +302,7 @@ err_out:
  * Arguments, return values: See DDRAW_Create
  *
  ***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
 DirectDrawCreate(GUID *GUID,
                  LPDIRECTDRAW *DD,
                  IUnknown *UnkOuter)
@@ -325,7 +325,7 @@ DirectDrawCreate(GUID *GUID,
  * Arguments, return values: See DDRAW_Create
  *
  ***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
 DirectDrawCreateEx(GUID *GUID,
                    LPVOID *DD,
                    REFIID iid,
@@ -742,14 +742,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  */
 HRESULT WINAPI DllCanUnloadNow(void)
 {
-    HRESULT hr;
-    FIXME("(void): stub\n");
-
-    EnterCriticalSection(&ddraw_cs);
-    hr = S_FALSE;
-    LeaveCriticalSection(&ddraw_cs);
-
-    return hr;
+    return S_FALSE;
 }
 
 /*******************************************************************************
index df7528b..f16cf12 100644 (file)
@@ -236,8 +236,17 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
     IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     WINED3DBUFFER_DESC Desc;
     HRESULT hr;
+    DWORD wined3d_flags = 0;
     TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size);
 
+    /* Writeonly: Pointless. Event: Unsupported by native according to the sdk
+     * nosyslock: Not applicable
+     */
+    if(!(Flags & DDLOCK_WAIT))          wined3d_flags |= WINED3DLOCK_DONOTWAIT;
+    if(Flags & DDLOCK_READONLY)         wined3d_flags |= WINED3DLOCK_READONLY;
+    if(Flags & DDLOCK_NOOVERWRITE)      wined3d_flags |= WINED3DLOCK_NOOVERWRITE;
+    if(Flags & DDLOCK_DISCARDCONTENTS)  wined3d_flags |= WINED3DLOCK_DISCARD;
+
     EnterCriticalSection(&ddraw_cs);
     if(Size)
     {
@@ -253,7 +262,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
     }
 
     hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, 0 /* OffsetToLock */,
-            0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, Flags);
+            0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, wined3d_flags);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
index 9b06989..b637df1 100644 (file)
@@ -255,14 +255,25 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
 
     EnterCriticalSection(&ddraw_cs);
-    if (This->use_vp2 != 0) {
-        ERR("  Requesting to get a D3DVIEWPORT struct where a D3DVIEWPORT2 was set !\n");
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_INVALIDPARAMS;
-    }
     dwSize = lpData->dwSize;
     memset(lpData, 0, dwSize);
-    memcpy(lpData, &(This->viewports.vp1), dwSize);
+    if (!This->use_vp2)
+        memcpy(lpData, &(This->viewports.vp1), dwSize);
+    else {
+        D3DVIEWPORT vp1;
+        vp1.dwSize = sizeof(vp1);
+        vp1.dwX = This->viewports.vp2.dwX;
+        vp1.dwY = This->viewports.vp2.dwY;
+        vp1.dwWidth = This->viewports.vp2.dwWidth;
+        vp1.dwHeight = This->viewports.vp2.dwHeight;
+        vp1.dvMaxX = 0.0;
+        vp1.dvMaxY = 0.0;
+        vp1.dvScaleX = 0.0;
+        vp1.dvScaleY = 0.0;
+        vp1.dvMinZ = This->viewports.vp2.dvMinZ;
+        vp1.dvMaxZ = This->viewports.vp2.dvMaxZ;
+        memcpy(lpData, &vp1, dwSize);
+    }
 
     if (TRACE_ON(d3d7)) {
         TRACE("  returning D3DVIEWPORT :\n");
@@ -908,14 +919,25 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
     TRACE("(%p)->(%p)\n", This, lpData);
 
     EnterCriticalSection(&ddraw_cs);
-    if (This->use_vp2 != 1) {
-        ERR("  Requesting to get a D3DVIEWPORT2 struct where a D3DVIEWPORT was set !\n");
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_INVALIDPARAMS;
-    }
     dwSize = lpData->dwSize;
     memset(lpData, 0, dwSize);
-    memcpy(lpData, &(This->viewports.vp2), dwSize);
+    if (This->use_vp2)
+        memcpy(lpData, &(This->viewports.vp2), dwSize);
+    else {
+        D3DVIEWPORT2 vp2;
+        vp2.dwSize = sizeof(vp2);
+        vp2.dwX = This->viewports.vp1.dwX;
+        vp2.dwY = This->viewports.vp1.dwY;
+        vp2.dwWidth = This->viewports.vp1.dwWidth;
+        vp2.dwHeight = This->viewports.vp1.dwHeight;
+        vp2.dvClipX = 0.0;
+        vp2.dvClipY = 0.0;
+        vp2.dvClipWidth = 0.0;
+        vp2.dvClipHeight = 0.0;
+        vp2.dvMinZ = This->viewports.vp1.dvMinZ;
+        vp2.dvMaxZ = This->viewports.vp1.dvMaxZ;
+        memcpy(lpData, &vp2, dwSize);
+    }
 
     if (TRACE_ON(d3d7)) {
         TRACE("  returning D3DVIEWPORT2 :\n");
index 1fdae2a..cf76386 100644 (file)
@@ -41,6 +41,45 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
 
 #define GLINFO_LOCATION      (*gl_info)
 
+/* Extract a line. Note that this modifies the source string. */
+static char *get_line(char **ptr)
+{
+    char *p, *q;
+
+    p = *ptr;
+    if (!(q = strstr(p, "\n")))
+    {
+        if (!*p) return NULL;
+        *ptr += strlen(p);
+        return p;
+    }
+    *q = '\0';
+    *ptr = q + 1;
+
+    return p;
+}
+
+static void shader_arb_dump_program_source(const char *source)
+{
+    unsigned long source_size;
+    char *ptr, *line, *tmp;
+
+    source_size = strlen(source) + 1;
+    tmp = HeapAlloc(GetProcessHeap(), 0, source_size);
+    if (!tmp)
+    {
+        ERR("Failed to allocate %lu bytes for shader source.\n", source_size);
+        return;
+    }
+    memcpy(tmp, source, source_size);
+
+    ptr = tmp;
+    while ((line = get_line(&ptr))) FIXME("    %s\n", line);
+    FIXME("\n");
+
+    HeapFree(GetProcessHeap(), 0, tmp);
+}
+
 /* GL locking for state handlers is done by the caller. */
 static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
 {
@@ -1122,10 +1161,10 @@ static void gen_color_correction(struct wined3d_shader_buffer *buffer, const cha
 {
     DWORD mask;
 
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
-        FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+        enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+        FIXME("Complex fixup (%#x) not supported\n", complex_fixup);
         return;
     }
 
@@ -1761,8 +1800,8 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     const struct wined3d_shader_dst_param *dst = &ins->dst[0];
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
@@ -1856,8 +1895,8 @@ static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins)
 static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins)
 {
      struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-     IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+     IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+     IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
      DWORD flags;
 
      DWORD reg1 = ins->dst[0].reg.idx;
@@ -1904,7 +1943,8 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
     const struct wined3d_shader_dst_param *dst = &ins->dst[0];
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     char reg_coord[40], dst_reg[50], src_reg[50];
@@ -1936,8 +1976,8 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
     /* with projective textures, texbem only divides the static texture coord, not the displacement,
      * so we can't let the GL handle this.
      */
-    if (((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS]
-            & WINED3DTTFF_PROJECTED) {
+    if (device->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED)
+    {
         shader_addline(buffer, "RCP TB.w, %s.w;\n", reg_coord);
         shader_addline(buffer, "MUL TB.xy, %s, TB.w;\n", reg_coord);
         shader_addline(buffer, "ADD TA.xy, TA, TB;\n");
@@ -1975,8 +2015,8 @@ static void pshader_hw_texm3x2pad(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -1997,10 +2037,10 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char src0_name[50], dst_name[50];
     struct wined3d_shader_register tmp_reg = ins->dst[0].reg;
     BOOL is_color;
@@ -2020,12 +2060,12 @@ static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char dst_str[50];
     char src0_name[50], dst_name[50];
     BOOL is_color;
@@ -2043,12 +2083,12 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char dst_str[50];
     char src0_name[50];
     char dst_reg[50];
@@ -2085,11 +2125,11 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins
 
 static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     char dst_str[50];
     char src0_name[50];
@@ -3046,8 +3086,9 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Vertex program error at position %d: %s\n", pos,
+        FIXME("Vertex program error at position %d: %s\n\n", pos,
             debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(blt_vprogram);
     }
     else
     {
@@ -3108,8 +3149,9 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
             debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(blt_fprograms[tex_type]);
     }
     else
     {
@@ -3564,8 +3606,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     if (errPos != -1)
     {
-        FIXME("HW PixelShader Error at position %d: %s\n",
+        FIXME("HW PixelShader Error at position %d: %s\n\n",
               errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer->buffer);
         retval = 0;
     }
     else
@@ -3974,8 +4017,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     if (errPos != -1)
     {
-        FIXME("HW VertexShader Error at position %d: %s\n",
+        FIXME("HW VertexShader Error at position %d: %s\n\n",
               errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer->buffer);
         ret = -1;
     }
     else
@@ -4448,8 +4492,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
     if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type))
     {
-        IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
-        struct arb_pshader_private *shader_data = This->baseShader.backend_data;
+        struct arb_pshader_private *shader_data = baseShader->baseShader.backend_data;
         UINT i;
 
         if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4471,10 +4514,11 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
         HeapFree(GetProcessHeap(), 0, shader_data);
-        This->baseShader.backend_data = NULL;
-    } else {
-        IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
-        struct arb_vshader_private *shader_data = This->baseShader.backend_data;
+        baseShader->baseShader.backend_data = NULL;
+    }
+    else
+    {
+        struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data;
         UINT i;
 
         if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4496,7 +4540,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
         HeapFree(GetProcessHeap(), 0, shader_data);
-        This->baseShader.backend_data = NULL;
+        baseShader->baseShader.backend_data = NULL;
     }
 }
 
@@ -4565,8 +4609,7 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
     return TRUE;
 }
 
-static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info,
-        struct shader_caps *pCaps)
+static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
 {
     DWORD vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
     DWORD ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
@@ -4574,7 +4617,7 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_
     /* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps,
      * then overwrite the shader specific ones
      */
-    none_shader_backend.shader_get_caps(devtype, gl_info, pCaps);
+    none_shader_backend.shader_get_caps(gl_info, pCaps);
 
     if (gl_info->supported[ARB_VERTEX_PROGRAM])
     {
@@ -4630,8 +4673,8 @@ static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
         dump_color_fixup_desc(fixup);
     }
 
-    /* We support everything except YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    /* We support everything except complex conversions. */
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[OK]\n");
         return TRUE;
@@ -4678,6 +4721,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_CMP           */ pshader_hw_cmp,
     /* WINED3DSIH_CND           */ pshader_hw_cnd,
     /* WINED3DSIH_CRS           */ shader_hw_map2gl,
+    /* WINED3DSIH_CUT           */ NULL,
     /* WINED3DSIH_DCL           */ NULL,
     /* WINED3DSIH_DEF           */ NULL,
     /* WINED3DSIH_DEFB          */ NULL,
@@ -4689,20 +4733,24 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_DSX           */ shader_hw_map2gl,
     /* WINED3DSIH_DSY           */ shader_hw_dsy,
     /* WINED3DSIH_ELSE          */ shader_hw_else,
+    /* WINED3DSIH_EMIT          */ NULL,
     /* WINED3DSIH_ENDIF         */ shader_hw_endif,
     /* WINED3DSIH_ENDLOOP       */ shader_hw_endloop,
     /* WINED3DSIH_ENDREP        */ shader_hw_endrep,
     /* WINED3DSIH_EXP           */ shader_hw_scalar_op,
     /* WINED3DSIH_EXPP          */ shader_hw_scalar_op,
     /* WINED3DSIH_FRC           */ shader_hw_map2gl,
+    /* WINED3DSIH_IADD          */ NULL,
     /* WINED3DSIH_IF            */ NULL /* Hardcoded into the shader */,
     /* WINED3DSIH_IFC           */ shader_hw_ifc,
+    /* WINED3DSIH_IGE           */ NULL,
     /* WINED3DSIH_LABEL         */ shader_hw_label,
     /* WINED3DSIH_LIT           */ shader_hw_map2gl,
     /* WINED3DSIH_LOG           */ shader_hw_log_pow,
     /* WINED3DSIH_LOGP          */ shader_hw_log_pow,
     /* WINED3DSIH_LOOP          */ shader_hw_loop,
     /* WINED3DSIH_LRP           */ shader_hw_lrp,
+    /* WINED3DSIH_LT            */ NULL,
     /* WINED3DSIH_M3x2          */ shader_hw_mnxn,
     /* WINED3DSIH_M3x3          */ shader_hw_mnxn,
     /* WINED3DSIH_M3x4          */ shader_hw_mnxn,
@@ -5229,7 +5277,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
     }
 }
 
-static void arbfp_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
 {
     caps->TextureOpCaps =  WINED3DTEXOPCAPS_DISABLE                     |
                            WINED3DTEXOPCAPS_SELECTARG1                  |
@@ -5858,8 +5906,9 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
               debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
     }
     else
     {
@@ -6180,6 +6229,7 @@ struct arbfp_blit_priv {
     GLenum yuy2_rect_shader, yuy2_2d_shader;
     GLenum uyvy_rect_shader, uyvy_2d_shader;
     GLenum yv12_rect_shader, yv12_2d_shader;
+    GLenum p8_rect_shader, p8_2d_shader;
 };
 
 static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
@@ -6204,20 +6254,22 @@ static void arbfp_blit_free(IWineD3DDevice *iface) {
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_2d_shader));
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_rect_shader));
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_2d_shader));
-    checkGLcall("Delete yuv programs");
+    GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader));
+    GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader));
+    checkGLcall("Delete yuv and p8 programs");
     LEAVE_GL();
 
     HeapFree(GetProcessHeap(), 0, device->blit_priv);
     device->blit_priv = NULL;
 }
 
-static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum yuv_fixup yuv_fixup,
+static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum complex_fixup fixup,
         GLenum textype, char *luminance)
 {
     char chroma;
     const char *tex, *texinstr;
 
-    if (yuv_fixup == YUV_FIXUP_UYVY) {
+    if (fixup == COMPLEX_FIXUP_UYVY) {
         chroma = 'x';
         *luminance = 'w';
     } else {
@@ -6445,8 +6497,74 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype,
     return TRUE;
 }
 
+static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
+{
+    GLenum shader;
+    struct wined3d_shader_buffer buffer;
+    struct arbfp_blit_priv *priv = device->blit_priv;
+    GLint pos;
+
+    /* Shader header */
+    if (!shader_buffer_init(&buffer))
+    {
+        ERR("Failed to initialize shader buffer.\n");
+        return 0;
+    }
+
+    ENTER_GL();
+    GL_EXTCALL(glGenProgramsARB(1, &shader));
+    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader));
+    LEAVE_GL();
+    if(!shader) {
+        shader_buffer_free(&buffer);
+        return 0;
+    }
+
+    shader_addline(&buffer, "!!ARBfp1.0\n");
+    shader_addline(&buffer, "TEMP index;\n");
+
+    /* { 255/256, 0.5/255*255/256, 0, 0 } */
+    shader_addline(&buffer, "PARAM constants = { 0.996, 0.00195, 0, 0 };\n");
+
+    /* The alpha-component contains the palette index */
+    if(textype == GL_TEXTURE_RECTANGLE_ARB)
+        shader_addline(&buffer, "TXP index, fragment.texcoord[0], texture[0], RECT;\n");
+    else
+        shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], 2D;\n");
+
+    /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
+    shader_addline(&buffer, "MAD index.a, index.a, constants.x, constants.y;\n");
+
+    /* Use the alpha-component as an index in the palette to get the final color */
+    shader_addline(&buffer, "TEX result.color, index.a, texture[1], 1D;\n");
+    shader_addline(&buffer, "END\n");
+
+    ENTER_GL();
+    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+            strlen(buffer.buffer), buffer.buffer));
+    checkGLcall("glProgramStringARB()");
+
+    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+    if (pos != -1)
+    {
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
+              debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
+    }
+
+    if (textype == GL_TEXTURE_RECTANGLE_ARB)
+        priv->p8_rect_shader = shader;
+    else
+        priv->p8_2d_shader = shader;
+
+    shader_buffer_free(&buffer);
+    LEAVE_GL();
+
+    return shader;
+}
+
 /* Context activation is done by the caller. */
-static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixup, GLenum textype)
+static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype)
 {
     GLenum shader;
     struct wined3d_shader_buffer buffer;
@@ -6519,8 +6637,8 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
 
     switch (yuv_fixup)
     {
-        case YUV_FIXUP_UYVY:
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_UYVY:
+        case COMPLEX_FIXUP_YUY2:
             if (!gen_planar_yuv_read(&buffer, yuv_fixup, textype, &luminance_component))
             {
                 shader_buffer_free(&buffer);
@@ -6528,7 +6646,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
             }
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             if (!gen_yv12_read(&buffer, textype, &luminance_component))
             {
                 shader_buffer_free(&buffer);
@@ -6562,8 +6680,9 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
               debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
     }
     else
     {
@@ -6579,20 +6698,22 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
 
     switch (yuv_fixup)
     {
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_YUY2:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yuy2_rect_shader = shader;
             else priv->yuy2_2d_shader = shader;
             break;
 
-        case YUV_FIXUP_UYVY:
+        case COMPLEX_FIXUP_UYVY:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->uyvy_rect_shader = shader;
             else priv->uyvy_2d_shader = shader;
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yv12_rect_shader = shader;
             else priv->yv12_2d_shader = shader;
             break;
+        default:
+            ERR("Unsupported complex fixup: %d\n", yuv_fixup);
     }
 
     return shader;
@@ -6606,9 +6727,9 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
     float size[4] = {width, height, 1, 1};
     struct arbfp_blit_priv *priv = device->blit_priv;
-    enum yuv_fixup yuv_fixup;
+    enum complex_fixup fixup;
 
-    if (!is_yuv_fixup(format_desc->color_fixup))
+    if (!is_complex_fixup(format_desc->color_fixup))
     {
         TRACE("Fixup:\n");
         dump_color_fixup_desc(format_desc->color_fixup);
@@ -6620,24 +6741,29 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
         return WINED3D_OK;
     }
 
-    yuv_fixup = get_yuv_fixup(format_desc->color_fixup);
+    fixup = get_complex_fixup(format_desc->color_fixup);
 
-    switch(yuv_fixup)
+    switch(fixup)
     {
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_YUY2:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yuy2_rect_shader : priv->yuy2_2d_shader;
             break;
 
-        case YUV_FIXUP_UYVY:
+        case COMPLEX_FIXUP_UYVY:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->uyvy_rect_shader : priv->uyvy_2d_shader;
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yv12_rect_shader : priv->yv12_2d_shader;
             break;
 
+        case COMPLEX_FIXUP_P8:
+            shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->p8_rect_shader : priv->p8_2d_shader;
+            if (!shader) shader = gen_p8_shader(device, textype);
+            break;
+
         default:
-            FIXME("Unsupported YUV fixup %#x, not setting a shader\n", yuv_fixup);
+            FIXME("Unsupported complex fixup %#x, not setting a shader\n", fixup);
             ENTER_GL();
             glEnable(textype);
             checkGLcall("glEnable(textype)");
@@ -6645,7 +6771,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
             return E_NOTIMPL;
     }
 
-    if (!shader) shader = gen_yuv_shader(device, yuv_fixup, textype);
+    if (!shader) shader = gen_yuv_shader(device, fixup, textype);
 
     ENTER_GL();
     glEnable(GL_FRAGMENT_PROGRAM_ARB);
@@ -6684,7 +6810,7 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) {
 
 static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
 {
-    enum yuv_fixup yuv_fixup;
+    enum complex_fixup complex_fixup;
 
     if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
     {
@@ -6699,23 +6825,24 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
     }
 
     /* We only support YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[FAILED]\n");
         return FALSE;
     }
 
-    yuv_fixup = get_yuv_fixup(fixup);
-    switch(yuv_fixup)
+    complex_fixup = get_complex_fixup(fixup);
+    switch(complex_fixup)
     {
-        case YUV_FIXUP_YUY2:
-        case YUV_FIXUP_UYVY:
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YUY2:
+        case COMPLEX_FIXUP_UYVY:
+        case COMPLEX_FIXUP_YV12:
+        case COMPLEX_FIXUP_P8:
             TRACE("[OK]\n");
             return TRUE;
 
         default:
-            FIXME("Unsupported YUV fixup %#x\n", yuv_fixup);
+            FIXME("Unsupported YUV fixup %#x\n", complex_fixup);
             TRACE("[FAILED]\n");
             return FALSE;
     }
index becd447..0f911e9 100644 (file)
@@ -1061,7 +1061,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
     LEAVE_GL();
 }
 
-static void atifs_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
 {
     caps->TextureOpCaps =  WINED3DTEXOPCAPS_DISABLE                     |
                            WINED3DTEXOPCAPS_SELECTARG1                  |
diff --git a/reactos/dll/directx/wine/wined3d/baseshader.c b/reactos/dll/directx/wine/wined3d/baseshader.c
deleted file mode 100644 (file)
index 14416c4..0000000
+++ /dev/null
@@ -1,1439 +0,0 @@
-/*
- * shaders implementation
- *
- * Copyright 2002-2003 Jason Edmeades
- * Copyright 2002-2003 Raphael Junqueira
- * Copyright 2004 Christian Costa
- * Copyright 2005 Oliver Stieber
- * Copyright 2006 Ivan Gyurdiev
- * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
- * Copyright 2009 Henri Verbeet for CodeWeavers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include <string.h>
-#include <stdio.h>
-#include "wined3d_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
-WINE_DECLARE_DEBUG_CHANNEL(d3d);
-
-static const char *shader_opcode_names[] =
-{
-    /* WINED3DSIH_ABS           */ "abs",
-    /* WINED3DSIH_ADD           */ "add",
-    /* WINED3DSIH_BEM           */ "bem",
-    /* WINED3DSIH_BREAK         */ "break",
-    /* WINED3DSIH_BREAKC        */ "breakc",
-    /* WINED3DSIH_BREAKP        */ "breakp",
-    /* WINED3DSIH_CALL          */ "call",
-    /* WINED3DSIH_CALLNZ        */ "callnz",
-    /* WINED3DSIH_CMP           */ "cmp",
-    /* WINED3DSIH_CND           */ "cnd",
-    /* WINED3DSIH_CRS           */ "crs",
-    /* WINED3DSIH_DCL           */ "dcl",
-    /* WINED3DSIH_DEF           */ "def",
-    /* WINED3DSIH_DEFB          */ "defb",
-    /* WINED3DSIH_DEFI          */ "defi",
-    /* WINED3DSIH_DP2ADD        */ "dp2add",
-    /* WINED3DSIH_DP3           */ "dp3",
-    /* WINED3DSIH_DP4           */ "dp4",
-    /* WINED3DSIH_DST           */ "dst",
-    /* WINED3DSIH_DSX           */ "dsx",
-    /* WINED3DSIH_DSY           */ "dsy",
-    /* WINED3DSIH_ELSE          */ "else",
-    /* WINED3DSIH_ENDIF         */ "endif",
-    /* WINED3DSIH_ENDLOOP       */ "endloop",
-    /* WINED3DSIH_ENDREP        */ "endrep",
-    /* WINED3DSIH_EXP           */ "exp",
-    /* WINED3DSIH_EXPP          */ "expp",
-    /* WINED3DSIH_FRC           */ "frc",
-    /* WINED3DSIH_IF            */ "if",
-    /* WINED3DSIH_IFC           */ "ifc",
-    /* WINED3DSIH_LABEL         */ "label",
-    /* WINED3DSIH_LIT           */ "lit",
-    /* WINED3DSIH_LOG           */ "log",
-    /* WINED3DSIH_LOGP          */ "logp",
-    /* WINED3DSIH_LOOP          */ "loop",
-    /* WINED3DSIH_LRP           */ "lrp",
-    /* WINED3DSIH_M3x2          */ "m3x2",
-    /* WINED3DSIH_M3x3          */ "m3x3",
-    /* WINED3DSIH_M3x4          */ "m3x4",
-    /* WINED3DSIH_M4x3          */ "m4x3",
-    /* WINED3DSIH_M4x4          */ "m4x4",
-    /* WINED3DSIH_MAD           */ "mad",
-    /* WINED3DSIH_MAX           */ "max",
-    /* WINED3DSIH_MIN           */ "min",
-    /* WINED3DSIH_MOV           */ "mov",
-    /* WINED3DSIH_MOVA          */ "mova",
-    /* WINED3DSIH_MUL           */ "mul",
-    /* WINED3DSIH_NOP           */ "nop",
-    /* WINED3DSIH_NRM           */ "nrm",
-    /* WINED3DSIH_PHASE         */ "phase",
-    /* WINED3DSIH_POW           */ "pow",
-    /* WINED3DSIH_RCP           */ "rcp",
-    /* WINED3DSIH_REP           */ "rep",
-    /* WINED3DSIH_RET           */ "ret",
-    /* WINED3DSIH_RSQ           */ "rsq",
-    /* WINED3DSIH_SETP          */ "setp",
-    /* WINED3DSIH_SGE           */ "sge",
-    /* WINED3DSIH_SGN           */ "sgn",
-    /* WINED3DSIH_SINCOS        */ "sincos",
-    /* WINED3DSIH_SLT           */ "slt",
-    /* WINED3DSIH_SUB           */ "sub",
-    /* WINED3DSIH_TEX           */ "texld",
-    /* WINED3DSIH_TEXBEM        */ "texbem",
-    /* WINED3DSIH_TEXBEML       */ "texbeml",
-    /* WINED3DSIH_TEXCOORD      */ "texcrd",
-    /* WINED3DSIH_TEXDEPTH      */ "texdepth",
-    /* WINED3DSIH_TEXDP3        */ "texdp3",
-    /* WINED3DSIH_TEXDP3TEX     */ "texdp3tex",
-    /* WINED3DSIH_TEXKILL       */ "texkill",
-    /* WINED3DSIH_TEXLDD        */ "texldd",
-    /* WINED3DSIH_TEXLDL        */ "texldl",
-    /* WINED3DSIH_TEXM3x2DEPTH  */ "texm3x2depth",
-    /* WINED3DSIH_TEXM3x2PAD    */ "texm3x2pad",
-    /* WINED3DSIH_TEXM3x2TEX    */ "texm3x2tex",
-    /* WINED3DSIH_TEXM3x3       */ "texm3x3",
-    /* WINED3DSIH_TEXM3x3DIFF   */ "texm3x3diff",
-    /* WINED3DSIH_TEXM3x3PAD    */ "texm3x3pad",
-    /* WINED3DSIH_TEXM3x3SPEC   */ "texm3x3spec",
-    /* WINED3DSIH_TEXM3x3TEX    */ "texm3x3tex",
-    /* WINED3DSIH_TEXM3x3VSPEC  */ "texm3x3vspec",
-    /* WINED3DSIH_TEXREG2AR     */ "texreg2ar",
-    /* WINED3DSIH_TEXREG2GB     */ "texreg2gb",
-    /* WINED3DSIH_TEXREG2RGB    */ "texreg2rgb",
-};
-
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
-{
-    switch (version_token >> 16)
-    {
-        case WINED3D_SM1_VS:
-        case WINED3D_SM1_PS:
-            return &sm1_shader_frontend;
-
-        case WINED3D_SM4_PS:
-        case WINED3D_SM4_VS:
-        case WINED3D_SM4_GS:
-            return &sm4_shader_frontend;
-
-        default:
-            FIXME("Unrecognised version token %#x\n", version_token);
-            return NULL;
-    }
-}
-
-void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
-{
-    buffer->buffer[0] = '\0';
-    buffer->bsize = 0;
-    buffer->lineNo = 0;
-    buffer->newline = TRUE;
-}
-
-BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
-{
-    buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
-    if (!buffer->buffer)
-    {
-        ERR("Failed to allocate shader buffer memory.\n");
-        return FALSE;
-    }
-
-    shader_buffer_clear(buffer);
-    return TRUE;
-}
-
-void shader_buffer_free(struct wined3d_shader_buffer *buffer)
-{
-    HeapFree(GetProcessHeap(), 0, buffer->buffer);
-}
-
-int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
-{
-    char* base = buffer->buffer + buffer->bsize;
-    int rc;
-
-    rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
-
-    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
-    {
-        ERR("The buffer allocated for the shader program string "
-            "is too small at %d bytes.\n", SHADER_PGMSIZE);
-        buffer->bsize = SHADER_PGMSIZE - 1;
-        return -1;
-    }
-
-    if (buffer->newline) {
-        TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
-        buffer->newline = FALSE;
-    } else {
-        TRACE("%s", base);
-    }
-
-    buffer->bsize += rc;
-    if (buffer->buffer[buffer->bsize-1] == '\n') {
-        buffer->lineNo++;
-        buffer->newline = TRUE;
-    }
-    return 0;
-}
-
-int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
-{
-    int ret;
-    va_list args;
-
-    va_start(args, format);
-    ret = shader_vaddline(buffer, format, args);
-    va_end(args);
-
-    return ret;
-}
-
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
-        IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
-{
-    shader->ref = 1;
-    shader->device = (IWineD3DDevice *)device;
-    shader->parent = parent;
-    shader->parent_ops = parent_ops;
-    list_init(&shader->linked_programs);
-    list_add_head(&device->shaders, &shader->shader_list_entry);
-}
-
-/* Convert floating point offset relative
- * to a register file to an absolute offset for float constants */
-static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
-{
-    switch (register_type)
-    {
-        case WINED3DSPR_CONST: return register_idx;
-        case WINED3DSPR_CONST2: return 2048 + register_idx;
-        case WINED3DSPR_CONST3: return 4096 + register_idx;
-        case WINED3DSPR_CONST4: return 6144 + register_idx;
-        default:
-            FIXME("Unsupported register type: %d\n", register_type);
-            return register_idx;
-    }
-}
-
-static void shader_delete_constant_list(struct list* clist) {
-
-    struct list *ptr;
-    struct local_constant* constant;
-
-    ptr = list_head(clist);
-    while (ptr) {
-        constant = LIST_ENTRY(ptr, struct local_constant, entry);
-        ptr = list_next(clist, ptr);
-        HeapFree(GetProcessHeap(), 0, constant);
-    }
-    list_init(clist);
-}
-
-static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
-{
-    DWORD idx, shift;
-    idx = bit >> 5;
-    shift = bit & 0x1f;
-    bitmap[idx] |= (1 << shift);
-}
-
-static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps,
-        const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
-{
-    switch (reg->type)
-    {
-        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
-            else reg_maps->address |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_TEMP:
-            reg_maps->temporary |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_INPUT:
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                if (reg->rel_addr)
-                {
-                    /* If relative addressing is used, we must assume that all registers
-                     * are used. Even if it is a construct like v3[aL], we can't assume
-                     * that v0, v1 and v2 aren't read because aL can be negative */
-                    unsigned int i;
-                    for (i = 0; i < MAX_REG_INPUT; ++i)
-                    {
-                        ((IWineD3DPixelShaderImpl *)This)->input_reg_used[i] = TRUE;
-                    }
-                }
-                else
-                {
-                    ((IWineD3DPixelShaderImpl *)This)->input_reg_used[reg->idx] = TRUE;
-                }
-            }
-            else reg_maps->input_registers |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_RASTOUT:
-            if (reg->idx == 1) reg_maps->fog = 1;
-            break;
-
-        case WINED3DSPR_MISCTYPE:
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                if (reg->idx == 0) reg_maps->vpos = 1;
-                else if (reg->idx == 1) reg_maps->usesfacing = 1;
-            }
-            break;
-
-        case WINED3DSPR_CONST:
-            if (reg->rel_addr)
-            {
-                if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
-                {
-                    if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
-                    {
-                        ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx;
-                    }
-                    if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
-                    {
-                        ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx;
-                    }
-                }
-                reg_maps->usesrelconstF = TRUE;
-            }
-            else
-            {
-                set_bitmap_bit(reg_maps->constf, reg->idx);
-            }
-            break;
-
-        case WINED3DSPR_CONSTINT:
-            reg_maps->integer_constants |= (1 << reg->idx);
-            break;
-
-        case WINED3DSPR_CONSTBOOL:
-            reg_maps->boolean_constants |= (1 << reg->idx);
-            break;
-
-        case WINED3DSPR_COLOROUT:
-            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
-            break;
-
-        default:
-            TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
-            break;
-    }
-}
-
-static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
-{
-    switch(instr)
-    {
-        case WINED3DSIH_M4x4:
-        case WINED3DSIH_M3x4:
-            return param == 1 ? 3 : 0;
-
-        case WINED3DSIH_M4x3:
-        case WINED3DSIH_M3x3:
-            return param == 1 ? 2 : 0;
-
-        case WINED3DSIH_M3x2:
-            return param == 1 ? 1 : 0;
-
-        default:
-            return 0;
-    }
-}
-
-static const char *semantic_names[] =
-{
-    /* WINED3DDECLUSAGE_POSITION        */ "SV_POSITION",
-    /* WINED3DDECLUSAGE_BLENDWEIGHT     */ "BLENDWEIGHT",
-    /* WINED3DDECLUSAGE_BLENDINDICES    */ "BLENDINDICES",
-    /* WINED3DDECLUSAGE_NORMAL          */ "NORMAL",
-    /* WINED3DDECLUSAGE_PSIZE           */ "PSIZE",
-    /* WINED3DDECLUSAGE_TEXCOORD        */ "TEXCOORD",
-    /* WINED3DDECLUSAGE_TANGENT         */ "TANGENT",
-    /* WINED3DDECLUSAGE_BINORMAL        */ "BINORMAL",
-    /* WINED3DDECLUSAGE_TESSFACTOR      */ "TESSFACTOR",
-    /* WINED3DDECLUSAGE_POSITIONT       */ "POSITIONT",
-    /* WINED3DDECLUSAGE_COLOR           */ "COLOR",
-    /* WINED3DDECLUSAGE_FOG             */ "FOG",
-    /* WINED3DDECLUSAGE_DEPTH           */ "DEPTH",
-    /* WINED3DDECLUSAGE_SAMPLE          */ "SAMPLE",
-};
-
-static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
-{
-    if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
-    {
-        FIXME("Unrecognized usage %#x\n", usage);
-        return "UNRECOGNIZED";
-    }
-
-    return semantic_names[usage];
-}
-
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
-{
-    unsigned int i;
-
-    for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
-    {
-        if (!strcmp(name, semantic_names[i])) return i;
-    }
-
-    return ~0U;
-}
-
-BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage)
-{
-    return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
-}
-
-static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e,
-        const struct wined3d_shader_semantic *s)
-{
-    e->semantic_name = shader_semantic_name_from_usage(s->usage);
-    e->semantic_idx = s->usage_idx;
-    e->sysval_semantic = 0;
-    e->component_type = 0;
-    e->register_idx = s->reg.reg.idx;
-    e->mask = s->reg.write_mask;
-}
-
-/* Note that this does not count the loop register
- * as an address register. */
-
-HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
-        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
-        struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
-{
-    IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
-    void *fe_data = This->baseShader.frontend_data;
-    struct wined3d_shader_version shader_version;
-    unsigned int cur_loop_depth = 0, max_loop_depth = 0;
-    const DWORD* pToken = byte_code;
-
-    /* There are some minor differences between pixel and vertex shaders */
-
-    memset(reg_maps, 0, sizeof(*reg_maps));
-
-    /* get_registers_used is called on every compile on some 1.x shaders, which can result
-     * in stacking up a collection of local constants. Delete the old constants if existing
-     */
-    shader_delete_constant_list(&This->baseShader.constantsF);
-    shader_delete_constant_list(&This->baseShader.constantsB);
-    shader_delete_constant_list(&This->baseShader.constantsI);
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-    reg_maps->shader_version = shader_version;
-
-    reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                                 sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
-    if(!reg_maps->constf) {
-        ERR("Out of memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        struct wined3d_shader_instruction ins;
-        const char *comment;
-        UINT param_size;
-
-        /* Skip comments */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment) continue;
-
-        /* Fetch opcode */
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-
-        /* Unhandled opcode, and its parameters */
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        /* Handle declarations */
-        if (ins.handler_idx == WINED3DSIH_DCL)
-        {
-            struct wined3d_shader_semantic semantic;
-
-            fe->shader_read_semantic(&pToken, &semantic);
-
-            switch (semantic.reg.reg.type)
-            {
-                /* Mark input registers used. */
-                case WINED3DSPR_INPUT:
-                    reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
-                    shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
-                    break;
-
-                /* Vshader: mark 3.0 output registers used, save token */
-                case WINED3DSPR_OUTPUT:
-                    reg_maps->output_registers |= 1 << semantic.reg.reg.idx;
-                    shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic);
-                    if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
-                    break;
-
-                /* Save sampler usage token */
-                case WINED3DSPR_SAMPLER:
-                    reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
-                    break;
-
-                default:
-                    TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
-                    break;
-            }
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEF)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
-            pToken += 4;
-
-            /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
-            if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                float *value = (float *) lconst->value;
-                if (value[0] < -1.0f) value[0] = -1.0f;
-                else if (value[0] > 1.0f) value[0] = 1.0f;
-                if (value[1] < -1.0f) value[1] = -1.0f;
-                else if (value[1] > 1.0f) value[1] = 1.0f;
-                if (value[2] < -1.0f) value[2] = -1.0f;
-                else if (value[2] > 1.0f) value[2] = 1.0f;
-                if (value[3] < -1.0f) value[3] = -1.0f;
-                else if (value[3] > 1.0f) value[3] = 1.0f;
-            }
-
-            list_add_head(&This->baseShader.constantsF, &lconst->entry);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFI)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
-            pToken += 4;
-
-            list_add_head(&This->baseShader.constantsI, &lconst->entry);
-            reg_maps->local_int_consts |= (1 << dst.reg.idx);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFB)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, sizeof(DWORD));
-            ++pToken;
-
-            list_add_head(&This->baseShader.constantsB, &lconst->entry);
-            reg_maps->local_bool_consts |= (1 << dst.reg.idx);
-        }
-        /* If there's a loop in the shader */
-        else if (ins.handler_idx == WINED3DSIH_LOOP
-                || ins.handler_idx == WINED3DSIH_REP)
-        {
-            struct wined3d_shader_src_param src, rel_addr;
-
-            fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-
-            /* Rep and Loop always use an integer constant for the control parameters */
-            if (ins.handler_idx == WINED3DSIH_REP)
-            {
-                reg_maps->integer_constants |= 1 << src.reg.idx;
-            }
-            else
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-                reg_maps->integer_constants |= 1 << src.reg.idx;
-            }
-
-            cur_loop_depth++;
-            if(cur_loop_depth > max_loop_depth)
-                max_loop_depth = cur_loop_depth;
-        }
-        else if (ins.handler_idx == WINED3DSIH_ENDLOOP
-                || ins.handler_idx == WINED3DSIH_ENDREP)
-        {
-            cur_loop_depth--;
-        }
-        /* For subroutine prototypes */
-        else if (ins.handler_idx == WINED3DSIH_LABEL)
-        {
-            struct wined3d_shader_src_param src, rel_addr;
-
-            fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-            reg_maps->labels |= 1 << src.reg.idx;
-        }
-        /* Set texture, address, temporary registers */
-        else
-        {
-            int i, limit;
-            BOOL color0_mov = FALSE;
-
-            /* This will loop over all the registers and try to
-             * make a bitmask of the ones we're interested in.
-             *
-             * Relative addressing tokens are ignored, but that's
-             * okay, since we'll catch any address registers when
-             * they are initialized (required by spec) */
-
-            if (ins.dst_count)
-            {
-                struct wined3d_shader_dst_param dst_param;
-                struct wined3d_shader_src_param dst_rel_addr;
-
-                fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-
-                shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type);
-
-                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
-                 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
-                 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */
-                if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
-                        && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
-                {
-                    reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
-                }
-
-                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
-                {
-                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This;
-
-                    if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
-                    {
-                    /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
-                     * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
-                     * the mov and perform the sRGB write correction from the source register.
-                     *
-                     * However, if the mov is only partial, we can't do this, and if the write
-                     * comes from an instruction other than MOV it is hard to do as well. If
-                     * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
-
-                        ps->color0_mov = FALSE;
-                        if (ins.handler_idx == WINED3DSIH_MOV)
-                        {
-                            /* Used later when the source register is read. */
-                            color0_mov = TRUE;
-                        }
-                    }
-                    /* Also drop the MOV marker if the source register is overwritten prior to the shader
-                     * end
-                     */
-                    else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
-                    {
-                        ps->color0_mov = FALSE;
-                    }
-                }
-
-                /* Declare 1.X samplers implicitly, based on the destination reg. number */
-                if (shader_version.major == 1
-                        && (ins.handler_idx == WINED3DSIH_TEX
-                            || ins.handler_idx == WINED3DSIH_TEXBEM
-                            || ins.handler_idx == WINED3DSIH_TEXBEML
-                            || ins.handler_idx == WINED3DSIH_TEXDP3TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
-                            || ins.handler_idx == WINED3DSIH_TEXREG2AR
-                            || ins.handler_idx == WINED3DSIH_TEXREG2GB
-                            || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
-                {
-                    /* Fake sampler usage, only set reserved bit and ttype */
-                    DWORD sampler_code = dst_param.reg.idx;
-
-                    TRACE("Setting fake 2D sampler for 1.x pixelshader\n");
-                    reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
-
-                    /* texbem is only valid with < 1.4 pixel shaders */
-                    if (ins.handler_idx == WINED3DSIH_TEXBEM
-                            || ins.handler_idx == WINED3DSIH_TEXBEML)
-                    {
-                        reg_maps->bumpmat |= 1 << dst_param.reg.idx;
-                        if (ins.handler_idx == WINED3DSIH_TEXBEML)
-                        {
-                            reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
-                        }
-                    }
-                }
-                else if (ins.handler_idx == WINED3DSIH_BEM)
-                {
-                    reg_maps->bumpmat |= 1 << dst_param.reg.idx;
-                }
-            }
-
-            if (ins.handler_idx == WINED3DSIH_NRM)
-            {
-                reg_maps->usesnrm = 1;
-            }
-            else if (ins.handler_idx == WINED3DSIH_DSY)
-            {
-                reg_maps->usesdsy = 1;
-            }
-            else if (ins.handler_idx == WINED3DSIH_DSX)
-            {
-                reg_maps->usesdsx = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_TEXLDD)
-            {
-                reg_maps->usestexldd = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_TEXLDL)
-            {
-                reg_maps->usestexldl = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_MOVA)
-            {
-                reg_maps->usesmova = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_IFC)
-            {
-                reg_maps->usesifc = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_CALL)
-            {
-                reg_maps->usescall = 1;
-            }
-
-            limit = ins.src_count + (ins.predicate ? 1 : 0);
-            for (i = 0; i < limit; ++i)
-            {
-                struct wined3d_shader_src_param src_param, src_rel_addr;
-                unsigned int count;
-
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                count = get_instr_extra_regcount(ins.handler_idx, i);
-
-                shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
-                while (count)
-                {
-                    ++src_param.reg.idx;
-                    shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
-                    --count;
-                }
-
-                if(color0_mov)
-                {
-                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This;
-                    if(src_param.reg.type == WINED3DSPR_TEMP &&
-                       src_param.swizzle == WINED3DSP_NOSWIZZLE)
-                    {
-                        ps->color0_mov = TRUE;
-                        ps->color0_reg = src_param.reg.idx;
-                    }
-                }
-            }
-        }
-    }
-    reg_maps->loop_depth = max_loop_depth;
-
-    This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code);
-
-    return WINED3D_OK;
-}
-
-unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max)
-{
-    DWORD map = 1 << max;
-    map |= map - 1;
-    map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
-
-    return wined3d_log2i(map);
-}
-
-static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic,
-        const struct wined3d_shader_version *shader_version)
-{
-    TRACE("dcl");
-
-    if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
-    {
-        switch (semantic->sampler_type)
-        {
-            case WINED3DSTT_2D: TRACE("_2d"); break;
-            case WINED3DSTT_CUBE: TRACE("_cube"); break;
-            case WINED3DSTT_VOLUME: TRACE("_volume"); break;
-            default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
-        }
-    }
-    else
-    {
-        /* Pixel shaders 3.0 don't have usage semantics */
-        if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL)
-            return;
-        else
-            TRACE("_");
-
-        switch (semantic->usage)
-        {
-            case WINED3DDECLUSAGE_POSITION:
-                TRACE("position%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_BLENDINDICES:
-                TRACE("blend");
-                break;
-            case WINED3DDECLUSAGE_BLENDWEIGHT:
-                TRACE("weight");
-                break;
-            case WINED3DDECLUSAGE_NORMAL:
-                TRACE("normal%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_PSIZE:
-                TRACE("psize");
-                break;
-            case WINED3DDECLUSAGE_COLOR:
-                if (semantic->usage_idx == 0) TRACE("color");
-                else TRACE("specular%d", (semantic->usage_idx - 1));
-                break;
-            case WINED3DDECLUSAGE_TEXCOORD:
-                TRACE("texture%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_TANGENT:
-                TRACE("tangent");
-                break;
-            case WINED3DDECLUSAGE_BINORMAL:
-                TRACE("binormal");
-                break;
-            case WINED3DDECLUSAGE_TESSFACTOR:
-                TRACE("tessfactor");
-                break;
-            case WINED3DDECLUSAGE_POSITIONT:
-                TRACE("positionT%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_FOG:
-                TRACE("fog");
-                break;
-            case WINED3DDECLUSAGE_DEPTH:
-                TRACE("depth");
-                break;
-            case WINED3DDECLUSAGE_SAMPLE:
-                TRACE("sample");
-                break;
-            default:
-                FIXME("unknown_semantics(0x%08x)", semantic->usage);
-        }
-    }
-}
-
-static void shader_dump_register(const struct wined3d_shader_register *reg,
-        const struct wined3d_shader_version *shader_version)
-{
-    static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
-    static const char * const misctype_reg_names[] = {"vPos", "vFace"};
-    UINT offset = reg->idx;
-
-    switch (reg->type)
-    {
-        case WINED3DSPR_TEMP:
-            TRACE("r");
-            break;
-
-        case WINED3DSPR_INPUT:
-            TRACE("v");
-            break;
-
-        case WINED3DSPR_CONST:
-        case WINED3DSPR_CONST2:
-        case WINED3DSPR_CONST3:
-        case WINED3DSPR_CONST4:
-            TRACE("c");
-            offset = shader_get_float_offset(reg->type, reg->idx);
-            break;
-
-        case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
-            TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
-            break;
-
-        case WINED3DSPR_RASTOUT:
-            TRACE("%s", rastout_reg_names[reg->idx]);
-            break;
-
-        case WINED3DSPR_COLOROUT:
-            TRACE("oC");
-            break;
-
-        case WINED3DSPR_DEPTHOUT:
-            TRACE("oDepth");
-            break;
-
-        case WINED3DSPR_ATTROUT:
-            TRACE("oD");
-            break;
-
-        case WINED3DSPR_TEXCRDOUT:
-            /* Vertex shaders >= 3.0 use general purpose output registers
-             * (WINED3DSPR_OUTPUT), which can include an address token */
-            if (shader_version->major >= 3) TRACE("o");
-            else TRACE("oT");
-            break;
-
-        case WINED3DSPR_CONSTINT:
-            TRACE("i");
-            break;
-
-        case WINED3DSPR_CONSTBOOL:
-            TRACE("b");
-            break;
-
-        case WINED3DSPR_LABEL:
-            TRACE("l");
-            break;
-
-        case WINED3DSPR_LOOP:
-            TRACE("aL");
-            break;
-
-        case WINED3DSPR_SAMPLER:
-            TRACE("s");
-            break;
-
-        case WINED3DSPR_MISCTYPE:
-            if (reg->idx > 1) FIXME("Unhandled misctype register %d\n", reg->idx);
-            else TRACE("%s", misctype_reg_names[reg->idx]);
-            break;
-
-        case WINED3DSPR_PREDICATE:
-            TRACE("p");
-            break;
-
-        case WINED3DSPR_IMMCONST:
-            TRACE("l");
-            break;
-
-        case WINED3DSPR_CONSTBUFFER:
-            TRACE("cb");
-            break;
-
-        default:
-            TRACE("unhandled_rtype(%#x)", reg->type);
-            break;
-    }
-
-    if (reg->type == WINED3DSPR_IMMCONST)
-    {
-        TRACE("(");
-        switch (reg->immconst_type)
-        {
-            case WINED3D_IMMCONST_FLOAT:
-                TRACE("%.8e", *(const float *)reg->immconst_data);
-                break;
-
-            case WINED3D_IMMCONST_FLOAT4:
-                TRACE("%.8e, %.8e, %.8e, %.8e",
-                        *(const float *)&reg->immconst_data[0], *(const float *)&reg->immconst_data[1],
-                        *(const float *)&reg->immconst_data[2], *(const float *)&reg->immconst_data[3]);
-                break;
-
-            default:
-                TRACE("<unhandled immconst_type %#x>", reg->immconst_type);
-                break;
-        }
-        TRACE(")");
-    }
-    else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
-    {
-        if (reg->array_idx != ~0U)
-        {
-            TRACE("%u[%u", offset, reg->array_idx);
-            if (reg->rel_addr)
-            {
-                TRACE(" + ");
-                shader_dump_src_param(reg->rel_addr, shader_version);
-            }
-            TRACE("]");
-        }
-        else
-        {
-            if (reg->rel_addr)
-            {
-                TRACE("[");
-                shader_dump_src_param(reg->rel_addr, shader_version);
-                TRACE(" + ");
-            }
-            TRACE("%u", offset);
-            if (reg->rel_addr) TRACE("]");
-        }
-    }
-}
-
-void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
-        const struct wined3d_shader_version *shader_version)
-{
-    DWORD write_mask = param->write_mask;
-
-    shader_dump_register(&param->reg, shader_version);
-
-    if (write_mask != WINED3DSP_WRITEMASK_ALL)
-    {
-        static const char *write_mask_chars = "xyzw";
-
-        TRACE(".");
-        if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
-        if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
-        if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
-        if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
-    }
-}
-
-void shader_dump_src_param(const struct wined3d_shader_src_param *param,
-        const struct wined3d_shader_version *shader_version)
-{
-    DWORD src_modifier = param->modifiers;
-    DWORD swizzle = param->swizzle;
-
-    if (src_modifier == WINED3DSPSM_NEG
-            || src_modifier == WINED3DSPSM_BIASNEG
-            || src_modifier == WINED3DSPSM_SIGNNEG
-            || src_modifier == WINED3DSPSM_X2NEG
-            || src_modifier == WINED3DSPSM_ABSNEG)
-        TRACE("-");
-    else if (src_modifier == WINED3DSPSM_COMP)
-        TRACE("1-");
-    else if (src_modifier == WINED3DSPSM_NOT)
-        TRACE("!");
-
-    if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
-        TRACE("abs(");
-
-    shader_dump_register(&param->reg, shader_version);
-
-    if (src_modifier)
-    {
-        switch (src_modifier)
-        {
-            case WINED3DSPSM_NONE:    break;
-            case WINED3DSPSM_NEG:     break;
-            case WINED3DSPSM_NOT:     break;
-            case WINED3DSPSM_BIAS:    TRACE("_bias"); break;
-            case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
-            case WINED3DSPSM_SIGN:    TRACE("_bx2"); break;
-            case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
-            case WINED3DSPSM_COMP:    break;
-            case WINED3DSPSM_X2:      TRACE("_x2"); break;
-            case WINED3DSPSM_X2NEG:   TRACE("_x2"); break;
-            case WINED3DSPSM_DZ:      TRACE("_dz"); break;
-            case WINED3DSPSM_DW:      TRACE("_dw"); break;
-            case WINED3DSPSM_ABSNEG:  TRACE(")"); break;
-            case WINED3DSPSM_ABS:     TRACE(")"); break;
-            default:
-                                      TRACE("_unknown_modifier(%#x)", src_modifier);
-        }
-    }
-
-    if (swizzle != WINED3DSP_NOSWIZZLE)
-    {
-        static const char *swizzle_chars = "xyzw";
-        DWORD swizzle_x = swizzle & 0x03;
-        DWORD swizzle_y = (swizzle >> 2) & 0x03;
-        DWORD swizzle_z = (swizzle >> 4) & 0x03;
-        DWORD swizzle_w = (swizzle >> 6) & 0x03;
-
-        if (swizzle_x == swizzle_y
-                && swizzle_x == swizzle_z
-                && swizzle_x == swizzle_w)
-        {
-            TRACE(".%c", swizzle_chars[swizzle_x]);
-        }
-        else
-        {
-            TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
-                    swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
-        }
-    }
-}
-
-/* Shared code in order to generate the bulk of the shader string.
- * NOTE: A description of how to parse tokens can be found on msdn */
-void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
-        const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx)
-{
-    IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
-    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */
-    const struct wined3d_shader_frontend *fe = This->baseShader.frontend;
-    void *fe_data = This->baseShader.frontend_data;
-    struct wined3d_shader_src_param src_rel_addr[4];
-    struct wined3d_shader_src_param src_param[4];
-    struct wined3d_shader_version shader_version;
-    struct wined3d_shader_src_param dst_rel_addr;
-    struct wined3d_shader_dst_param dst_param;
-    struct wined3d_shader_instruction ins;
-    struct wined3d_shader_context ctx;
-    const DWORD *pToken = pFunction;
-    DWORD i;
-
-    /* Initialize current parsing state */
-    ctx.shader = iface;
-    ctx.reg_maps = reg_maps;
-    ctx.buffer = buffer;
-    ctx.backend_data = backend_ctx;
-
-    ins.ctx = &ctx;
-    ins.dst = &dst_param;
-    ins.src = src_param;
-    This->baseShader.parse_state.current_row = 0;
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        const char *comment;
-        UINT param_size;
-
-        /* Skip comment tokens */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment) continue;
-
-        /* Read opcode */
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-
-        /* Unknown opcode and its parameters */
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        /* Nothing to do */
-        if (ins.handler_idx == WINED3DSIH_DCL
-                || ins.handler_idx == WINED3DSIH_NOP
-                || ins.handler_idx == WINED3DSIH_DEF
-                || ins.handler_idx == WINED3DSIH_DEFI
-                || ins.handler_idx == WINED3DSIH_DEFB
-                || ins.handler_idx == WINED3DSIH_PHASE)
-        {
-            pToken += param_size;
-            continue;
-        }
-
-        /* Destination token */
-        if (ins.dst_count) fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-
-        /* Predication token */
-        if (ins.predicate) ins.predicate = *pToken++;
-
-        /* Other source tokens */
-        for (i = 0; i < ins.src_count; ++i)
-        {
-            fe->shader_read_src_param(fe_data, &pToken, &src_param[i], &src_rel_addr[i]);
-        }
-
-        /* Call appropriate function for output target */
-        device->shader_backend->shader_handle_instruction(&ins);
-    }
-}
-
-static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
-{
-    DWORD mmask = dst->modifiers;
-
-    switch (dst->shift)
-    {
-        case 0: break;
-        case 13: TRACE("_d8"); break;
-        case 14: TRACE("_d4"); break;
-        case 15: TRACE("_d2"); break;
-        case 1: TRACE("_x2"); break;
-        case 2: TRACE("_x4"); break;
-        case 3: TRACE("_x8"); break;
-        default: TRACE("_unhandled_shift(%d)", dst->shift); break;
-    }
-
-    if (mmask & WINED3DSPDM_SATURATE)         TRACE("_sat");
-    if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
-    if (mmask & WINED3DSPDM_MSAMPCENTROID)    TRACE("_centroid");
-
-    mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
-    if (mmask)
-        FIXME("_unrecognized_modifier(%#x)", mmask);
-}
-
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction)
-{
-    struct wined3d_shader_version shader_version;
-    const DWORD* pToken = pFunction;
-    const char *type_prefix;
-    DWORD i;
-
-    TRACE("Parsing %p\n", pFunction);
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-
-    switch (shader_version.type)
-    {
-        case WINED3D_SHADER_TYPE_VERTEX:
-            type_prefix = "vs";
-            break;
-
-        case WINED3D_SHADER_TYPE_GEOMETRY:
-            type_prefix = "gs";
-            break;
-
-        case WINED3D_SHADER_TYPE_PIXEL:
-            type_prefix = "ps";
-            break;
-
-        default:
-            FIXME("Unhandled shader type %#x.\n", shader_version.type);
-            type_prefix = "unknown";
-            break;
-    }
-
-    TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        struct wined3d_shader_instruction ins;
-        const char *comment;
-        UINT param_size;
-
-        /* comment */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment)
-        {
-            TRACE("//%s\n", comment);
-            continue;
-        }
-
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        if (ins.handler_idx == WINED3DSIH_DCL)
-        {
-            struct wined3d_shader_semantic semantic;
-
-            fe->shader_read_semantic(&pToken, &semantic);
-
-            shader_dump_decl_usage(&semantic, &shader_version);
-            shader_dump_ins_modifiers(&semantic.reg);
-            TRACE(" ");
-            shader_dump_dst_param(&semantic.reg, &shader_version);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEF)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
-                    *(const float *)(pToken),
-                    *(const float *)(pToken + 1),
-                    *(const float *)(pToken + 2),
-                    *(const float *)(pToken + 3));
-            pToken += 4;
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFI)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
-                    *(pToken),
-                    *(pToken + 1),
-                    *(pToken + 2),
-                    *(pToken + 3));
-            pToken += 4;
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFB)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("defb b%u = %s", dst.reg.idx, *pToken ? "true" : "false");
-            ++pToken;
-        }
-        else
-        {
-            struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
-            struct wined3d_shader_dst_param dst_param;
-            struct wined3d_shader_src_param src_param;
-
-            if (ins.dst_count)
-            {
-                fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-            }
-
-            /* Print out predication source token first - it follows
-             * the destination token. */
-            if (ins.predicate)
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                TRACE("(");
-                shader_dump_src_param(&src_param, &shader_version);
-                TRACE(") ");
-            }
-
-            /* PixWin marks instructions with the coissue flag with a '+' */
-            if (ins.coissue) TRACE("+");
-
-            TRACE("%s", shader_opcode_names[ins.handler_idx]);
-
-            if (ins.handler_idx == WINED3DSIH_IFC
-                    || ins.handler_idx == WINED3DSIH_BREAKC)
-            {
-                switch (ins.flags)
-                {
-                    case COMPARISON_GT: TRACE("_gt"); break;
-                    case COMPARISON_EQ: TRACE("_eq"); break;
-                    case COMPARISON_GE: TRACE("_ge"); break;
-                    case COMPARISON_LT: TRACE("_lt"); break;
-                    case COMPARISON_NE: TRACE("_ne"); break;
-                    case COMPARISON_LE: TRACE("_le"); break;
-                    default: TRACE("_(%u)", ins.flags);
-                }
-            }
-            else if (ins.handler_idx == WINED3DSIH_TEX
-                    && shader_version.major >= 2
-                    && (ins.flags & WINED3DSI_TEXLD_PROJECT))
-            {
-                TRACE("p");
-            }
-
-            /* We already read the destination token, print it. */
-            if (ins.dst_count)
-            {
-                shader_dump_ins_modifiers(&dst_param);
-                TRACE(" ");
-                shader_dump_dst_param(&dst_param, &shader_version);
-            }
-
-            /* Other source tokens */
-            for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                TRACE(!i ? " " : ", ");
-                shader_dump_src_param(&src_param, &shader_version);
-            }
-        }
-        TRACE("\n");
-    }
-}
-
-void shader_cleanup(IWineD3DBaseShader *iface)
-{
-    IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface;
-
-    ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_destroy(iface);
-    HeapFree(GetProcessHeap(), 0, This->baseShader.reg_maps.constf);
-    HeapFree(GetProcessHeap(), 0, This->baseShader.function);
-    shader_delete_constant_list(&This->baseShader.constantsF);
-    shader_delete_constant_list(&This->baseShader.constantsB);
-    shader_delete_constant_list(&This->baseShader.constantsI);
-    list_remove(&This->baseShader.shader_list_entry);
-
-    if (This->baseShader.frontend && This->baseShader.frontend_data)
-    {
-        This->baseShader.frontend->shader_free(This->baseShader.frontend_data);
-    }
-}
-
-static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
-static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
-static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
-static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
-static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
-static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
-static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
-static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
-static void shader_none_destroy(IWineD3DBaseShader *iface) {}
-static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
-static void shader_none_free(IWineD3DDevice *iface) {}
-static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;}
-
-static void shader_none_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
-{
-    /* Set the shader caps to 0 for the none shader backend */
-    pCaps->VertexShaderVersion  = 0;
-    pCaps->PixelShaderVersion    = 0;
-    pCaps->PixelShader1xMaxValue = 0.0f;
-}
-
-static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
-{
-    if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
-    {
-        TRACE("Checking support for fixup:\n");
-        dump_color_fixup_desc(fixup);
-    }
-
-    /* Faked to make some apps happy. */
-    if (!is_yuv_fixup(fixup))
-    {
-        TRACE("[OK]\n");
-        return TRUE;
-    }
-
-    TRACE("[FAILED]\n");
-    return FALSE;
-}
-
-const shader_backend_t none_shader_backend = {
-    shader_none_handle_instruction,
-    shader_none_select,
-    shader_none_select_depth_blt,
-    shader_none_deselect_depth_blt,
-    shader_none_update_float_vertex_constants,
-    shader_none_update_float_pixel_constants,
-    shader_none_load_constants,
-    shader_none_load_np2fixup_constants,
-    shader_none_destroy,
-    shader_none_alloc,
-    shader_none_free,
-    shader_none_dirty_const,
-    shader_none_get_caps,
-    shader_none_color_fixup_supported,
-};
index 20201b1..e22d311 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright 2002-2005 Raphael Junqueira
  * Copyright 2004 Christian Costa
  * Copyright 2005 Oliver Stieber
- * Copyright 2007 Stefan Dösinger for CodeWeavers
+ * Copyright 2007-2010 Stefan Dösinger for CodeWeavers
  * Copyright 2009 Henri Verbeet for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
@@ -56,7 +56,13 @@ static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offse
         }
     }
 
-    if(!offset && !size)
+    if(offset > This->resource.size || offset + size > This->resource.size)
+    {
+        WARN("Invalid range dirtified, marking entire buffer dirty\n");
+        offset = 0;
+        size = This->resource.size;
+    }
+    else if(!offset && !size)
     {
         size = This->resource.size;
     }
@@ -145,11 +151,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
     {
         TRACE("Gl usage = GL_STREAM_DRAW_ARB\n");
         gl_usage = GL_STREAM_DRAW_ARB;
-    }
-    else
-    {
-        TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
-        gl_usage = GL_DYNAMIC_DRAW_ARB;
 
         if(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
         {
@@ -157,6 +158,12 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
             checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
             This->flags |= WINED3D_BUFFER_FLUSH;
         }
+        /* No setup is needed here for GL_ARB_map_buffer_range */
+    }
+    else
+    {
+        TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
+        gl_usage = GL_DYNAMIC_DRAW_ARB;
     }
 
     /* Reserve memory for the buffer. The amount of data won't change
@@ -483,7 +490,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
          * FLOAT16s if not supported. Also, we can't iterate over the array, so use macros to generate code for all
          * the attributes that our current fixed function pipeline implementation cares for.
          */
-        BOOL support_d3dcolor = gl_info->supported[EXT_VERTEX_ARRAY_BGRA];
+        BOOL support_d3dcolor = gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
         ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
                 TRUE, TRUE,  FALSE, &stride_this_run, &float16_used) || ret;
         ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
@@ -1026,6 +1033,51 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac
 
 /* IWineD3DBuffer methods */
 
+static DWORD buffer_sanitize_flags(DWORD flags)
+{
+    /* Not all flags make sense together, but Windows never returns an error. Catch the
+     * cases that could cause issues */
+    if(flags & WINED3DLOCK_READONLY)
+    {
+        if(flags & WINED3DLOCK_DISCARD)
+        {
+            WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_DISCARD, ignoring flags\n");
+            return 0;
+        }
+        if(flags & WINED3DLOCK_NOOVERWRITE)
+        {
+            WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_NOOVERWRITE, ignoring flags\n");
+            return 0;
+        }
+    }
+    else if((flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) == (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+    {
+        WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n");
+        return 0;
+    }
+
+    return flags;
+}
+
+static GLbitfield buffer_gl_map_flags(DWORD d3d_flags)
+{
+    GLbitfield ret = 0;
+
+    if (!(d3d_flags & WINED3DLOCK_READONLY)) ret = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+
+    if (d3d_flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+    {
+        if(d3d_flags & WINED3DLOCK_DISCARD) ret |= GL_MAP_INVALIDATE_BUFFER_BIT;
+        ret |= GL_MAP_UNSYNCHRONIZED_BIT;
+    }
+    else
+    {
+        ret |= GL_MAP_READ_BIT;
+    }
+
+    return ret;
+}
+
 static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, UINT size, BYTE **data, DWORD flags)
 {
     struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -1033,7 +1085,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
 
     TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags);
 
-    if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+    flags = buffer_sanitize_flags(flags);
+    if (!(flags & WINED3DLOCK_READONLY))
+    {
+        if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+    }
 
     count = InterlockedIncrement(&This->lock_count);
 
@@ -1043,6 +1099,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
         {
             IWineD3DDeviceImpl *device = This->resource.device;
             struct wined3d_context *context;
+            const struct wined3d_gl_info *gl_info;
 
             if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
             {
@@ -1050,9 +1107,20 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
             }
 
             context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+            gl_info = context->gl_info;
             ENTER_GL();
             GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
-            This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+
+            if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+            {
+                GLbitfield mapflags = buffer_gl_map_flags(flags);
+                This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+                                                                             This->resource.size, mapflags));
+            }
+            else
+            {
+                This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+            }
             LEAVE_GL();
             context_release(context);
         }
@@ -1093,6 +1161,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
     if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object)
     {
         IWineD3DDeviceImpl *device = This->resource.device;
+        const struct wined3d_gl_info *gl_info;
         struct wined3d_context *context;
 
         if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
@@ -1101,10 +1170,21 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
         }
 
         context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+        gl_info = context->gl_info;
         ENTER_GL();
         GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
 
-        if(This->flags & WINED3D_BUFFER_FLUSH)
+        if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+        {
+            for(i = 0; i < This->modified_areas; i++)
+            {
+                GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint,
+                                                    This->maps[i].offset,
+                                                    This->maps[i].size));
+                checkGLcall("glFlushMappedBufferRange");
+            }
+        }
+        else if (This->flags & WINED3D_BUFFER_FLUSH)
         {
             for(i = 0; i < This->modified_areas; i++)
             {
@@ -1196,8 +1276,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
     TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
             debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer);
 
-    /* TODO: GL_ARB_map_buffer_range */
-    dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE];
+    dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE];
 
     /* Observations show that drawStridedSlow is faster on dynamic VBs than converting +
      * drawStridedFast (half-life 2 and others).
index 2aec7d6..0878985 100644 (file)
@@ -114,7 +114,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
 }
 
 /* GL locking is done by the caller */
-static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload)
+static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
 {
     const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
     IWineD3DDeviceImpl *device = surface_impl->resource.device;
@@ -148,7 +148,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
         IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
     }
 
-    if (update_minfilter || update_magfilter || force_preload)
+    if (update_minfilter || update_magfilter)
     {
         GLenum target, bind_target;
         GLint old_binding;
@@ -166,8 +166,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
             glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
         }
 
-        surface_internal_preload(surface, SRGB_RGB);
-
         glBindTexture(bind_target, surface_impl->texture_name);
         if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
         if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -208,7 +206,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
         }
         else
         {
-            context_apply_attachment_filter_states(depth_stencil, TRUE);
+            surface_prepare_texture(depth_stencil_impl, FALSE);
+            context_apply_attachment_filter_states(depth_stencil);
 
             if (format_flags & WINED3DFMT_FLAG_DEPTH)
             {
@@ -253,14 +252,15 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
 void context_attach_surface_fbo(const struct wined3d_context *context,
         GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
 {
-    const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
+    IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
     const struct wined3d_gl_info *gl_info = context->gl_info;
 
     TRACE("Attach surface %p to %u\n", surface, idx);
 
     if (surface)
     {
-        context_apply_attachment_filter_states(surface, TRUE);
+        surface_prepare_texture(surface_impl, FALSE);
+        context_apply_attachment_filter_states(surface);
 
         gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
                 surface_impl->texture_name, surface_impl->texture_level);
@@ -431,10 +431,10 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
         for (i = 0; i < gl_info->limits.buffers; ++i)
         {
             if (device->render_targets[i])
-                context_apply_attachment_filter_states(device->render_targets[i], FALSE);
+                context_apply_attachment_filter_states(device->render_targets[i]);
         }
         if (device->stencilBufferTarget)
-            context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE);
+            context_apply_attachment_filter_states(device->stencilBufferTarget);
     }
 
     for (i = 0; i < gl_info->limits.buffers; ++i)
@@ -532,32 +532,38 @@ void context_alloc_event_query(struct wined3d_context *context, struct wined3d_e
 
     if (context->free_event_query_count)
     {
-        query->id = context->free_event_queries[--context->free_event_query_count];
+        query->object = context->free_event_queries[--context->free_event_query_count];
     }
     else
     {
-        if (gl_info->supported[APPLE_FENCE])
+        if (gl_info->supported[ARB_SYNC])
+        {
+            /* Using ARB_sync, not much to do here. */
+            query->object.sync = NULL;
+            TRACE("Allocated event query %p in context %p.\n", query->object.sync, context);
+        }
+        else if (gl_info->supported[APPLE_FENCE])
         {
             ENTER_GL();
-            GL_EXTCALL(glGenFencesAPPLE(1, &query->id));
+            GL_EXTCALL(glGenFencesAPPLE(1, &query->object.id));
             checkGLcall("glGenFencesAPPLE");
             LEAVE_GL();
 
-            TRACE("Allocated event query %u in context %p.\n", query->id, context);
+            TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
         }
         else if(gl_info->supported[NV_FENCE])
         {
             ENTER_GL();
-            GL_EXTCALL(glGenFencesNV(1, &query->id));
+            GL_EXTCALL(glGenFencesNV(1, &query->object.id));
             checkGLcall("glGenFencesNV");
             LEAVE_GL();
 
-            TRACE("Allocated event query %u in context %p.\n", query->id, context);
+            TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
         }
         else
         {
             WARN("Event queries not supported, not allocating query id.\n");
-            query->id = 0;
+            query->object.id = 0;
         }
     }
 
@@ -575,12 +581,12 @@ void context_free_event_query(struct wined3d_event_query *query)
     if (context->free_event_query_count >= context->free_event_query_size - 1)
     {
         UINT new_size = context->free_event_query_size << 1;
-        GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries,
+        union wined3d_gl_query_object *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries,
                 new_size * sizeof(*context->free_event_queries));
 
         if (!new_data)
         {
-            ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context);
+            ERR("Failed to grow free list, leaking query %u in context %p.\n", query->object.id, context);
             return;
         }
 
@@ -588,7 +594,7 @@ void context_free_event_query(struct wined3d_event_query *query)
         context->free_event_queries = new_data;
     }
 
-    context->free_event_queries[context->free_event_query_count++] = query->id;
+    context->free_event_queries[context->free_event_query_count++] = query->object;
 }
 
 void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type)
@@ -661,6 +667,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
     struct fbo_entry *entry, *entry2;
     HGLRC restore_ctx;
     HDC restore_dc;
+    unsigned int i;
 
     restore_ctx = pwglGetCurrentContext();
     restore_dc = pwglGetCurrentDC();
@@ -682,8 +689,12 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
     {
         if (context->valid)
         {
-            if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->id));
-            else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->id));
+            if (gl_info->supported[ARB_SYNC])
+            {
+                if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+            }
+            else if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->object.id));
+            else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->object.id));
         }
         event_query->context = NULL;
     }
@@ -720,10 +731,24 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
         if (gl_info->supported[ARB_OCCLUSION_QUERY])
             GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries));
 
-        if (gl_info->supported[APPLE_FENCE])
-            GL_EXTCALL(glDeleteFencesAPPLE(context->free_event_query_count, context->free_event_queries));
+        if (gl_info->supported[ARB_SYNC])
+        {
+            if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+        }
+        else if (gl_info->supported[APPLE_FENCE])
+        {
+            for (i = 0; i < context->free_event_query_count; ++i)
+            {
+                GL_EXTCALL(glDeleteFencesAPPLE(1, &context->free_event_queries[i].id));
+            }
+        }
         else if (gl_info->supported[NV_FENCE])
-            GL_EXTCALL(glDeleteFencesNV(context->free_event_query_count, context->free_event_queries));
+        {
+            for (i = 0; i < context->free_event_query_count; ++i)
+            {
+                GL_EXTCALL(glDeleteFencesNV(1, &context->free_event_queries[i].id));
+            }
+        }
 
         checkGLcall("context cleanup");
     }
@@ -2131,6 +2156,8 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
                 if (context->render_offscreen)
                 {
                     FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
+                    surface_internal_preload(context->current_rt, SRGB_RGB);
+
                     ENTER_GL();
                     context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
                     context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
@@ -2189,6 +2216,9 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
             }
 
             IWineD3DDeviceImpl_FindTexUnitMap(device);
+            device_preload_textures(device);
+            if (isStateDirty(context, STATE_VDECL))
+                device_update_stream_info(device, context->gl_info);
 
             ENTER_GL();
             for (i = 0; i < context->numDirtyEntries; ++i)
index 34495d3..6682aa4 100644 (file)
@@ -179,8 +179,6 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
 {
     /* We need to deal with frequency data! */
     IWineD3DVertexDeclarationImpl *declaration = (IWineD3DVertexDeclarationImpl *)This->stateBlock->vertexDecl;
-    UINT stream_count = This->stateBlock->streamIsUP ? 0 : declaration->num_streams;
-    const DWORD *streams = declaration->streams;
     unsigned int i;
 
     stream_info->use_map = 0;
@@ -298,7 +296,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
             stream_info->elements[idx].stream_idx = element->input_slot;
             stream_info->elements[idx].buffer_object = buffer_object;
 
-            if (!This->adapter->gl_info.supported[EXT_VERTEX_ARRAY_BGRA]
+            if (!This->adapter->gl_info.supported[ARB_VERTEX_ARRAY_BGRA]
                     && element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
             {
                 stream_info->swizzle_map |= 1 << idx;
@@ -307,17 +305,29 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
         }
     }
 
-    /* Now call PreLoad on all the vertex buffers. In the very rare case
-     * that the buffers stopps converting PreLoad will dirtify the VDECL again.
-     * The vertex buffer can now use the strided structure in the device instead of finding its
-     * own again.
-     *
-     * NULL streams won't be recorded in the array, UP streams won't be either. A stream is only
-     * once in there. */
-    for (i = 0; i < stream_count; ++i)
+    if (!This->stateBlock->streamIsUP)
     {
-        IWineD3DBuffer *vb = This->stateBlock->streamSource[streams[i]];
-        if (vb) IWineD3DBuffer_PreLoad(vb);
+        WORD map = stream_info->use_map;
+
+        /* PreLoad all the vertex buffers. */
+        for (i = 0; map; map >>= 1, ++i)
+        {
+            struct wined3d_stream_info_element *element;
+            struct wined3d_buffer *buffer;
+
+            if (!(map & 1)) continue;
+
+            element = &stream_info->elements[i];
+            buffer = (struct wined3d_buffer *)This->stateBlock->streamSource[element->stream_idx];
+            IWineD3DBuffer_PreLoad((IWineD3DBuffer *)buffer);
+
+            /* If PreLoad dropped the buffer object, update the stream info. */
+            if (buffer->buffer_object != element->buffer_object)
+            {
+                element->buffer_object = 0;
+                element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data;
+            }
+        }
     }
 }
 
@@ -332,7 +342,7 @@ static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_in
     e->buffer_object = 0;
 }
 
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
+static void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
         const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info)
 {
     unsigned int i;
@@ -361,7 +371,7 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
     {
         if (!stream_info->elements[i].format_desc) continue;
 
-        if (!gl_info->supported[EXT_VERTEX_ARRAY_BGRA]
+        if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
                 && stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
         {
             stream_info->swizzle_map |= 1 << i;
@@ -370,6 +380,120 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
     }
 }
 
+static void device_trace_strided_stream_info(const struct wined3d_stream_info *stream_info)
+{
+    TRACE("Strided Data:\n");
+    TRACE_STRIDED(stream_info, WINED3D_FFP_POSITION);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDWEIGHT);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDINDICES);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_NORMAL);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_PSIZE);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_DIFFUSE);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_SPECULAR);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD0);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD1);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD2);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD3);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD4);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD5);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD6);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD7);
+}
+
+/* Context activation is done by the caller. */
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info)
+{
+    struct wined3d_stream_info *stream_info = &device->strided_streams;
+    IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+    BOOL vs = stateblock->vertexShader && device->vs_selected_mode != SHADER_NONE;
+    BOOL fixup = FALSE;
+
+    if (device->up_strided)
+    {
+        /* Note: this is a ddraw fixed-function code path. */
+        TRACE("=============================== Strided Input ================================\n");
+        device_stream_info_from_strided(gl_info, device->up_strided, stream_info);
+        if (TRACE_ON(d3d)) device_trace_strided_stream_info(stream_info);
+    }
+    else
+    {
+        TRACE("============================= Vertex Declaration =============================\n");
+        device_stream_info_from_declaration(device, vs, stream_info, &fixup);
+    }
+
+    if (vs && !stream_info->position_transformed)
+    {
+        if (((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->half_float_conv_needed && !fixup)
+        {
+            TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n");
+            device->useDrawStridedSlow = TRUE;
+        }
+        else
+        {
+            device->useDrawStridedSlow = FALSE;
+        }
+    }
+    else
+    {
+        WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
+        slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
+                & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
+
+        if ((stream_info->position_transformed || (stream_info->use_map & slow_mask)) && !fixup)
+        {
+            device->useDrawStridedSlow = TRUE;
+        }
+        else
+        {
+            device->useDrawStridedSlow = FALSE;
+        }
+    }
+}
+
+static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned int idx)
+{
+    IWineD3DBaseTextureImpl *texture;
+    enum WINED3DSRGB srgb;
+
+    if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
+    srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
+    texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
+}
+
+void device_preload_textures(IWineD3DDeviceImpl *device)
+{
+    IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+    unsigned int i;
+
+    if (use_vs(stateblock))
+    {
+        for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
+        {
+            if (((IWineD3DBaseShaderImpl *)stateblock->vertexShader)->baseShader.reg_maps.sampler_type[i])
+                device_preload_texture(stateblock, MAX_FRAGMENT_SAMPLERS + i);
+        }
+    }
+
+    if (use_ps(stateblock))
+    {
+        for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
+        {
+            if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i])
+                device_preload_texture(stateblock, i);
+        }
+    }
+    else
+    {
+        WORD ffu_map = device->fixed_function_usage_map;
+
+        for (i = 0; ffu_map; ffu_map >>= 1, ++i)
+        {
+            if (ffu_map & 1)
+                device_preload_texture(stateblock, i);
+        }
+    }
+}
+
 /**********************************************************
  * IUnknown parts follows
  **********************************************************/
@@ -596,7 +720,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI
     IWineD3DSurfaceImpl *object;
     HRESULT hr;
 
-    TRACE("(%p) Create surface\n",This);
+    TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n",
+            iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level);
+    TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n",
+            ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality);
+    TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops);
 
     if (Impl == SURFACE_OPENGL && !This->adapter)
     {
@@ -784,104 +912,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface
     return WINED3D_OK;
 }
 
-static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery **ppQuery, IUnknown* parent) {
+static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface,
+        WINED3DQUERYTYPE type, IWineD3DQuery **query, IUnknown *parent)
+{
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
-    IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */
-    HRESULT hr = WINED3DERR_NOTAVAILABLE;
-    const IWineD3DQueryVtbl *vtable;
-
-    /* Just a check to see if we support this type of query */
-    switch(Type) {
-    case WINED3DQUERYTYPE_OCCLUSION:
-        TRACE("(%p) occlusion query\n", This);
-        if (gl_info->supported[ARB_OCCLUSION_QUERY])
-            hr = WINED3D_OK;
-        else
-            WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY/NV_OCCLUSION_QUERY\n");
-
-        vtable = &IWineD3DOcclusionQuery_Vtbl;
-        break;
-
-    case WINED3DQUERYTYPE_EVENT:
-        if (!gl_info->supported[NV_FENCE] && !gl_info->supported[APPLE_FENCE])
-        {
-            /* Half-Life 2 needs this query. It does not render the main menu correctly otherwise
-             * Pretend to support it, faking this query does not do much harm except potentially lowering performance
-             */
-            FIXME("(%p) Event query: Unimplemented, but pretending to be supported\n", This);
-        }
-        vtable = &IWineD3DEventQuery_Vtbl;
-        hr = WINED3D_OK;
-        break;
+    IWineD3DQueryImpl *object;
+    HRESULT hr;
 
-    case WINED3DQUERYTYPE_VCACHE:
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    default:
-        /* Use the base Query vtable until we have a special one for each query */
-        vtable = &IWineD3DQuery_Vtbl;
-        FIXME("(%p) Unhandled query type %d\n", This, Type);
-    }
-    if(NULL == ppQuery || hr != WINED3D_OK) {
-        return hr;
-    }
+    TRACE("iface %p, type %#x, query %p, parent %p.\n", iface, type, query, parent);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
-    if(!object)
+    if (!object)
     {
-        ERR("Out of memory\n");
-        *ppQuery = NULL;
-        return WINED3DERR_OUTOFVIDEOMEMORY;
+        ERR("Failed to allocate query memory.\n");
+        return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl = vtable;
-    object->type = Type;
-    object->state = QUERY_CREATED;
-    object->device = This;
-    object->parent = parent;
-    object->ref = 1;
-
-    *ppQuery = (IWineD3DQuery *)object;
-
-    /* allocated the 'extended' data based on the type of query requested */
-    switch(Type){
-    case WINED3DQUERYTYPE_OCCLUSION:
-        object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
-        ((struct wined3d_occlusion_query *)object->extendedData)->context = NULL;
-        break;
+    hr = query_init(object, This, type, parent);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize query, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
 
-    case WINED3DQUERYTYPE_EVENT:
-        object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_event_query));
-        ((struct wined3d_event_query *)object->extendedData)->context = NULL;
-        break;
+    TRACE("Created query %p.\n", object);
+    *query = (IWineD3DQuery *)object;
 
-    case WINED3DQUERYTYPE_VCACHE:
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    default:
-        object->extendedData = 0;
-        FIXME("(%p) Unhandled query type %d\n",This , Type);
-    }
-    TRACE("(%p) : Created Query %p\n", This, object);
     return WINED3D_OK;
 }
 
@@ -1663,14 +1720,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
         }
     }
 
-    /* Delete the palette conversion shader if it is around */
-    if(This->paletteConversionShader) {
-        ENTER_GL();
-        GL_EXTCALL(glDeleteProgramsARB(1, &This->paletteConversionShader));
-        LEAVE_GL();
-        This->paletteConversionShader = 0;
-    }
-
     /* Delete the pbuffer context if there is any */
     if(This->pbufferContext) context_destroy(This, This->pbufferContext);
 
@@ -3054,15 +3103,17 @@ static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) {
     }
 }
 
-static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
+static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
     unsigned int i, tex;
     WORD ffu_map;
 
     device_update_fixed_function_usage_map(This);
     ffu_map = This->fixed_function_usage_map;
 
-    if (This->max_ffp_textures == This->max_ffp_texture_stages ||
-            This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) {
+    if (This->max_ffp_textures == gl_info->limits.texture_stages
+            || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures)
+    {
         for (i = 0; ffu_map; ffu_map >>= 1, ++i)
         {
             if (!(ffu_map & 1)) continue;
@@ -3092,7 +3143,8 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
     }
 }
 
-static void device_map_psamplers(IWineD3DDeviceImpl *This) {
+static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
     const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type =
             ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type;
     unsigned int i;
@@ -3102,7 +3154,8 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This) {
         {
             device_map_stage(This, i, i);
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(i));
-            if (i < MAX_TEXTURES) {
+            if (i < gl_info->limits.texture_stages)
+            {
                 markTextureStagesDirty(This, i);
             }
         }
@@ -3133,11 +3186,12 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad
     return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS];
 }
 
-static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
+static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct wined3d_gl_info *gl_info)
+{
     const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_type =
             ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.reg_maps.sampler_type;
     const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_type = NULL;
-    int start = min(MAX_COMBINED_SAMPLERS, This->adapter->gl_info.limits.combined_samplers) - 1;
+    int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1;
     int i;
 
     if (ps) {
@@ -3174,7 +3228,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
     }
 }
 
-void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
+void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This)
+{
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
     BOOL vs = use_vs(This->stateBlock);
     BOOL ps = use_ps(This->stateBlock);
     /*
@@ -3184,15 +3240,10 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
      * -> When the mapping of a stage is changed, sampler and ALL texture stage states have
      * to be reset. Because of that try to work with a 1:1 mapping as much as possible
      */
-    if (ps) {
-        device_map_psamplers(This);
-    } else {
-        device_map_fixed_function_samplers(This);
-    }
+    if (ps) device_map_psamplers(This, gl_info);
+    else device_map_fixed_function_samplers(This, gl_info);
 
-    if (vs) {
-        device_map_vsamplers(This, ps);
-    }
+    if (vs) device_map_vsamplers(This, ps, gl_info);
 }
 
 static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) {
@@ -3806,11 +3857,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
 static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
     DWORD oldValue = This->updateStateBlock->textureState[Stage][Type];
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
 
     TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value);
 
-    if (Stage >= MAX_TEXTURES) {
-        WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring\n", Stage, MAX_TEXTURES - 1);
+    if (Stage >= gl_info->limits.texture_stages)
+    {
+        WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
+                Stage, gl_info->limits.texture_stages - 1);
         return WINED3D_OK;
     }
 
@@ -3891,6 +3945,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
         DWORD stage, IWineD3DBaseTexture *texture)
 {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
     IWineD3DBaseTexture *prev;
 
     TRACE("iface %p, stage %u, texture %p.\n", iface, stage, texture);
@@ -3949,7 +4004,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER);
         }
 
-        if (!prev && stage < MAX_TEXTURES)
+        if (!prev && stage < gl_info->limits.texture_stages)
         {
             /* The source arguments for color and alpha ops have different
              * meanings when a NULL texture is bound, so the COLOROP and
@@ -3968,7 +4023,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
 
         IWineD3DBaseTexture_Release(prev);
 
-        if (!texture && stage < MAX_TEXTURES)
+        if (!texture && stage < gl_info->limits.texture_stages)
         {
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_COLOROP));
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_ALPHAOP));
@@ -4206,7 +4261,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfa
     const WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
     UINT drawable_width, drawable_height;
     IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
-    IWineD3DSwapChainImpl *swapchain = NULL;
     struct wined3d_context *context;
 
     /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
@@ -4376,12 +4430,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfa
 
     LEAVE_GL();
 
-    if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
-        if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) {
-            wglFlush();
-        }
-        IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
-    }
+    wglFlush(); /* Flush to ensure ordering across contexts. */
 
     context_release(context);
 
@@ -5340,6 +5389,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     struct wined3d_context *context;
 
+    if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
+    IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
+
     if (!surface_is_offscreen(surface))
     {
         TRACE("Surface %p is onscreen\n", surface);
@@ -5386,6 +5438,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
     checkGLcall("glClear");
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 }
 
@@ -5685,6 +5740,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa
         if(Swapchain->backBuffer[0]) {
             IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], (IWineD3DBase *) Swapchain);
             ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags |= SFLAG_SWAPCHAIN;
+            Swapchain->presentParms.BackBufferWidth = BackImpl->currentDesc.Width;
+            Swapchain->presentParms.BackBufferHeight = BackImpl->currentDesc.Height;
+            Swapchain->presentParms.BackBufferFormat = BackImpl->resource.format_desc->format;
         } else {
             HeapFree(GetProcessHeap(), 0, Swapchain->backBuffer);
             Swapchain->backBuffer = NULL;
@@ -5738,6 +5796,12 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
             break;
     }
 
+    /* Make sure the drawables are up-to-date. Note that loading the
+     * destination surface isn't strictly required if we overwrite the
+     * entire surface. */
+    IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
+    IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
+
     /* Attach src surface to src fbo */
     src_swapchain = get_swapchain(src_surface);
     dst_swapchain = get_swapchain(dst_surface);
@@ -5753,9 +5817,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
         GLenum buffer = surface_get_gl_buffer(src_surface);
 
         TRACE("Source surface %p is onscreen\n", src_surface);
-        /* Make sure the drawable is up to date. In the offscreen case
-         * attach_surface_fbo() implicitly takes care of this. */
-        IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
 
         if(buffer == GL_FRONT) {
             RECT windowsize;
@@ -5792,9 +5853,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
         GLenum buffer = surface_get_gl_buffer(dst_surface);
 
         TRACE("Destination surface %p is onscreen\n", dst_surface);
-        /* Make sure the drawable is up to date. In the offscreen case
-         * attach_surface_fbo() implicitly takes care of this. */
-        IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
 
         if(buffer == GL_FRONT) {
             RECT windowsize;
@@ -5839,6 +5897,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
     }
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
@@ -6982,20 +7043,19 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
     for (i = 0; i < PATCHMAP_SIZE; ++i) list_init(&device->patches[i]);
 
     select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
-    device->shader_backend = select_shader_backend(adapter, device_type);
+    device->shader_backend = adapter->shader_backend;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
-    device->shader_backend->shader_get_caps(device_type, &adapter->gl_info, &shader_caps);
+    device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
     device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
     device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
     device->vs_clipping = shader_caps.VSClipping;
 
     memset(&ffp_caps, 0, sizeof(ffp_caps));
-    fragment_pipeline = select_fragment_implementation(adapter, device_type);
+    fragment_pipeline = adapter->fragment_pipe;
     device->frag_pipe = fragment_pipeline;
-    fragment_pipeline->get_caps(device_type, &adapter->gl_info, &ffp_caps);
+    fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
     device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
-    device->max_ffp_texture_stages = ffp_caps.MaxTextureBlendStages;
 
     hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
             ffp_vertexstate_template, fragment_pipeline, misc_state_template);
@@ -7006,7 +7066,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
         return hr;
     }
 
-    device->blitter = select_blit_implementation(adapter, device_type);
+    device->blitter = adapter->blitter;
 
     return WINED3D_OK;
 }
index 855f97f..812e5cc 100644 (file)
@@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
 
 #define GLINFO_LOCATION (*gl_info)
+#define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024)
+#define MAKEDWORD_VERSION(maj, min)  ((maj & 0xffff) << 16) | (min & 0xffff)
 
 /* The d3d device ID */
 static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
@@ -43,17 +45,10 @@ static const struct {
     /* APPLE */
     {"GL_APPLE_client_storage",             APPLE_CLIENT_STORAGE,           0                           },
     {"GL_APPLE_fence",                      APPLE_FENCE,                    0                           },
-    {"GL_APPLE_flush_render",               APPLE_FLUSH_RENDER,             0                           },
-    {"GL_APPLE_ycbcr_422",                  APPLE_YCBCR_422,                0                           },
     {"GL_APPLE_float_pixels",               APPLE_FLOAT_PIXELS,             0                           },
     {"GL_APPLE_flush_buffer_range",         APPLE_FLUSH_BUFFER_RANGE,       0                           },
-
-    /* ATI */
-    {"GL_ATI_separate_stencil",             ATI_SEPARATE_STENCIL,           0                           },
-    {"GL_ATI_texture_env_combine3",         ATI_TEXTURE_ENV_COMBINE3,       0                           },
-    {"GL_ATI_texture_mirror_once",          ATI_TEXTURE_MIRROR_ONCE,        0                           },
-    {"GL_ATI_fragment_shader",              ATI_FRAGMENT_SHADER,            0                           },
-    {"GL_ATI_texture_compression_3dc",      ATI_TEXTURE_COMPRESSION_3DC,    0                           },
+    {"GL_APPLE_flush_render",               APPLE_FLUSH_RENDER,             0                           },
+    {"GL_APPLE_ycbcr_422",                  APPLE_YCBCR_422,                0                           },
 
     /* ARB */
     {"GL_ARB_color_buffer_float",           ARB_COLOR_BUFFER_FLOAT,         0                           },
@@ -66,7 +61,9 @@ static const struct {
     {"GL_ARB_framebuffer_object",           ARB_FRAMEBUFFER_OBJECT,         0                           },
     {"GL_ARB_geometry_shader4",             ARB_GEOMETRY_SHADER4,           0                           },
     {"GL_ARB_half_float_pixel",             ARB_HALF_FLOAT_PIXEL,           0                           },
+    {"GL_ARB_half_float_vertex",            ARB_HALF_FLOAT_VERTEX,          0                           },
     {"GL_ARB_imaging",                      ARB_IMAGING,                    0                           },
+    {"GL_ARB_map_buffer_range",             ARB_MAP_BUFFER_RANGE,           0                           },
     {"GL_ARB_multisample",                  ARB_MULTISAMPLE,                0                           }, /* needs GLX_ARB_MULTISAMPLE as well */
     {"GL_ARB_multitexture",                 ARB_MULTITEXTURE,               0                           },
     {"GL_ARB_occlusion_query",              ARB_OCCLUSION_QUERY,            0                           },
@@ -74,6 +71,10 @@ static const struct {
     {"GL_ARB_point_parameters",             ARB_POINT_PARAMETERS,           0                           },
     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE,               0                           },
     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX,           0                           },
+    {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS,             0                           },
+    {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD,         0                           },
+    {"GL_ARB_shading_language_100",         ARB_SHADING_LANGUAGE_100,       0                           },
+    {"GL_ARB_sync",                         ARB_SYNC,                       0                           },
     {"GL_ARB_texture_border_clamp",         ARB_TEXTURE_BORDER_CLAMP,       0                           },
     {"GL_ARB_texture_compression",          ARB_TEXTURE_COMPRESSION,        0                           },
     {"GL_ARB_texture_cube_map",             ARB_TEXTURE_CUBE_MAP,           0                           },
@@ -85,23 +86,30 @@ static const struct {
     {"GL_ARB_texture_non_power_of_two",     ARB_TEXTURE_NON_POWER_OF_TWO,   MAKEDWORD_VERSION(2, 0)     },
     {"GL_ARB_texture_rectangle",            ARB_TEXTURE_RECTANGLE,          0                           },
     {"GL_ARB_texture_rg",                   ARB_TEXTURE_RG,                 0                           },
+    {"GL_ARB_vertex_array_bgra",            ARB_VERTEX_ARRAY_BGRA,          0                           },
     {"GL_ARB_vertex_blend",                 ARB_VERTEX_BLEND,               0                           },
     {"GL_ARB_vertex_buffer_object",         ARB_VERTEX_BUFFER_OBJECT,       0                           },
     {"GL_ARB_vertex_program",               ARB_VERTEX_PROGRAM,             0                           },
     {"GL_ARB_vertex_shader",                ARB_VERTEX_SHADER,              0                           },
-    {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS,             0                           },
-    {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD,         0                           },
-    {"GL_ARB_half_float_vertex",            ARB_HALF_FLOAT_VERTEX,          0                           },
+
+    /* ATI */
+    {"GL_ATI_fragment_shader",              ATI_FRAGMENT_SHADER,            0                           },
+    {"GL_ATI_separate_stencil",             ATI_SEPARATE_STENCIL,           0                           },
+    {"GL_ATI_texture_compression_3dc",      ATI_TEXTURE_COMPRESSION_3DC,    0                           },
+    {"GL_ATI_texture_env_combine3",         ATI_TEXTURE_ENV_COMBINE3,       0                           },
+    {"GL_ATI_texture_mirror_once",          ATI_TEXTURE_MIRROR_ONCE,        0                           },
 
     /* EXT */
     {"GL_EXT_blend_color",                  EXT_BLEND_COLOR,                0                           },
-    {"GL_EXT_blend_minmax",                 EXT_BLEND_MINMAX,               0                           },
     {"GL_EXT_blend_equation_separate",      EXT_BLEND_EQUATION_SEPARATE,    0                           },
     {"GL_EXT_blend_func_separate",          EXT_BLEND_FUNC_SEPARATE,        0                           },
+    {"GL_EXT_blend_minmax",                 EXT_BLEND_MINMAX,               0                           },
     {"GL_EXT_fog_coord",                    EXT_FOG_COORD,                  0                           },
     {"GL_EXT_framebuffer_blit",             EXT_FRAMEBUFFER_BLIT,           0                           },
     {"GL_EXT_framebuffer_multisample",      EXT_FRAMEBUFFER_MULTISAMPLE,    0                           },
     {"GL_EXT_framebuffer_object",           EXT_FRAMEBUFFER_OBJECT,         0                           },
+    {"GL_EXT_gpu_program_parameters",       EXT_GPU_PROGRAM_PARAMETERS,     0                           },
+    {"GL_EXT_gpu_shader4",                  EXT_GPU_SHADER4,                0                           },
     {"GL_EXT_packed_depth_stencil",         EXT_PACKED_DEPTH_STENCIL,       0                           },
     {"GL_EXT_paletted_texture",             EXT_PALETTED_TEXTURE,           0                           },
     {"GL_EXT_point_parameters",             EXT_POINT_PARAMETERS,           0                           },
@@ -110,42 +118,36 @@ static const struct {
     {"GL_EXT_stencil_two_side",             EXT_STENCIL_TWO_SIDE,           0                           },
     {"GL_EXT_stencil_wrap",                 EXT_STENCIL_WRAP,               0                           },
     {"GL_EXT_texture3D",                    EXT_TEXTURE3D,                  MAKEDWORD_VERSION(1, 2)     },
-    {"GL_EXT_texture_compression_s3tc",     EXT_TEXTURE_COMPRESSION_S3TC,   0                           },
     {"GL_EXT_texture_compression_rgtc",     EXT_TEXTURE_COMPRESSION_RGTC,   0                           },
+    {"GL_EXT_texture_compression_s3tc",     EXT_TEXTURE_COMPRESSION_S3TC,   0                           },
     {"GL_EXT_texture_env_add",              EXT_TEXTURE_ENV_ADD,            0                           },
     {"GL_EXT_texture_env_combine",          EXT_TEXTURE_ENV_COMBINE,        0                           },
     {"GL_EXT_texture_env_dot3",             EXT_TEXTURE_ENV_DOT3,           0                           },
-    {"GL_EXT_texture_sRGB",                 EXT_TEXTURE_SRGB,               0                           },
-    {"GL_EXT_texture_swizzle",              EXT_TEXTURE_SWIZZLE,            0                           },
     {"GL_EXT_texture_filter_anisotropic",   EXT_TEXTURE_FILTER_ANISOTROPIC, 0                           },
-    {"GL_EXT_texture_lod",                  EXT_TEXTURE_LOD,                0                           },
     {"GL_EXT_texture_lod_bias",             EXT_TEXTURE_LOD_BIAS,           0                           },
+    {"GL_EXT_texture_sRGB",                 EXT_TEXTURE_SRGB,               0                           },
     {"GL_EXT_vertex_array_bgra",            EXT_VERTEX_ARRAY_BGRA,          0                           },
-    {"GL_EXT_vertex_shader",                EXT_VERTEX_SHADER,              0                           },
-    {"GL_EXT_gpu_program_parameters",       EXT_GPU_PROGRAM_PARAMETERS,     0                           },
 
     /* NV */
-    {"GL_NV_half_float",                    NV_HALF_FLOAT,                  0                           },
+    {"GL_NV_depth_clamp",                   NV_DEPTH_CLAMP,                 0                           },
     {"GL_NV_fence",                         NV_FENCE,                       0                           },
     {"GL_NV_fog_distance",                  NV_FOG_DISTANCE,                0                           },
     {"GL_NV_fragment_program",              NV_FRAGMENT_PROGRAM,            0                           },
     {"GL_NV_fragment_program2",             NV_FRAGMENT_PROGRAM2,           0                           },
+    {"GL_NV_fragment_program_option",       NV_FRAGMENT_PROGRAM_OPTION,     0                           },
+    {"GL_NV_half_float",                    NV_HALF_FLOAT,                  0                           },
+    {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT,          0                           },
     {"GL_NV_register_combiners",            NV_REGISTER_COMBINERS,          0                           },
     {"GL_NV_register_combiners2",           NV_REGISTER_COMBINERS2,         0                           },
     {"GL_NV_texgen_reflection",             NV_TEXGEN_REFLECTION,           0                           },
     {"GL_NV_texture_env_combine4",          NV_TEXTURE_ENV_COMBINE4,        0                           },
     {"GL_NV_texture_shader",                NV_TEXTURE_SHADER,              0                           },
     {"GL_NV_texture_shader2",               NV_TEXTURE_SHADER2,             0                           },
-    {"GL_NV_texture_shader3",               NV_TEXTURE_SHADER3,             0                           },
-    {"GL_NV_occlusion_query",               NV_OCCLUSION_QUERY,             0                           },
     {"GL_NV_vertex_program",                NV_VERTEX_PROGRAM,              0                           },
     {"GL_NV_vertex_program1_1",             NV_VERTEX_PROGRAM1_1,           0                           },
     {"GL_NV_vertex_program2",               NV_VERTEX_PROGRAM2,             0                           },
     {"GL_NV_vertex_program2_option",        NV_VERTEX_PROGRAM2_OPTION,      0                           },
     {"GL_NV_vertex_program3",               NV_VERTEX_PROGRAM3,             0                           },
-    {"GL_NV_fragment_program_option",       NV_FRAGMENT_PROGRAM_OPTION,     0                           },
-    {"GL_NV_depth_clamp",                   NV_DEPTH_CLAMP,                 0                           },
-    {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT,          0                           },
 
     /* SGI */
     {"GL_SGIS_generate_mipmap",             SGIS_GENERATE_MIPMAP,           0                           },
@@ -435,9 +437,9 @@ static DWORD ver_for_ext(GL_SupportedExt ext)
 }
 
 static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor != VENDOR_ATI) return FALSE;
+    if (card_vendor != HW_VENDOR_ATI) return FALSE;
     if (device == CARD_ATI_RADEON_9500) return TRUE;
     if (device == CARD_ATI_RADEON_X700) return TRUE;
     if (device == CARD_ATI_RADEON_X1600) return TRUE;
@@ -445,9 +447,9 @@ static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const c
 }
 
 static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor == VENDOR_NVIDIA)
+    if (card_vendor == HW_VENDOR_NVIDIA)
     {
         if (device == CARD_NVIDIA_GEFORCEFX_5800 || device == CARD_NVIDIA_GEFORCEFX_5600)
         {
@@ -458,7 +460,7 @@ static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl
 }
 
 static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
      * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
@@ -470,18 +472,15 @@ static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_re
      * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
      * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
      * the chance that other implementations support them is rather small since Win32 QuickTime uses
-     * DirectDraw, not OpenGL. */
-    if (gl_info->supported[APPLE_FENCE]
-            && gl_info->supported[APPLE_CLIENT_STORAGE]
-            && gl_info->supported[APPLE_FLUSH_RENDER]
-            && gl_info->supported[APPLE_YCBCR_422])
+     * DirectDraw, not OpenGL.
+     *
+     * This test has been moved into wined3d_guess_gl_vendor()
+     */
+    if (gl_vendor == GL_VENDOR_APPLE)
     {
         return TRUE;
     }
-    else
-    {
-        return FALSE;
-    }
+    return FALSE;
 }
 
 /* Context activation is done by the caller. */
@@ -554,31 +553,29 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
 }
 
 static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    return vendor == VENDOR_INTEL && match_apple(gl_info, gl_renderer, vendor, device);
+    return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE);
 }
 
 static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
-    if (vendor != VENDOR_ATI) return FALSE;
+    if (gl_vendor != GL_VENDOR_APPLE) return FALSE;
+    if (card_vendor != HW_VENDOR_ATI) return FALSE;
     if (device == CARD_ATI_RADEON_X1600) return FALSE;
     return TRUE;
 }
 
 static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor != VENDOR_ATI) return FALSE;
-    if (match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
-    if (strstr(gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers. */
-    return TRUE;
+    return (gl_vendor == GL_VENDOR_ATI);
+
 }
 
 static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports
      * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card.
@@ -592,7 +589,7 @@ static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char
 
 /* A GL context is provided by the caller */
 static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     GLenum error;
     DWORD data[16];
@@ -619,15 +616,15 @@ static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const
 }
 
 static BOOL match_apple_nvts(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
+    if (!match_apple(gl_info, gl_renderer, gl_vendor, card_vendor, device)) return FALSE;
     return gl_info->supported[NV_TEXTURE_SHADER];
 }
 
 /* A GL context is provided by the caller */
 static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     GLuint prog;
     BOOL ret = FALSE;
@@ -793,7 +790,6 @@ static void quirk_apple_nvts(struct wined3d_gl_info *gl_info)
 {
     gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
     gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
-    gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
 }
 
 static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
@@ -804,7 +800,7 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
 struct driver_quirk
 {
     BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-            enum wined3d_pci_vendor vendor, enum wined3d_pci_device device);
+            enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device);
     void (*apply)(struct wined3d_gl_info *gl_info);
     const char *description;
 };
@@ -923,51 +919,51 @@ static const struct driver_version_information driver_version_table[] =
      * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86
      *
      * All version numbers used below are from the Linux nvidia drivers. */
-    {VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT,           "NVIDIA RIVA TNT",                  1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT2,          "NVIDIA RIVA TNT2/TNT2 Pro",        1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE,            "NVIDIA GeForce 256",               1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2_MX,        "NVIDIA GeForce2 MX/MX 400",        6,  4,  3      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2,           "NVIDIA GeForce2 GTS/GeForce2 Pro", 1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE3,           "NVIDIA GeForce3",                  6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_MX,        "NVIDIA GeForce4 MX 460",           6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_TI4200,    "NVIDIA GeForce4 Ti 4200",          6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5200,     "NVIDIA GeForce FX 5200",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5600,     "NVIDIA GeForce FX 5600",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5800,     "NVIDIA GeForce FX 5800",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6200,       "NVIDIA GeForce 6200",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6600GT,     "NVIDIA GeForce 6600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6800,       "NVIDIA GeForce 6800",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7300,       "NVIDIA GeForce Go 7300",           15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7400,       "NVIDIA GeForce Go 7400",           15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7600,       "NVIDIA GeForce 7600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7800GT,     "NVIDIA GeForce 7800 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8300GS,     "NVIDIA GeForce 8300 GS",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600GT,     "NVIDIA GeForce 8600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600MGT,    "NVIDIA GeForce 8600M GT",          15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTS,    "NVIDIA GeForce 8800 GTS",          15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9200,       "NVIDIA GeForce 9200",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9400GT,     "NVIDIA GeForce 9400 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9500GT,     "NVIDIA GeForce 9500 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9600GT,     "NVIDIA GeForce 9600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9800GT,     "NVIDIA GeForce 9800 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX260,     "NVIDIA GeForce GTX 260",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX275,     "NVIDIA GeForce GTX 275",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX280,     "NVIDIA GeForce GTX 280",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT240,      "NVIDIA GeForce GT 240",            15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT,           "NVIDIA RIVA TNT",                  1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT2,          "NVIDIA RIVA TNT2/TNT2 Pro",        1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE,            "NVIDIA GeForce 256",               1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2_MX,        "NVIDIA GeForce2 MX/MX 400",        6,  4,  3      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2,           "NVIDIA GeForce2 GTS/GeForce2 Pro", 1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE3,           "NVIDIA GeForce3",                  6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_MX,        "NVIDIA GeForce4 MX 460",           6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_TI4200,    "NVIDIA GeForce4 Ti 4200",          6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5200,     "NVIDIA GeForce FX 5200",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5600,     "NVIDIA GeForce FX 5600",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5800,     "NVIDIA GeForce FX 5800",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6200,       "NVIDIA GeForce 6200",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6600GT,     "NVIDIA GeForce 6600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6800,       "NVIDIA GeForce 6800",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7300,       "NVIDIA GeForce Go 7300",           15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7400,       "NVIDIA GeForce Go 7400",           15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7600,       "NVIDIA GeForce 7600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7800GT,     "NVIDIA GeForce 7800 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8300GS,     "NVIDIA GeForce 8300 GS",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600GT,     "NVIDIA GeForce 8600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600MGT,    "NVIDIA GeForce 8600M GT",          15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTS,    "NVIDIA GeForce 8800 GTS",          15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9200,       "NVIDIA GeForce 9200",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9400GT,     "NVIDIA GeForce 9400 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9500GT,     "NVIDIA GeForce 9500 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9600GT,     "NVIDIA GeForce 9600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9800GT,     "NVIDIA GeForce 9800 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX260,     "NVIDIA GeForce GTX 260",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX275,     "NVIDIA GeForce GTX 275",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX280,     "NVIDIA GeForce GTX 280",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT240,      "NVIDIA GeForce GT 240",            15, 11, 8618   },
 
     /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode. */
-    {VENDOR_ATI,        CARD_ATI_RADEON_9500,           "ATI Radeon 9500",                  14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_X700,           "ATI Radeon X700 SE",               14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_X1600,          "ATI Radeon X1600 Series",          14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2300,         "ATI Mobility Radeon HD 2300",      14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2600,         "ATI Mobility Radeon HD 2600",      14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2900,         "ATI Radeon HD 2900 XT",            14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4350,         "ATI Radeon HD 4350",               14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4600,         "ATI Radeon HD 4600 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4700,         "ATI Radeon HD 4700 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4800,         "ATI Radeon HD 4800 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD5700,         "ATI Radeon HD 5700 Series",        14, 10, 8681    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD5800,         "ATI Radeon HD 5800 Series",        14, 10, 8681    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_9500,           "ATI Radeon 9500",                  14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_X700,           "ATI Radeon X700 SE",               14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_X1600,          "ATI Radeon X1600 Series",          14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2300,         "ATI Mobility Radeon HD 2300",      14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2600,         "ATI Mobility Radeon HD 2600",      14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2900,         "ATI Radeon HD 2900 XT",            14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4350,         "ATI Radeon HD 4350",               14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4600,         "ATI Radeon HD 4600 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4700,         "ATI Radeon HD 4700 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4800,         "ATI Radeon HD 4800 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5700,         "ATI Radeon HD 5700 Series",        14, 10, 8681    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5800,         "ATI Radeon HD 5800 Series",        14, 10, 8681    },
 
     /* TODO: Add information about legacy ATI hardware, Intel and other cards. */
 };
@@ -995,14 +991,15 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
 
     switch (vendor)
     {
-        case VENDOR_ATI:
+        case HW_VENDOR_ATI:
             driver_info->name = "ati2dvag.dll";
             break;
 
-        case VENDOR_NVIDIA:
+        case HW_VENDOR_NVIDIA:
             driver_info->name = "nv4_disp.dll";
             break;
 
+        case HW_VENDOR_INTEL:
         default:
             FIXME_(d3d_caps)("Unhandled vendor %04x.\n", vendor);
             driver_info->name = "Display";
@@ -1053,91 +1050,817 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
         }
     }
 
-    driver_info->description = "Direct3D HAL";
-    driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
-    driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
-
-    for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i)
+    driver_info->description = "Direct3D HAL";
+    driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
+    driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
+
+    for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i)
+    {
+        if (vendor == driver_version_table[i].vendor && device == driver_version_table[i].card)
+        {
+            TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device);
+
+            driver_info->description = driver_version_table[i].description;
+            driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, driver_version_table[i].d3d_level);
+            driver_info->version_low = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
+                    driver_version_table[i].lopart_lo);
+            break;
+        }
+    }
+
+    TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n",
+            driver_info->version_high, driver_info->version_low);
+}
+
+/* Context activation is done by the caller. */
+static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+    unsigned int i;
+
+    for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
+    {
+        if (!quirk_table[i].match(gl_info, gl_renderer, gl_vendor, card_vendor, device)) continue;
+        TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
+        quirk_table[i].apply(gl_info);
+    }
+
+    /* Find out if PBOs work as they are supposed to. */
+    test_pbo_functionality(gl_info);
+}
+
+static DWORD wined3d_parse_gl_version(const char *gl_version)
+{
+    const char *ptr = gl_version;
+    int major, minor;
+
+    major = atoi(ptr);
+    if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
+
+    while (isdigit(*ptr)) ++ptr;
+    if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
+
+    minor = atoi(ptr);
+
+    TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
+
+    return MAKEDWORD_VERSION(major, minor);
+}
+
+static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer)
+{
+
+    /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
+     * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
+     * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
+     *
+     * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
+     * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
+     * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
+     * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
+     * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
+     * the chance that other implementations support them is rather small since Win32 QuickTime uses
+     * DirectDraw, not OpenGL. */
+    if (gl_info->supported[APPLE_FENCE]
+            && gl_info->supported[APPLE_CLIENT_STORAGE]
+            && gl_info->supported[APPLE_FLUSH_RENDER]
+            && gl_info->supported[APPLE_YCBCR_422])
+        return GL_VENDOR_APPLE;
+
+    if (strstr(gl_vendor_string, "NVIDIA"))
+        return GL_VENDOR_NVIDIA;
+
+    if (strstr(gl_vendor_string, "ATI"))
+        return GL_VENDOR_ATI;
+
+    if (strstr(gl_vendor_string, "Intel(R)")
+            || strstr(gl_renderer, "Intel(R)")
+            || strstr(gl_vendor_string, "Intel Inc."))
+        return GL_VENDOR_INTEL;
+
+    if (strstr(gl_vendor_string, "Mesa")
+            || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+            || strstr(gl_vendor_string, "DRI R300 Project")
+            || strstr(gl_vendor_string, "X.Org R300 Project")
+            || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+            || strstr(gl_vendor_string, "VMware, Inc.")
+            || strstr(gl_renderer, "Mesa")
+            || strstr(gl_renderer, "Gallium"))
+        return GL_VENDOR_MESA;
+
+    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string));
+
+    return GL_VENDOR_WINE;
+}
+
+static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
+{
+    if (strstr(gl_vendor_string, "NVIDIA"))
+        return HW_VENDOR_NVIDIA;
+
+    if (strstr(gl_vendor_string, "ATI")
+            || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+            || strstr(gl_vendor_string, "X.Org R300 Project")
+            || strstr(gl_vendor_string, "DRI R300 Project"))
+        return HW_VENDOR_ATI;
+
+    if (strstr(gl_vendor_string, "Intel(R)")
+            || strstr(gl_renderer, "Intel(R)")
+            || strstr(gl_vendor_string, "Intel Inc."))
+        return HW_VENDOR_INTEL;
+
+    if (strstr(gl_vendor_string, "Mesa")
+            || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+            || strstr(gl_vendor_string, "VMware, Inc."))
+        return HW_VENDOR_WINE;
+
+    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
+
+    return HW_VENDOR_NVIDIA;
+}
+
+
+
+enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem )
+{
+    /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
+     * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
+     */
+    if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
+    {
+        /* Geforce 200 - highend */
+        if (strstr(gl_renderer, "GTX 280")
+                || strstr(gl_renderer, "GTX 285")
+                || strstr(gl_renderer, "GTX 295"))
+        {
+            *vidmem = 1024;
+            return CARD_NVIDIA_GEFORCE_GTX280;
+        }
+
+        /* Geforce 200 - midend high */
+        if (strstr(gl_renderer, "GTX 275"))
+        {
+            *vidmem = 896;
+            return CARD_NVIDIA_GEFORCE_GTX275;
+        }
+
+        /* Geforce 200 - midend */
+        if (strstr(gl_renderer, "GTX 260"))
+        {
+            *vidmem = 1024;
+            return CARD_NVIDIA_GEFORCE_GTX260;
+        }
+        /* Geforce 200 - midend */
+        if (strstr(gl_renderer, "GT 240"))
+        {
+           *vidmem = 512;
+           return CARD_NVIDIA_GEFORCE_GT240;
+        }
+
+        /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
+        if (strstr(gl_renderer, "9800")
+                || strstr(gl_renderer, "GTS 150")
+                || strstr(gl_renderer, "GTS 250"))
+        {
+            *vidmem = 512;
+            return CARD_NVIDIA_GEFORCE_9800GT;
+        }
+
+        /* Geforce9 - midend */
+        if (strstr(gl_renderer, "9600"))
+        {
+            *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
+            return CARD_NVIDIA_GEFORCE_9600GT;
+        }
+
+        /* Geforce9 - midend low / Geforce 200 - low */
+        if (strstr(gl_renderer, "9500")
+                || strstr(gl_renderer, "GT 120")
+                || strstr(gl_renderer, "GT 130"))
+        {
+            *vidmem = 256; /* The 9500GT has 256-1024MB */
+            return CARD_NVIDIA_GEFORCE_9500GT;
+        }
+
+        /* Geforce9 - lowend */
+        if (strstr(gl_renderer, "9400"))
+        {
+            *vidmem = 256; /* The 9400GT has 256-1024MB */
+            return CARD_NVIDIA_GEFORCE_9400GT;
+        }
+
+        /* Geforce9 - lowend low */
+        if (strstr(gl_renderer, "9100")
+                || strstr(gl_renderer, "9200")
+                || strstr(gl_renderer, "9300")
+                || strstr(gl_renderer, "G 100"))
+        {
+            *vidmem = 256; /* The 9100-9300 cards have 256MB */
+            return CARD_NVIDIA_GEFORCE_9200;
+        }
+
+        /* Geforce8 - highend */
+        if (strstr(gl_renderer, "8800"))
+        {
+            *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
+            return CARD_NVIDIA_GEFORCE_8800GTS;
+        }
+
+        /* Geforce8 - midend mobile */
+        if (strstr(gl_renderer, "8600 M"))
+        {
+            *vidmem = 512;
+            return CARD_NVIDIA_GEFORCE_8600MGT;
+        }
+
+        /* Geforce8 - midend */
+        if (strstr(gl_renderer, "8600")
+                || strstr(gl_renderer, "8700"))
+        {
+            *vidmem = 256;
+            return CARD_NVIDIA_GEFORCE_8600GT;
+        }
+
+        /* Geforce8 - lowend */
+        if (strstr(gl_renderer, "8100")
+                || strstr(gl_renderer, "8200")
+                || strstr(gl_renderer, "8300")
+                || strstr(gl_renderer, "8400")
+                || strstr(gl_renderer, "8500"))
+        {
+            *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
+            return CARD_NVIDIA_GEFORCE_8300GS;
+        }
+
+        /* Geforce7 - highend */
+        if (strstr(gl_renderer, "7800")
+                || strstr(gl_renderer, "7900")
+                || strstr(gl_renderer, "7950")
+                || strstr(gl_renderer, "Quadro FX 4")
+                || strstr(gl_renderer, "Quadro FX 5"))
+        {
+            *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
+            return CARD_NVIDIA_GEFORCE_7800GT;
+        }
+
+        /* Geforce7 midend */
+        if (strstr(gl_renderer, "7600")
+                || strstr(gl_renderer, "7700"))
+        {
+            *vidmem = 256; /* The 7600 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_7600;
+        }
+
+        /* Geforce7 lower medium */
+        if (strstr(gl_renderer, "7400"))
+        {
+            *vidmem = 256; /* The 7400 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_7400;
+        }
+
+        /* Geforce7 lowend */
+        if (strstr(gl_renderer, "7300"))
+        {
+            *vidmem = 256; /* Mac Pros with this card have 256 MB */
+            return CARD_NVIDIA_GEFORCE_7300;
+        }
+
+        /* Geforce6 highend */
+        if (strstr(gl_renderer, "6800"))
+        {
+            *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_6800;
+        }
+
+        /* Geforce6 - midend */
+        if (strstr(gl_renderer, "6600")
+                || strstr(gl_renderer, "6610")
+                || strstr(gl_renderer, "6700"))
+        {
+            *vidmem = 128; /* A 6600GT has 128-256MB */
+            return CARD_NVIDIA_GEFORCE_6600GT;
+        }
+
+        /* Geforce6/7 lowend */
+        *vidmem = 64; /* */
+        return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
+    }
+
+    if (WINE_D3D9_CAPABLE(gl_info))
+    {
+        /* GeforceFX - highend */
+        if (strstr(gl_renderer, "5800")
+                || strstr(gl_renderer, "5900")
+                || strstr(gl_renderer, "5950")
+                || strstr(gl_renderer, "Quadro FX"))
+        {
+            *vidmem = 256; /* 5800-5900 cards use 256MB */
+            return CARD_NVIDIA_GEFORCEFX_5800;
+        }
+
+        /* GeforceFX - midend */
+        if (strstr(gl_renderer, "5600")
+                || strstr(gl_renderer, "5650")
+                || strstr(gl_renderer, "5700")
+                || strstr(gl_renderer, "5750"))
+        {
+            *vidmem = 128; /* A 5600 uses 128-256MB */
+            return CARD_NVIDIA_GEFORCEFX_5600;
+        }
+
+        /* GeforceFX - lowend */
+        *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
+        return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
+    }
+
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
+        {
+            *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
+            return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
+        }
+
+        *vidmem = 64; /* Geforce3 cards have 64-128MB */
+        return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
+    }
+
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        if (strstr(gl_renderer, "GeForce4 MX"))
+        {
+            /* Most Geforce4MX GPUs have at least 64MB of memory, some
+             * early models had 32MB but most have 64MB or even 128MB. */
+            *vidmem = 64;
+            return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
+        }
+
+        if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
+        {
+            *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
+            return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
+        }
+
+        if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
+        {
+            *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
+            return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
+        }
+
+        /* Most Geforce1 cards have 32MB, there are also some rare 16
+         * and 64MB (Dell) models. */
+        *vidmem = 32;
+        return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
+    }
+
+    if (strstr(gl_renderer, "TNT2"))
+    {
+        *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
+        return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
+    }
+
+    *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
+    return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
+
+}
+
+enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
+     *
+     * Beware: renderer string do not match exact card model,
+     * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
+    if (WINE_D3D9_CAPABLE(gl_info))
+    {
+        /* Radeon EG CYPRESS XT / PRO HD5800 - highend */
+        if (strstr(gl_renderer, "HD 5800")          /* Radeon EG CYPRESS HD58xx generic renderer string */
+                || strstr(gl_renderer, "HD 5850")   /* Radeon EG CYPRESS XT */
+                || strstr(gl_renderer, "HD 5870"))  /* Radeon EG CYPRESS PRO */
+        {
+            *vidmem = 1024; /* note: HD58xx cards use 1024MB  */
+            return CARD_ATI_RADEON_HD5800;
+        }
+
+        /* Radeon EG JUNIPER XT / LE HD5700 - midend */
+        if (strstr(gl_renderer, "HD 5700")          /* Radeon EG JUNIPER HD57xx generic renderer string */
+                || strstr(gl_renderer, "HD 5750")   /* Radeon EG JUNIPER LE */
+                || strstr(gl_renderer, "HD 5770"))  /* Radeon EG JUNIPER XT */
+        {
+            *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB  */
+            return CARD_ATI_RADEON_HD5700;
+        }
+
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "HD 4800")          /* Radeon RV7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "HD 4830")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4850")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4870")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4890"))  /* Radeon RV790 */
+        {
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
+
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "HD 4700")          /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4770"))  /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
+        }
+
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "HD 4600")          /* Radeon RV730 */
+                || strstr(gl_renderer, "HD 4650")   /* Radeon RV730 */
+                || strstr(gl_renderer, "HD 4670"))  /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
+
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "HD 4350")          /* Radeon RV710 */
+                || strstr(gl_renderer, "HD 4550"))  /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
+
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "HD 2900")
+                || strstr(gl_renderer, "HD 3870")
+                || strstr(gl_renderer, "HD 3850"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
+
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "HD 2600")
+                || strstr(gl_renderer, "HD 3830")
+                || strstr(gl_renderer, "HD 3690")
+                || strstr(gl_renderer, "HD 3650"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
+
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "HD 2300")
+                || strstr(gl_renderer, "HD 2400")
+                || strstr(gl_renderer, "HD 3470")
+                || strstr(gl_renderer, "HD 3450")
+                || strstr(gl_renderer, "HD 3430")
+                || strstr(gl_renderer, "HD 3400"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
+
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "HD 3100")
+                || strstr(gl_renderer, "HD 3200")
+                || strstr(gl_renderer, "HD 3300"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+
+        /* Radeon R5xx */
+        if (strstr(gl_renderer, "X1600")
+                || strstr(gl_renderer, "X1650")
+                || strstr(gl_renderer, "X1800")
+                || strstr(gl_renderer, "X1900")
+                || strstr(gl_renderer, "X1950"))
+        {
+            *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
+            return CARD_ATI_RADEON_X1600;
+        }
+
+        /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+        if (strstr(gl_renderer, "X700")
+                || strstr(gl_renderer, "X800")
+                || strstr(gl_renderer, "X850")
+                || strstr(gl_renderer, "X1300")
+                || strstr(gl_renderer, "X1400")
+                || strstr(gl_renderer, "X1450")
+                || strstr(gl_renderer, "X1550"))
+        {
+            *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
+            return CARD_ATI_RADEON_X700;
+        }
+
+        /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
+        if (strstr(gl_renderer, "Radeon Xpress"))
+        {
+            *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+            return CARD_ATI_RADEON_XPRESS_200M;
+        }
+
+        /* Radeon R3xx */
+        *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
+        return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+    }
+
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
+        return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
+    }
+
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        *vidmem = 32; /* There are models with up to 64MB */
+        return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
+    }
+
+    *vidmem = 16; /* There are 16-32MB models */
+    return CARD_ATI_RAGE_128PRO;
+
+}
+
+enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    if (strstr(gl_renderer, "X3100"))
+    {
+        /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */
+        *vidmem = 128;
+        return CARD_INTEL_X3100;
+    }
+
+    if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
+    {
+        /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
+        *vidmem = 64;
+        return CARD_INTEL_I945GM;
+    }
+
+    if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
+    if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
+    if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
+    if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
+    if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
+    return CARD_INTEL_I915G;
+
+}
+
+enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem )
+{
+    /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
+     *
+     * Beware: renderer string do not match exact card model,
+     * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
+    if (strstr(gl_renderer, "Gallium"))
+    {
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "R700")          /* Radeon R7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "RV770")  /* Radeon RV770 */
+                || strstr(gl_renderer, "RV790"))  /* Radeon RV790 */
+        {
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
+
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "RV740"))          /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
+        }
+
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "RV730"))        /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
+
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "RV710"))          /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
+
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "R600")
+                || strstr(gl_renderer, "RV670")
+                || strstr(gl_renderer, "R680"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
+
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "RV630")
+                || strstr(gl_renderer, "RV635"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
+
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "RV610")
+                || strstr(gl_renderer, "RV620"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
+
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "RS780")
+                || strstr(gl_renderer, "RS880"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+
+        /* Radeon R5xx */
+        if (strstr(gl_renderer, "RV530")
+                || strstr(gl_renderer, "RV535")
+                || strstr(gl_renderer, "RV560")
+                || strstr(gl_renderer, "R520")
+                || strstr(gl_renderer, "RV570")
+                || strstr(gl_renderer, "R580"))
+        {
+            *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
+            return CARD_ATI_RADEON_X1600;
+        }
+
+        /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+        if (strstr(gl_renderer, "R410")
+                || strstr(gl_renderer, "R420")
+                || strstr(gl_renderer, "R423")
+                || strstr(gl_renderer, "R430")
+                || strstr(gl_renderer, "R480")
+                || strstr(gl_renderer, "R481")
+                || strstr(gl_renderer, "RV410")
+                || strstr(gl_renderer, "RV515")
+                || strstr(gl_renderer, "RV516"))
+        {
+            *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
+            return CARD_ATI_RADEON_X700;
+        }
+
+        /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
+        if (strstr(gl_renderer, "RS400")
+                || strstr(gl_renderer, "RS480")
+                || strstr(gl_renderer, "RS482")
+                || strstr(gl_renderer, "RS485")
+                || strstr(gl_renderer, "RS600")
+                || strstr(gl_renderer, "RS690")
+                || strstr(gl_renderer, "RS740"))
+        {
+            *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+            return CARD_ATI_RADEON_XPRESS_200M;
+        }
+
+        /* Radeon R3xx */
+        if (strstr(gl_renderer, "R300")
+                || strstr(gl_renderer, "RV350")
+                || strstr(gl_renderer, "RV351")
+                || strstr(gl_renderer, "RV360")
+                || strstr(gl_renderer, "RV370")
+                || strstr(gl_renderer, "R350")
+                || strstr(gl_renderer, "R360"))
+        {
+            *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
+            return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+        }
+    }
+
+    if (WINE_D3D9_CAPABLE(gl_info))
     {
-        if (vendor == driver_version_table[i].vendor && device == driver_version_table[i].card)
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "(R700")          /* Radeon R7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "(RV770")  /* Radeon RV770 */
+                || strstr(gl_renderer, "(RV790"))  /* Radeon RV790 */
         {
-            TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device);
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
 
-            driver_info->description = driver_version_table[i].description;
-            driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, driver_version_table[i].d3d_level);
-            driver_info->version_low = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
-                    driver_version_table[i].lopart_lo);
-            break;
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "(RV740"))          /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
         }
-    }
 
-    TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n",
-            driver_info->version_high, driver_info->version_low);
-}
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "(RV730"))        /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
 
-/* Context activation is done by the caller. */
-static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
-{
-    unsigned int i;
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "(RV710"))          /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
 
-    for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
-    {
-        if (!quirk_table[i].match(gl_info, gl_renderer, vendor, device)) continue;
-        TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
-        quirk_table[i].apply(gl_info);
-    }
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "(R600")
+                || strstr(gl_renderer, "(RV670")
+                || strstr(gl_renderer, "(R680"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
 
-    /* Find out if PBOs work as they are supposed to. */
-    test_pbo_functionality(gl_info);
-}
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "(RV630")
+                || strstr(gl_renderer, "(RV635"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
 
-static DWORD wined3d_parse_gl_version(const char *gl_version)
-{
-    const char *ptr = gl_version;
-    int major, minor;
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "(RV610")
+                || strstr(gl_renderer, "(RV620"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
 
-    major = atoi(ptr);
-    if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "(RS780")
+                || strstr(gl_renderer, "(RS880"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+    }
 
-    while (isdigit(*ptr)) ++ptr;
-    if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
+        return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
+    }
 
-    minor = atoi(ptr);
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        *vidmem = 32; /* There are models with up to 64MB */
+        return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
+    }
 
-    TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
+    *vidmem = 16; /* There are 16-32MB models */
+    return CARD_ATI_RAGE_128PRO;
 
-    return MAKEDWORD_VERSION(major, minor);
 }
 
-static enum wined3d_pci_vendor wined3d_guess_vendor(const char *gl_vendor, const char *gl_renderer)
+enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
 {
-    if (strstr(gl_vendor, "NVIDIA"))
-        return VENDOR_NVIDIA;
+    FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+    if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
+    if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
+    if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
+    return CARD_NVIDIA_RIVA_128;
+}
 
-    if (strstr(gl_vendor, "ATI"))
-        return VENDOR_ATI;
+enum wined3d_pci_device (select_card_intel_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n");
+    return CARD_INTEL_I915G;
+}
 
-    if (strstr(gl_vendor, "Intel(R)")
-            || strstr(gl_renderer, "Intel(R)")
-            || strstr(gl_vendor, "Intel Inc."))
-        return VENDOR_INTEL;
 
-    if (strstr(gl_vendor, "Mesa")
-            || strstr(gl_vendor, "DRI R300 Project")
-            || strstr(gl_vendor, "Tungsten Graphics, Inc")
-            || strstr(gl_vendor, "VMware, Inc."))
-        return VENDOR_MESA;
+struct vendor_card_selection
+{
+    enum wined3d_gl_vendor gl_vendor;
+    enum wined3d_pci_vendor card_vendor;
+    const char *description;        /* Description of the card selector i.e. Apple OS/X Intel */
+    enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem );
+};
 
-    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor));
+static const struct vendor_card_selection vendor_card_select_table[] =
+{
+    {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA,  "Nvidia binary driver",     select_card_nvidia_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_NVIDIA,  "Apple OSX NVidia binary driver",   select_card_nvidia_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_ATI,     "Apple OSX AMD/ATI binary driver",  select_card_ati_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_INTEL,   "Apple OSX Intel binary driver",    select_card_intel_binary},
+    {GL_VENDOR_ATI,    HW_VENDOR_ATI,     "AMD/ATI binary driver",    select_card_ati_binary},
+    {GL_VENDOR_MESA,   HW_VENDOR_ATI,     "Mesa AMD/ATI driver",      select_card_ati_mesa},
+    {GL_VENDOR_MESA,   HW_VENDOR_NVIDIA,  "Mesa Nouveau driver",      select_card_nvidia_mesa},
+    {GL_VENDOR_MESA,   HW_VENDOR_INTEL,   "Mesa Intel driver",        select_card_intel_mesa}
+};
 
-    return VENDOR_WINE;
-}
 
 static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor *vendor, unsigned int *vidmem)
+        enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem)
 {
-    /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of
+    /* Above is a list of Nvidia and ATI GPUs. Both vendors have dozens of
      * different GPUs with roughly the same features. In most cases GPUs from a
      * certain family differ in clockspeeds, the amount of video memory and the
      * number of shader pipelines.
@@ -1192,451 +1915,84 @@ static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *
      * memory behind our backs if really needed. Note that the amount of video
      * memory can be overruled using a registry setting. */
 
-    switch (*vendor)
-    {
-        case VENDOR_NVIDIA:
-            /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
-             * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
-             */
-            if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
-            {
-                /* Geforce 200 - highend */
-                if (strstr(gl_renderer, "GTX 280")
-                        || strstr(gl_renderer, "GTX 285")
-                        || strstr(gl_renderer, "GTX 295"))
-                {
-                    *vidmem = 1024;
-                    return CARD_NVIDIA_GEFORCE_GTX280;
-                }
-
-                /* Geforce 200 - midend high */
-                if (strstr(gl_renderer, "GTX 275"))
-                {
-                    *vidmem = 896;
-                    return CARD_NVIDIA_GEFORCE_GTX275;
-                }
-
-                /* Geforce 200 - midend */
-                if (strstr(gl_renderer, "GTX 260"))
-                {
-                    *vidmem = 1024;
-                    return CARD_NVIDIA_GEFORCE_GTX260;
-                }
-                /* Geforce 200 - midend */
-                if (strstr(gl_renderer, "GT 240"))
-                {
-                   *vidmem = 512;
-                   return CARD_NVIDIA_GEFORCE_GT240;
-                }
-
-                /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
-                if (strstr(gl_renderer, "9800")
-                        || strstr(gl_renderer, "GTS 150")
-                        || strstr(gl_renderer, "GTS 250"))
-                {
-                    *vidmem = 512;
-                    return CARD_NVIDIA_GEFORCE_9800GT;
-                }
-
-                /* Geforce9 - midend */
-                if (strstr(gl_renderer, "9600"))
-                {
-                    *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9600GT;
-                }
-
-                /* Geforce9 - midend low / Geforce 200 - low */
-                if (strstr(gl_renderer, "9500")
-                        || strstr(gl_renderer, "GT 120")
-                        || strstr(gl_renderer, "GT 130"))
-                {
-                    *vidmem = 256; /* The 9500GT has 256-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9500GT;
-                }
-
-                /* Geforce9 - lowend */
-                if (strstr(gl_renderer, "9400"))
-                {
-                    *vidmem = 256; /* The 9400GT has 256-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9400GT;
-                }
-
-                /* Geforce9 - lowend low */
-                if (strstr(gl_renderer, "9100")
-                        || strstr(gl_renderer, "9200")
-                        || strstr(gl_renderer, "9300")
-                        || strstr(gl_renderer, "G 100"))
-                {
-                    *vidmem = 256; /* The 9100-9300 cards have 256MB */
-                    return CARD_NVIDIA_GEFORCE_9200;
-                }
-
-                /* Geforce8 - highend */
-                if (strstr(gl_renderer, "8800"))
-                {
-                    *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
-                    return CARD_NVIDIA_GEFORCE_8800GTS;
-                }
-
-                /* Geforce8 - midend mobile */
-                if (strstr(gl_renderer, "8600 M"))
-                {
-                    *vidmem = 512;
-                    return CARD_NVIDIA_GEFORCE_8600MGT;
-                }
-
-                /* Geforce8 - midend */
-                if (strstr(gl_renderer, "8600")
-                        || strstr(gl_renderer, "8700"))
-                {
-                    *vidmem = 256;
-                    return CARD_NVIDIA_GEFORCE_8600GT;
-                }
-
-                /* Geforce8 - lowend */
-                if (strstr(gl_renderer, "8100")
-                        || strstr(gl_renderer, "8200")
-                        || strstr(gl_renderer, "8300")
-                        || strstr(gl_renderer, "8400")
-                        || strstr(gl_renderer, "8500"))
-                {
-                    *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
-                    return CARD_NVIDIA_GEFORCE_8300GS;
-                }
-
-                /* Geforce7 - highend */
-                if (strstr(gl_renderer, "7800")
-                        || strstr(gl_renderer, "7900")
-                        || strstr(gl_renderer, "7950")
-                        || strstr(gl_renderer, "Quadro FX 4")
-                        || strstr(gl_renderer, "Quadro FX 5"))
-                {
-                    *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
-                    return CARD_NVIDIA_GEFORCE_7800GT;
-                }
-
-                /* Geforce7 midend */
-                if (strstr(gl_renderer, "7600")
-                        || strstr(gl_renderer, "7700"))
-                {
-                    *vidmem = 256; /* The 7600 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_7600;
-                }
-
-                /* Geforce7 lower medium */
-                if (strstr(gl_renderer, "7400"))
-                {
-                    *vidmem = 256; /* The 7400 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_7400;
-                }
-
-                /* Geforce7 lowend */
-                if (strstr(gl_renderer, "7300"))
-                {
-                    *vidmem = 256; /* Mac Pros with this card have 256 MB */
-                    return CARD_NVIDIA_GEFORCE_7300;
-                }
-
-                /* Geforce6 highend */
-                if (strstr(gl_renderer, "6800"))
-                {
-                    *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_6800;
-                }
-
-                /* Geforce6 - midend */
-                if (strstr(gl_renderer, "6600")
-                        || strstr(gl_renderer, "6610")
-                        || strstr(gl_renderer, "6700"))
-                {
-                    *vidmem = 128; /* A 6600GT has 128-256MB */
-                    return CARD_NVIDIA_GEFORCE_6600GT;
-                }
-
-                /* Geforce6/7 lowend */
-                *vidmem = 64; /* */
-                return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
-            }
-
-            if (WINE_D3D9_CAPABLE(gl_info))
-            {
-                /* GeforceFX - highend */
-                if (strstr(gl_renderer, "5800")
-                        || strstr(gl_renderer, "5900")
-                        || strstr(gl_renderer, "5950")
-                        || strstr(gl_renderer, "Quadro FX"))
-                {
-                    *vidmem = 256; /* 5800-5900 cards use 256MB */
-                    return CARD_NVIDIA_GEFORCEFX_5800;
-                }
-
-                /* GeforceFX - midend */
-                if (strstr(gl_renderer, "5600")
-                        || strstr(gl_renderer, "5650")
-                        || strstr(gl_renderer, "5700")
-                        || strstr(gl_renderer, "5750"))
-                {
-                    *vidmem = 128; /* A 5600 uses 128-256MB */
-                    return CARD_NVIDIA_GEFORCEFX_5600;
-                }
-
-                /* GeforceFX - lowend */
-                *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
-                return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
-            }
-
-            if (WINE_D3D8_CAPABLE(gl_info))
-            {
-                if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
-                {
-                    *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
-                    return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
-                }
-
-                *vidmem = 64; /* Geforce3 cards have 64-128MB */
-                return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
-            }
-
-            if (WINE_D3D7_CAPABLE(gl_info))
-            {
-                if (strstr(gl_renderer, "GeForce4 MX"))
-                {
-                    /* Most Geforce4MX GPUs have at least 64MB of memory, some
-                     * early models had 32MB but most have 64MB or even 128MB. */
-                    *vidmem = 64;
-                    return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
-                }
-
-                if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
-                {
-                    *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
-                    return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
-                }
-
-                if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
-                {
-                    *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
-                    return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
-                }
-
-                /* Most Geforce1 cards have 32MB, there are also some rare 16
-                 * and 64MB (Dell) models. */
-                *vidmem = 32;
-                return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
-            }
-
-            if (strstr(gl_renderer, "TNT2"))
-            {
-                *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
-                return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
-            }
-
-            *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
-            return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
-
-        case VENDOR_ATI:
-            /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
-             *
-             * Beware: renderer string do not match exact card model,
-             * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
-            if (WINE_D3D9_CAPABLE(gl_info))
-            {
-                /* Radeon EG CYPRESS XT / PRO HD5800 - highend */
-                if (strstr(gl_renderer, "HD 5800")          /* Radeon EG CYPRESS HD58xx generic renderer string */
-                        || strstr(gl_renderer, "HD 5850")   /* Radeon EG CYPRESS XT */
-                        || strstr(gl_renderer, "HD 5870"))  /* Radeon EG CYPRESS PRO */
-                {
-                    *vidmem = 1024; /* note: HD58xx cards use 1024MB  */
-                    return CARD_ATI_RADEON_HD5800;
-                }
-
-                /* Radeon EG JUNIPER XT / LE HD5700 - midend */
-                if (strstr(gl_renderer, "HD 5700")          /* Radeon EG JUNIPER HD57xx generic renderer string */
-                        || strstr(gl_renderer, "HD 5750")   /* Radeon EG JUNIPER LE */
-                        || strstr(gl_renderer, "HD 5770"))  /* Radeon EG JUNIPER XT */
-                {
-                    *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB  */
-                    return CARD_ATI_RADEON_HD5700;
-                }
-
-                /* Radeon R7xx HD4800 - highend */
-                if (strstr(gl_renderer, "HD 4800")          /* Radeon RV7xx HD48xx generic renderer string */
-                        || strstr(gl_renderer, "HD 4830")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4850")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4870")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4890"))  /* Radeon RV790 */
-                {
-                    *vidmem = 512; /* note: HD4890 cards use 1024MB */
-                    return CARD_ATI_RADEON_HD4800;
-                }
-
-                /* Radeon R740 HD4700 - midend */
-                if (strstr(gl_renderer, "HD 4700")          /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4770"))  /* Radeon RV740 */
-                {
-                    *vidmem = 512;
-                    return CARD_ATI_RADEON_HD4700;
-                }
-
-                /* Radeon R730 HD4600 - midend */
-                if (strstr(gl_renderer, "HD 4600")          /* Radeon RV730 */
-                        || strstr(gl_renderer, "HD 4650")   /* Radeon RV730 */
-                        || strstr(gl_renderer, "HD 4670"))  /* Radeon RV730 */
-                {
-                    *vidmem = 512;
-                    return CARD_ATI_RADEON_HD4600;
-                }
-
-                /* Radeon R710 HD4500/HD4350 - lowend */
-                if (strstr(gl_renderer, "HD 4350")          /* Radeon RV710 */
-                        || strstr(gl_renderer, "HD 4550"))  /* Radeon RV710 */
-                {
-                    *vidmem = 256;
-                    return CARD_ATI_RADEON_HD4350;
-                }
-
-                /* Radeon R6xx HD2900/HD3800 - highend */
-                if (strstr(gl_renderer, "HD 2900")
-                        || strstr(gl_renderer, "HD 3870")
-                        || strstr(gl_renderer, "HD 3850"))
-                {
-                    *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
-                    return CARD_ATI_RADEON_HD2900;
-                }
-
-                /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
-                if (strstr(gl_renderer, "HD 2600")
-                        || strstr(gl_renderer, "HD 3830")
-                        || strstr(gl_renderer, "HD 3690")
-                        || strstr(gl_renderer, "HD 3650"))
-                {
-                    *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
-                    return CARD_ATI_RADEON_HD2600;
-                }
-
-                /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
-                if (strstr(gl_renderer, "HD 2300")
-                        || strstr(gl_renderer, "HD 2400")
-                        || strstr(gl_renderer, "HD 3470")
-                        || strstr(gl_renderer, "HD 3450")
-                        || strstr(gl_renderer, "HD 3430")
-                        || strstr(gl_renderer, "HD 3400"))
-                {
-                    *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
-                    return CARD_ATI_RADEON_HD2300;
-                }
-
-                /* Radeon R6xx/R7xx integrated */
-                if (strstr(gl_renderer, "HD 3100")
-                        || strstr(gl_renderer, "HD 3200")
-                        || strstr(gl_renderer, "HD 3300"))
-                {
-                    *vidmem = 128; /* 128MB */
-                    return CARD_ATI_RADEON_HD3200;
-                }
-
-                /* Radeon R5xx */
-                if (strstr(gl_renderer, "X1600")
-                        || strstr(gl_renderer, "X1650")
-                        || strstr(gl_renderer, "X1800")
-                        || strstr(gl_renderer, "X1900")
-                        || strstr(gl_renderer, "X1950"))
-                {
-                    *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
-                    return CARD_ATI_RADEON_X1600;
-                }
-
-                /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
-                if (strstr(gl_renderer, "X700")
-                        || strstr(gl_renderer, "X800")
-                        || strstr(gl_renderer, "X850")
-                        || strstr(gl_renderer, "X1300")
-                        || strstr(gl_renderer, "X1400")
-                        || strstr(gl_renderer, "X1450")
-                        || strstr(gl_renderer, "X1550"))
-                {
-                    *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
-                    return CARD_ATI_RADEON_X700;
-                }
-
-                /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
-                if (strstr(gl_renderer, "Radeon Xpress"))
-                {
-                    *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
-                    return CARD_ATI_RADEON_XPRESS_200M;
-                }
-
-                /* Radeon R3xx */
-                *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
-                return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
-            }
+    int i;
 
-            if (WINE_D3D8_CAPABLE(gl_info))
-            {
-                *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
-                return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
-            }
-
-            if (WINE_D3D7_CAPABLE(gl_info))
-            {
-                *vidmem = 32; /* There are models with up to 64MB */
-                return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
-            }
+    for (i = 0; i < (sizeof(vendor_card_select_table) / sizeof(*vendor_card_select_table)); ++i)
+    {
+        if ((vendor_card_select_table[i].gl_vendor != *gl_vendor)
+            || (vendor_card_select_table[i].card_vendor != *card_vendor))
+                continue;
+        TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description);
+        return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem);
+    }
+
+    FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n",
+                     *gl_vendor, *card_vendor);
+
+    /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
+     * for Nvidia was because the hardware and drivers they make are of good quality. This makes
+     * them a good generic choice. */
+    *card_vendor = HW_VENDOR_NVIDIA;
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+    if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
+    if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
+    if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
+    return CARD_NVIDIA_RIVA_128;
+}
 
-            *vidmem = 16; /* There are 16-32MB models */
-            return CARD_ATI_RAGE_128PRO;
+static const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter)
+{
+    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+    int vs_selected_mode, ps_selected_mode;
+
+    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
+    else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
+    else if (gl_info->supported[NV_REGISTER_COMBINERS]
+            && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
+    else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
+    else return &ffp_fragment_pipeline;
+}
 
-        case VENDOR_INTEL:
-            if (strstr(gl_renderer, "X3100"))
-            {
-                /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */
-                *vidmem = 128;
-                return CARD_INTEL_X3100;
-            }
+static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter)
+{
+    int vs_selected_mode, ps_selected_mode;
 
-            if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
-            {
-                /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
-                *vidmem = 64;
-                return CARD_INTEL_I945GM;
-            }
+    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
+    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
+    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
+    return &none_shader_backend;
+}
 
-            if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
-            if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
-            if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
-            if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
-            if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
-            return CARD_INTEL_I915G;
+static const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter)
+{
+    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+    int vs_selected_mode, ps_selected_mode;
 
-        case VENDOR_MESA:
-        case VENDOR_WINE:
-        default:
-            /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
-             * for Nvidia was because the hardware and drivers they make are of good quality. This makes
-             * them a good generic choice. */
-            *vendor = VENDOR_NVIDIA;
-            if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
-            if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
-            if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
-            if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
-            return CARD_NVIDIA_RIVA_128;
-    }
+    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
+    else return &ffp_blit;
 }
 
 /* Context activation is done by the caller. */
-static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, struct wined3d_gl_info *gl_info)
+static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
 {
+    struct wined3d_driver_info *driver_info = &adapter->driver_info;
+    struct wined3d_gl_info *gl_info = &adapter->gl_info;
     const char *GL_Extensions    = NULL;
     const char *WGL_Extensions   = NULL;
-    const char *gl_string        = NULL;
-    enum wined3d_pci_vendor vendor;
+    const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
+    struct fragment_caps fragment_caps;
+    enum wined3d_gl_vendor gl_vendor;
+    enum wined3d_pci_vendor card_vendor;
     enum wined3d_pci_device device;
     GLint       gl_max;
     GLfloat     gl_floatv[2];
     unsigned    i;
     HDC         hdc;
     unsigned int vidmem=0;
-    char *gl_renderer;
     DWORD gl_version;
     size_t len;
 
@@ -1644,48 +2000,34 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
 
     ENTER_GL();
 
-    gl_string = (const char *)glGetString(GL_RENDERER);
-    TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_renderer_str = (const char *)glGetString(GL_RENDERER);
+    TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str));
+    if (!gl_renderer_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_RENDERER.\n");
         return FALSE;
     }
 
-    len = strlen(gl_string) + 1;
-    gl_renderer = HeapAlloc(GetProcessHeap(), 0, len);
-    if (!gl_renderer)
-    {
-        LEAVE_GL();
-        ERR_(d3d_caps)("Failed to allocate gl_renderer memory.\n");
-        return FALSE;
-    }
-    memcpy(gl_renderer, gl_string, len);
-
-    gl_string = (const char *)glGetString(GL_VENDOR);
-    TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_vendor_str = (const char *)glGetString(GL_VENDOR);
+    TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str));
+    if (!gl_vendor_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
-    vendor = wined3d_guess_vendor(gl_string, gl_renderer);
-    TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x)\n", debugstr_a(gl_string), vendor);
 
     /* Parse the GL_VERSION field into major and minor information */
-    gl_string = (const char *)glGetString(GL_VERSION);
-    TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_version_str = (const char *)glGetString(GL_VERSION);
+    TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_version_str));
+    if (!gl_version_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_VERSION.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
-    gl_version = wined3d_parse_gl_version(gl_string);
+    gl_version = wined3d_parse_gl_version(gl_version_str);
 
     /*
      * Initialize openGL extension related variables
@@ -1694,7 +2036,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
     memset(gl_info->supported, 0, sizeof(gl_info->supported));
     gl_info->limits.buffers = 1;
     gl_info->limits.textures = 1;
-    gl_info->limits.texture_stages = 1;
     gl_info->limits.fragment_samplers = 1;
     gl_info->limits.vertex_samplers = 0;
     gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
@@ -1734,7 +2075,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
 
@@ -1831,6 +2171,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
             gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
         }
     }
+    if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+    {
+        /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same
+         * functionality. Prefer the ARB extension */
+        gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] = FALSE;
+    }
     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
     {
         TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
@@ -1841,6 +2187,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n");
         gl_info->supported[ARB_DEPTH_CLAMP] = TRUE;
     }
+    if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+    {
+        TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n");
+        gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE;
+    }
     if (gl_info->supported[NV_TEXTURE_SHADER2])
     {
         if (gl_info->supported[NV_REGISTER_COMBINERS])
@@ -1851,6 +2202,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
             gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
         }
     }
+
+    if (gl_info->supported[NV_REGISTER_COMBINERS])
+    {
+        glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
+        gl_info->limits.general_combiners = gl_max;
+        TRACE_(d3d_caps)("Max general combiners: %d.\n", gl_max);
+    }
     if (gl_info->supported[ARB_DRAW_BUFFERS])
     {
         glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
@@ -1863,18 +2221,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
         TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->limits.textures);
 
-        if (gl_info->supported[NV_REGISTER_COMBINERS])
-        {
-            GLint tmp;
-            glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp);
-            gl_info->limits.texture_stages = min(MAX_TEXTURES, tmp);
-        }
-        else
-        {
-            gl_info->limits.texture_stages = min(MAX_TEXTURES, gl_max);
-        }
-        TRACE_(d3d_caps)("Max texture stages: %d.\n", gl_info->limits.texture_stages);
-
         if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
         {
             GLint tmp;
@@ -1998,6 +2344,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.glsl_varyings = gl_max;
         TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
     }
+    if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
+    {
+        const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
+        TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
+    }
     if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
     {
         glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
@@ -2024,7 +2375,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE;
         gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
         gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
-        gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
     }
     if (gl_info->supported[NV_HALF_FLOAT])
     {
@@ -2043,6 +2393,14 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
 
     LEAVE_GL();
 
+    adapter->fragment_pipe = select_fragment_implementation(adapter);
+    adapter->shader_backend = select_shader_backend(adapter);
+    adapter->blitter = select_blit_implementation(adapter);
+
+    adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
+    gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages;
+    TRACE_(d3d_caps)("Max texture stages: %u.\n", gl_info->limits.texture_stages);
+
     /* In some cases the number of texture stages can be larger than the number
      * of samplers. The GF4 for example can use only 2 samplers (no fragment
      * shaders), but 8 texture stages (register combiners). */
@@ -2113,8 +2471,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.buffers = 1;
     }
 
-    device = wined3d_guess_card(gl_info, gl_renderer, &vendor, &vidmem);
-    TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", vendor, device);
+    gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str);
+    card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
+    TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor);
+
+    device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem);
+    TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device);
 
     /* If we have an estimate use it, else default to 64MB;  */
     if(vidmem)
@@ -2176,11 +2538,10 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         }
     }
 
-    fixup_extensions(gl_info, gl_renderervendor, device);
-    init_driver_info(driver_info, vendor, device);
+    fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
+    init_driver_info(driver_info, card_vendor, device);
     add_gl_compat_wrappers(gl_info);
 
-    HeapFree(GetProcessHeap(), 0, gl_renderer);
     return TRUE;
 }
 
@@ -2644,7 +3005,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
                 continue;
             if(cfgs[i].blueSize != blueSize)
                 continue;
-            if(cfgs[i].alphaSize != alphaSize)
+            /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */
+            if(alphaSize && cfgs[i].alphaSize != alphaSize)
+                continue;
+            if(cfgs[i].colorSize != (glDesc->byte_count << 3))
                 continue;
 
             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
@@ -2748,8 +3112,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
 static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
 {
-    const struct fragment_pipeline *fp;
-
     switch(format_desc->format)
     {
         case WINED3DFMT_R8G8_SNORM:
@@ -2760,8 +3122,7 @@ static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
             /* Ask the fixed function pipeline implementation if it can deal
              * with the conversion. If we've got a GL extension giving native
              * support this will be an identity conversion. */
-            fp = select_fragment_implementation(adapter, DeviceType);
-            if (fp->color_fixup_supported(format_desc->color_fixup))
+            if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
             {
                 TRACE_(d3d_caps)("[OK]\n");
                 return TRUE;
@@ -2951,8 +3312,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
 {
     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    const shader_backend_t *shader_backend;
-    const struct fragment_pipeline *fp;
 
     switch (format_desc->format)
     {
@@ -3030,8 +3389,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             /* Ask the shader backend if it can deal with the conversion. If
              * we've got a GL extension giving native support this will be an
              * identity conversion. */
-            shader_backend = select_shader_backend(adapter, DeviceType);
-            if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
+            if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
             {
                 TRACE_(d3d_caps)("[OK]\n");
                 return TRUE;
@@ -3147,10 +3505,8 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
                     || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
             {
-                shader_backend = select_shader_backend(adapter, DeviceType);
-                fp = select_fragment_implementation(adapter, DeviceType);
-                if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
-                        && fp->color_fixup_supported(format_desc->color_fixup))
+                if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
+                        && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
                 {
                     TRACE_(d3d_caps)("[OK]\n");
                     return TRUE;
@@ -3186,8 +3542,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
 static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType)
 {
-    const struct blit_shader *blitter;
-
     if(SurfaceType == SURFACE_GDI) {
         switch(check_format_desc->format)
         {
@@ -3223,8 +3577,7 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
     if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE;
 
     /* If opengl can't process the format natively, the blitter may be able to convert it */
-    blitter = select_blit_implementation(adapter, DeviceType);
-    if (blitter->color_fixup_supported(check_format_desc->color_fixup))
+    if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup))
     {
         TRACE_(d3d_caps)("[OK]\n");
         return TRUE;
@@ -3789,8 +4142,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     int ps_selected_mode;
     struct shader_caps shader_caps;
     struct fragment_caps fragment_caps;
-    const shader_backend_t *shader_backend;
-    const struct fragment_pipeline *frag_pipeline = NULL;
     DWORD ckey_caps, blit_caps, fx_caps;
 
     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
@@ -4167,12 +4518,10 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     pCaps->VertexTextureFilterCaps           = 0;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
-    shader_backend = select_shader_backend(adapter, DeviceType);
-    shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
+    adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
 
     memset(&fragment_caps, 0, sizeof(fragment_caps));
-    frag_pipeline = select_fragment_implementation(adapter, DeviceType);
-    frag_pipeline->get_caps(DeviceType, &adapter->gl_info, &fragment_caps);
+    adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
 
     /* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
     pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps;
@@ -4697,7 +5046,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
             goto nogl_adapter;
         }
 
-        ret = IWineD3DImpl_FillGLCaps(&adapter->driver_info, &adapter->gl_info);
+        ret = IWineD3DImpl_FillGLCaps(adapter);
         if(!ret) {
             ERR("Failed to initialize gl caps for default adapter\n");
             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
@@ -4729,8 +5078,8 @@ BOOL InitAdapters(IWineD3DImpl *This)
         if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
         {
             int attribute;
-            int attribs[10];
-            int values[10];
+            int attribs[11];
+            int values[11];
             int nAttribs = 0;
 
             attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
@@ -4742,6 +5091,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
             attribs[nAttribs++] = WGL_GREEN_BITS_ARB;
             attribs[nAttribs++] = WGL_BLUE_BITS_ARB;
             attribs[nAttribs++] = WGL_ALPHA_BITS_ARB;
+            attribs[nAttribs++] = WGL_COLOR_BITS_ARB;
             attribs[nAttribs++] = WGL_DEPTH_BITS_ARB;
             attribs[nAttribs++] = WGL_STENCIL_BITS_ARB;
             attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB;
@@ -4762,12 +5112,13 @@ BOOL InitAdapters(IWineD3DImpl *This)
                 cfgs->greenSize = values[1];
                 cfgs->blueSize = values[2];
                 cfgs->alphaSize = values[3];
-                cfgs->depthSize = values[4];
-                cfgs->stencilSize = values[5];
-                cfgs->windowDrawable = values[6];
-                cfgs->iPixelType = values[7];
-                cfgs->doubleBuffer = values[8];
-                cfgs->auxBuffers = values[9];
+                cfgs->colorSize = values[4];
+                cfgs->depthSize = values[5];
+                cfgs->stencilSize = values[6];
+                cfgs->windowDrawable = values[7];
+                cfgs->iPixelType = values[8];
+                cfgs->doubleBuffer = values[9];
+                cfgs->auxBuffers = values[10];
 
                 cfgs->pbufferDrawable = FALSE;
                 /* Check for pbuffer support when it is around as
@@ -4794,7 +5145,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
                     }
                 }
 
-                TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable);
+                TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable);
                 cfgs++;
             }
         }
@@ -4828,6 +5179,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
                 cfgs->greenSize = ppfd.cGreenBits;
                 cfgs->blueSize = ppfd.cBlueBits;
                 cfgs->alphaSize = ppfd.cAlphaBits;
+                cfgs->colorSize = ppfd.cColorBits;
                 cfgs->depthSize = ppfd.cDepthBits;
                 cfgs->stencilSize = ppfd.cStencilBits;
                 cfgs->pbufferDrawable = 0;
index dbeb799..b29d012 100644 (file)
@@ -334,7 +334,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format
             GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr));
             break;
         case WINED3DFMT_B8G8R8A8_UNORM:
-            if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+            if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
             {
                 const DWORD *src = ptr;
                 DWORD c = *src & 0xff00ff00;
@@ -690,6 +690,9 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
 
     /* Finished updating the screen, restore lock */
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     TRACE("Done all gl drawing\n");
@@ -1100,7 +1103,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
     if(patch->has_texcoords) {
         vtxStride += 4 * sizeof(float);
     }
-    memset(&patch->strided, 0, sizeof(&patch->strided));
+    memset(&patch->strided, 0, sizeof(patch->strided));
     patch->strided.position.format = WINED3DFMT_R32G32B32_FLOAT;
     patch->strided.position.lpData = (BYTE *) patch->mem;
     patch->strided.position.dwStride = vtxStride;
index 90b5092..cb23ee6 100644 (file)
@@ -156,6 +156,20 @@ struct glsl_vshader_private
     UINT                            num_gl_shaders, shader_array_size;
 };
 
+static const char *debug_gl_shader_type(GLenum type)
+{
+    switch (type)
+    {
+#define WINED3D_TO_STR(u) case u: return #u
+        WINED3D_TO_STR(GL_VERTEX_SHADER_ARB);
+        WINED3D_TO_STR(GL_GEOMETRY_SHADER_ARB);
+        WINED3D_TO_STR(GL_FRAGMENT_SHADER_ARB);
+#undef WINED3D_TO_STR
+        default:
+            return wine_dbg_sprintf("UNKNOWN(%#x)", type);
+    }
+}
+
 /* Extract a line from the info log.
  * Note that this modifies the source string. */
 static char *get_info_log_line(char **ptr)
@@ -238,6 +252,81 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA
     }
 }
 
+/* GL locking is done by the caller. */
+static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+    GLint i, object_count, source_size;
+    GLhandleARB *objects;
+    char *source = NULL;
+
+    GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_ATTACHED_OBJECTS_ARB, &object_count));
+    objects = HeapAlloc(GetProcessHeap(), 0, object_count * sizeof(*objects));
+    if (!objects)
+    {
+        ERR("Failed to allocate object array memory.\n");
+        return;
+    }
+
+    GL_EXTCALL(glGetAttachedObjectsARB(program, object_count, NULL, objects));
+    for (i = 0; i < object_count; ++i)
+    {
+        char *ptr, *line;
+        GLint tmp;
+
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp));
+
+        if (!source || source_size < tmp)
+        {
+            HeapFree(GetProcessHeap(), 0, source);
+
+            source = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tmp);
+            if (!source)
+            {
+                ERR("Failed to allocate %d bytes for shader source.\n", tmp);
+                HeapFree(GetProcessHeap(), 0, objects);
+                return;
+            }
+            source_size = tmp;
+        }
+
+        FIXME("Object %u:\n", objects[i]);
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SUBTYPE_ARB, &tmp));
+        FIXME("    GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp));
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_COMPILE_STATUS_ARB, &tmp));
+        FIXME("    GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp);
+        FIXME("\n");
+
+        ptr = source;
+        GL_EXTCALL(glGetShaderSourceARB(objects[i], source_size, NULL, source));
+        while ((line = get_info_log_line(&ptr))) FIXME("    %s\n", line);
+        FIXME("\n");
+    }
+
+    HeapFree(GetProcessHeap(), 0, source);
+    HeapFree(GetProcessHeap(), 0, objects);
+}
+
+/* GL locking is done by the caller. */
+static void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+    GLint tmp;
+
+    if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
+
+    GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp));
+    if (tmp == GL_PROGRAM_OBJECT_ARB)
+    {
+        GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp));
+        if (!tmp)
+        {
+            FIXME("Program %u link status invalid.\n", program);
+            shader_glsl_dump_program_source(gl_info, program);
+        }
+    }
+
+    print_glsl_info_log(gl_info, program);
+}
+
 /**
  * Loads (pixel shader) samplers
  */
@@ -1083,6 +1172,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
         }
     }
 
+    shader_addline(buffer, "const float FLT_MAX = 1e38;\n");
+
     /* Start the main program */
     shader_addline(buffer, "void main() {\n");
     if(pshader && reg_maps->vpos) {
@@ -1194,8 +1285,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
     static const char * const hwrastout_reg_names[] = { "gl_Position", "gl_FogFragCoord", "gl_PointSize" };
 
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
 
     *is_color = FALSE;
@@ -1552,7 +1642,8 @@ static inline const char *shader_get_comp_op(DWORD op)
     }
 }
 
-static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
+static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_info,
+        DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
 {
     BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED;
     BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT;
@@ -1564,9 +1655,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_1D:
             if(lod) {
                 sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
-            } else  if(grad) {
-                sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
-            } else {
+            }
+            else  if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
+                else
+                {
+                    FIXME("Unsupported 1D grad function.\n");
+                    sample_function->name = "unsupported1DGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = projected ? "texture1DProj" : "texture1D";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
@@ -1575,20 +1678,41 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
             if(texrect) {
                 if(lod) {
                     sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
-                } else  if(grad) {
-                    /* What good are texrect grad functions? I don't know, but GL_EXT_gpu_shader4 defines them.
-                    * There is no GL_ARB_shader_texture_lod spec yet, so I don't know if they're defined there
-                     */
-                    sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB";
-                } else {
+                }
+                else  if (grad)
+                {
+                    if (gl_info->supported[EXT_GPU_SHADER4])
+                        sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad";
+                    else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                        sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB";
+                    else
+                    {
+                        FIXME("Unsupported RECT grad function.\n");
+                        sample_function->name = "unsupported2DRectGrad";
+                    }
+                }
+                else
+                {
                     sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
                 }
             } else {
                 if(lod) {
                     sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
-                } else  if(grad) {
-                    sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
-                } else {
+                }
+                else  if (grad)
+                {
+                    if (gl_info->supported[EXT_GPU_SHADER4])
+                        sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad";
+                    else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                        sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
+                    else
+                    {
+                        FIXME("Unsupported 2D grad function.\n");
+                        sample_function->name = "unsupported2DGrad";
+                    }
+                }
+                else
+                {
                     sample_function->name = projected ? "texture2DProj" : "texture2D";
                 }
             }
@@ -1597,9 +1721,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_CUBE:
             if(lod) {
                 sample_function->name = "textureCubeLod";
-            } else if(grad) {
-                sample_function->name = "textureCubeGradARB";
-            } else {
+            }
+            else if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = "textureCubeGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = "textureCubeGradARB";
+                else
+                {
+                    FIXME("Unsupported Cube grad function.\n");
+                    sample_function->name = "unsupportedCubeGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = "textureCube";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1607,9 +1743,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_VOLUME:
             if(lod) {
                 sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
-            } else  if(grad) {
-                sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
-            } else {
+            }
+            else  if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
+                else
+                {
+                    FIXME("Unsupported 3D grad function.\n");
+                    sample_function->name = "unsupported3DGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = projected ? "texture3DProj" : "texture3D";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1681,10 +1829,10 @@ static void shader_glsl_color_correction(const struct wined3d_shader_instruction
 
     if (!mask) return; /* Nothing to do */
 
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
-        FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+        enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+        FIXME("Complex fixup (%#x) not supported\n",complex_fixup);
         return;
     }
 
@@ -1822,6 +1970,7 @@ static void shader_glsl_arith(const struct wined3d_shader_instruction *ins)
 /* Process the WINED3DSIO_MOV opcode using GLSL (dst = src) */
 static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     glsl_src_param_t src0_param;
     DWORD write_mask;
@@ -1847,12 +1996,26 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
     {
         /* We need to *round* to the nearest int here. */
         unsigned int mask_size = shader_glsl_get_write_mask_size(write_mask);
-        if (mask_size > 1) {
-            shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n", mask_size, src0_param.param_str, mask_size, src0_param.param_str);
-        } else {
-            shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n", src0_param.param_str, src0_param.param_str);
+
+        if (gl_info->supported[EXT_GPU_SHADER4])
+        {
+            if (mask_size > 1)
+                shader_addline(buffer, "ivec%d(round(%s)));\n", mask_size, src0_param.param_str);
+            else
+                shader_addline(buffer, "int(round(%s)));\n", src0_param.param_str);
         }
-    } else {
+        else
+        {
+            if (mask_size > 1)
+                shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n",
+                        mask_size, src0_param.param_str, mask_size, src0_param.param_str);
+            else
+                shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n",
+                        src0_param.param_str, src0_param.param_str);
+        }
+    }
+    else
+    {
         shader_addline(buffer, "%s);\n", src0_param.param_str);
     }
 }
@@ -1942,10 +2105,15 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param);
 
-    if (dst_size > 1) {
-        shader_addline(buffer, "vec%d(log2(abs(%s))));\n", dst_size, src0_param.param_str);
-    } else {
-        shader_addline(buffer, "log2(abs(%s)));\n", src0_param.param_str);
+    if (dst_size > 1)
+    {
+        shader_addline(buffer, "vec%d(%s == 0.0 ? -FLT_MAX : log2(abs(%s))));\n",
+                dst_size, src0_param.param_str, src0_param.param_str);
+    }
+    else
+    {
+        shader_addline(buffer, "%s == 0.0 ? -FLT_MAX : log2(abs(%s)));\n",
+                src0_param.param_str, src0_param.param_str);
     }
 }
 
@@ -1966,7 +2134,6 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
         case WINED3DSIH_MAX: instruction = "max"; break;
         case WINED3DSIH_ABS: instruction = "abs"; break;
         case WINED3DSIH_FRC: instruction = "fract"; break;
-        case WINED3DSIH_NRM: instruction = "normalize"; break;
         case WINED3DSIH_EXP: instruction = "exp2"; break;
         case WINED3DSIH_DSX: instruction = "dFdx"; break;
         case WINED3DSIH_DSY: instruction = "ycorrection.y * dFdy"; break;
@@ -1993,6 +2160,22 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
     shader_addline(buffer, "));\n");
 }
 
+static void shader_glsl_nrm(const struct wined3d_shader_instruction *ins)
+{
+    struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+    glsl_src_param_t src_param;
+    DWORD write_mask;
+    char dst_mask[6];
+
+    write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask);
+    shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
+
+    shader_addline(buffer, "tmp0.x = length(%s);\n", src_param.param_str);
+    shader_glsl_append_dst(buffer, ins);
+    shader_addline(buffer, "tmp0.x == 0.0 ? (%s * FLT_MAX) : (%s / tmp0.x));",
+            src_param.param_str, src_param.param_str);
+}
+
 /** Process the WINED3DSIO_EXPP instruction in GLSL:
  * For shader model 1.x, do the following (and honor the writemask, so use a temporary variable):
  *   dst.x = 2^(floor(src))
@@ -2046,10 +2229,15 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins)
     mask_size = shader_glsl_get_write_mask_size(write_mask);
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
 
-    if (mask_size > 1) {
-        shader_addline(ins->ctx->buffer, "vec%d(1.0 / %s));\n", mask_size, src_param.param_str);
-    } else {
-        shader_addline(ins->ctx->buffer, "1.0 / %s);\n", src_param.param_str);
+    if (mask_size > 1)
+    {
+        shader_addline(ins->ctx->buffer, "vec%d(%s == 0.0 ? FLT_MAX : 1.0 / %s));\n",
+                mask_size, src_param.param_str, src_param.param_str);
+    }
+    else
+    {
+        shader_addline(ins->ctx->buffer, "%s == 0.0 ? FLT_MAX : 1.0 / %s);\n",
+                src_param.param_str, src_param.param_str);
     }
 }
 
@@ -2065,10 +2253,15 @@ static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
 
-    if (mask_size > 1) {
-        shader_addline(buffer, "vec%d(inversesqrt(%s)));\n", mask_size, src_param.param_str);
-    } else {
-        shader_addline(buffer, "inversesqrt(%s));\n", src_param.param_str);
+    if (mask_size > 1)
+    {
+        shader_addline(buffer, "vec%d(%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s))));\n",
+                mask_size, src_param.param_str, src_param.param_str);
+    }
+    else
+    {
+        shader_addline(buffer, "%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s)));\n",
+                src_param.param_str, src_param.param_str);
     }
 }
 
@@ -2671,10 +2864,11 @@ static void shader_glsl_ret(const struct wined3d_shader_instruction *ins)
  ********************************************/
 static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     DWORD sample_flags = 0;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -2728,7 +2922,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
 
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     mask |= sample_function.coord_mask;
 
     if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE;
@@ -2762,7 +2956,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
 {
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param, dx_param, dy_param;
     DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
@@ -2770,7 +2964,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
     DWORD sampler_idx;
     DWORD swizzle = ins->src[1].swizzle;
 
-    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4])
     {
         FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n");
         return shader_glsl_tex(ins);
@@ -2783,7 +2977,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
 
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
     shader_glsl_add_src_param(ins, &ins->src[2], sample_function.coord_mask, &dx_param);
     shader_glsl_add_src_param(ins, &ins->src[3], sample_function.coord_mask, &dy_param);
@@ -2796,7 +2990,7 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
 {
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param, lod_param;
     DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
@@ -2810,12 +3004,12 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
        IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
 
-    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD]
+    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4]
             && shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
     {
         /* The GLSL spec claims the Lod sampling functions are only supported in vertex shaders.
@@ -2877,6 +3071,7 @@ static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
  * then perform a 1D texture lookup from stage dstregnum, place into dst. */
 static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     glsl_sample_function_t sample_function;
     DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -2891,7 +3086,7 @@ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
      *
      * It is a dependent read - not valid with conditional NP2 textures
      */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask);
 
     switch(mask_size)
@@ -2990,7 +3185,7 @@ static void shader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins)
  * Calculate the 1st or 2nd row of a 3-row matrix multiplication. */
 static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3004,6 +3199,7 @@ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
 
 static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3014,7 +3210,7 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
     shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
     shader_addline(buffer, "tmp0.y = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xy");
@@ -3025,10 +3221,11 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
 static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
 {
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD reg = ins->dst[0].reg.idx;
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
     glsl_sample_function_t sample_function;
 
@@ -3036,7 +3233,7 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
     shader_addline(ins->ctx->buffer, "tmp0.z = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3049,11 +3246,11 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
 static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
 {
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     glsl_src_param_t src0_param;
     char dst_mask[6];
     DWORD reg = ins->dst[0].reg.idx;
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
 
     shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
 
@@ -3068,7 +3265,8 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
  * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
 static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD reg = ins->dst[0].reg.idx;
     glsl_src_param_t src0_param;
     glsl_src_param_t src1_param;
@@ -3087,7 +3285,7 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
     shader_addline(buffer, "tmp0.xyz = -reflect((%s), normalize(tmp0.xyz));\n", src1_param.param_str);
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(stype, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, stype, 0, &sample_function);
 
     /* Sample the texture */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3099,7 +3297,8 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
  * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
 static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
@@ -3119,7 +3318,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
     shader_addline(buffer, "tmp0.xyz = -reflect(tmp1.xyz, normalize(tmp0.xyz));\n");
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3133,8 +3332,9 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
  */
 static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -3148,7 +3348,7 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
 
     sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     mask = sample_function.coord_mask;
 
     shader_glsl_write_mask_to_str(mask, coord_mask);
@@ -3207,6 +3407,7 @@ static void shader_glsl_bem(const struct wined3d_shader_instruction *ins)
  * Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */
 static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3214,7 +3415,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
             "%s.wx", src0_param.reg_name);
 }
@@ -3223,6 +3424,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
  * Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */
 static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3230,7 +3432,7 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
             "%s.yz", src0_param.reg_name);
 }
@@ -3239,13 +3441,14 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
  * Sample texture at dst using the rgb (xyz) components of src as texture coordinates */
 static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
     glsl_sample_function_t sample_function;
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &src0_param);
 
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
@@ -3759,6 +3962,10 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
          */
         shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
     }
+    if (gl_info->supported[EXT_GPU_SHADER4])
+    {
+        shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+    }
 
     /* Base Declarations */
     shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx);
@@ -3846,6 +4053,11 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
 
     shader_addline(buffer, "#version 120\n");
 
+    if (gl_info->supported[EXT_GPU_SHADER4])
+    {
+        shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+    }
+
     memset(&priv_ctx, 0, sizeof(priv_ctx));
     priv_ctx.cur_vs_args = args;
 
@@ -4149,7 +4361,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
     /* Link the program */
     TRACE("Linking GLSL shader program %u\n", programId);
     GL_EXTCALL(glLinkProgramARB(programId));
-    print_glsl_info_log(gl_info, programId);
+    shader_glsl_validate_link(gl_info, programId);
 
     entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0,
             sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants);
@@ -4230,10 +4442,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
      * load them now to have them hardcoded in the GLSL program. This saves some CPU cycles
      * later
      */
-    if(pshader && !((IWineD3DPixelShaderImpl*)pshader)->baseShader.load_local_constsF) {
+    if (pshader && !((IWineD3DBaseShaderImpl *)pshader)->baseShader.load_local_constsF)
+    {
         hardcode_local_constants((IWineD3DBaseShaderImpl *) pshader, gl_info, programId, 'P');
     }
-    if(vshader && !((IWineD3DVertexShaderImpl*)vshader)->baseShader.load_local_constsF) {
+    if (vshader && !((IWineD3DBaseShaderImpl *)vshader)->baseShader.load_local_constsF)
+    {
         hardcode_local_constants((IWineD3DBaseShaderImpl *) vshader, gl_info, programId, 'V');
     }
 }
@@ -4303,7 +4517,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
     GL_EXTCALL(glAttachObjectARB(program_id, pshader_id));
     GL_EXTCALL(glLinkProgramARB(program_id));
 
-    print_glsl_info_log(gl_info, program_id);
+    shader_glsl_validate_link(gl_info, program_id);
 
     /* Once linked we can mark the shaders for deletion. They will be deleted once the program
      * is destroyed
@@ -4394,8 +4608,6 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
     struct shader_glsl_priv *priv = device->shader_priv;
     const struct wined3d_gl_info *gl_info;
-    IWineD3DPixelShaderImpl *ps = NULL;
-    IWineD3DVertexShaderImpl *vs = NULL;
     struct wined3d_context *context;
 
     /* Note: Do not use QueryInterface here to find out which shader type this is because this code
@@ -4405,12 +4617,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
 
     if(pshader) {
         struct glsl_pshader_private *shader_data;
-        ps = (IWineD3DPixelShaderImpl *) This;
-        shader_data = ps->baseShader.backend_data;
+        shader_data = This->baseShader.backend_data;
         if(!shader_data || shader_data->num_gl_shaders == 0)
         {
             HeapFree(GetProcessHeap(), 0, shader_data);
-            ps->baseShader.backend_data = NULL;
+            This->baseShader.backend_data = NULL;
             return;
         }
 
@@ -4425,12 +4636,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
     } else {
         struct glsl_vshader_private *shader_data;
-        vs = (IWineD3DVertexShaderImpl *) This;
-        shader_data = vs->baseShader.backend_data;
+        shader_data = This->baseShader.backend_data;
         if(!shader_data || shader_data->num_gl_shaders == 0)
         {
             HeapFree(GetProcessHeap(), 0, shader_data);
-            vs->baseShader.backend_data = NULL;
+            This->baseShader.backend_data = NULL;
             return;
         }
 
@@ -4466,7 +4676,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
 
     if(pshader) {
         UINT i;
-        struct glsl_pshader_private *shader_data = ps->baseShader.backend_data;
+        struct glsl_pshader_private *shader_data = This->baseShader.backend_data;
 
         ENTER_GL();
         for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4476,11 +4686,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
         LEAVE_GL();
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
-        HeapFree(GetProcessHeap(), 0, shader_data);
-        ps->baseShader.backend_data = NULL;
-    } else {
+    }
+    else
+    {
         UINT i;
-        struct glsl_vshader_private *shader_data = vs->baseShader.backend_data;
+        struct glsl_vshader_private *shader_data = This->baseShader.backend_data;
 
         ENTER_GL();
         for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4490,10 +4700,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
         LEAVE_GL();
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
-        HeapFree(GetProcessHeap(), 0, shader_data);
-        vs->baseShader.backend_data = NULL;
     }
 
+    HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data);
+    This->baseShader.backend_data = NULL;
+
     context_release(context);
 }
 
@@ -4632,8 +4843,7 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {
     return FALSE;
 }
 
-static void shader_glsl_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
+static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
 {
     /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati
      * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support based
@@ -4697,7 +4907,7 @@ static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup)
     }
 
     /* We support everything except YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[OK]\n");
         return TRUE;
@@ -4720,6 +4930,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_CMP           */ shader_glsl_cmp,
     /* WINED3DSIH_CND           */ shader_glsl_cnd,
     /* WINED3DSIH_CRS           */ shader_glsl_cross,
+    /* WINED3DSIH_CUT           */ NULL,
     /* WINED3DSIH_DCL           */ NULL,
     /* WINED3DSIH_DEF           */ NULL,
     /* WINED3DSIH_DEFB          */ NULL,
@@ -4731,20 +4942,24 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_DSX           */ shader_glsl_map2gl,
     /* WINED3DSIH_DSY           */ shader_glsl_map2gl,
     /* WINED3DSIH_ELSE          */ shader_glsl_else,
+    /* WINED3DSIH_EMIT          */ NULL,
     /* WINED3DSIH_ENDIF         */ shader_glsl_end,
     /* WINED3DSIH_ENDLOOP       */ shader_glsl_end,
     /* WINED3DSIH_ENDREP        */ shader_glsl_end,
     /* WINED3DSIH_EXP           */ shader_glsl_map2gl,
     /* WINED3DSIH_EXPP          */ shader_glsl_expp,
     /* WINED3DSIH_FRC           */ shader_glsl_map2gl,
+    /* WINED3DSIH_IADD          */ NULL,
     /* WINED3DSIH_IF            */ shader_glsl_if,
     /* WINED3DSIH_IFC           */ shader_glsl_ifc,
+    /* WINED3DSIH_IGE           */ NULL,
     /* WINED3DSIH_LABEL         */ shader_glsl_label,
     /* WINED3DSIH_LIT           */ shader_glsl_lit,
     /* WINED3DSIH_LOG           */ shader_glsl_log,
     /* WINED3DSIH_LOGP          */ shader_glsl_log,
     /* WINED3DSIH_LOOP          */ shader_glsl_loop,
     /* WINED3DSIH_LRP           */ shader_glsl_lrp,
+    /* WINED3DSIH_LT            */ NULL,
     /* WINED3DSIH_M3x2          */ shader_glsl_mnxn,
     /* WINED3DSIH_M3x3          */ shader_glsl_mnxn,
     /* WINED3DSIH_M3x4          */ shader_glsl_mnxn,
@@ -4757,7 +4972,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_MOVA          */ shader_glsl_mov,
     /* WINED3DSIH_MUL           */ shader_glsl_arith,
     /* WINED3DSIH_NOP           */ NULL,
-    /* WINED3DSIH_NRM           */ shader_glsl_map2gl,
+    /* WINED3DSIH_NRM           */ shader_glsl_nrm,
     /* WINED3DSIH_PHASE         */ NULL,
     /* WINED3DSIH_POW           */ shader_glsl_pow,
     /* WINED3DSIH_RCP           */ shader_glsl_rcp,
index 82a71da..64bb883 100644 (file)
@@ -627,8 +627,7 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
     LEAVE_GL();
 }
 
-static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
 {
     pCaps->TextureOpCaps =  WINED3DTEXOPCAPS_ADD                        |
                             WINED3DTEXOPCAPS_ADDSIGNED                  |
@@ -671,7 +670,7 @@ static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
             WINED3DTEXOPCAPS_PREMODULATE */
 #endif
 
-    pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+    pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners);
     pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
 
     pCaps->PrimitiveMiscCaps |=  WINED3DPMISCCAPS_TSSARGTEMP;
index 1280a3b..3860e2c 100644 (file)
 #include "config.h"
 #include "wined3d_private.h"
 
+WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+#define GLINFO_LOCATION (*gl_info)
+
+static HRESULT wined3d_event_query_init(const struct wined3d_gl_info *gl_info, struct wined3d_event_query **query)
+{
+    struct wined3d_event_query *ret;
+    *query = NULL;
+    if (!gl_info->supported[ARB_SYNC] && !gl_info->supported[NV_FENCE]
+        && !gl_info->supported[APPLE_FENCE]) return E_NOTIMPL;
+
+    ret = HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
+    if (!ret)
+    {
+        ERR("Failed to allocate a wined3d event query structure.\n");
+        return E_OUTOFMEMORY;
+    }
+    ret->context = NULL;
+    *query = ret;
+    return WINED3D_OK;
+}
+
+static void wined3d_event_query_destroy(struct wined3d_event_query *query)
+{
+    if (query->context) context_free_event_query(query);
+    HeapFree(GetProcessHeap(), 0, query);
+}
+
+static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+    struct wined3d_context *context;
+    const struct wined3d_gl_info *gl_info;
+    enum wined3d_event_query_result ret;
+    BOOL fence_result;
+
+    TRACE("(%p) : device %p\n", query, device);
+
+    if (query->context == NULL)
+    {
+        TRACE("Query not started\n");
+        return WINED3D_EVENT_QUERY_NOT_STARTED;
+    }
+
+    if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+    {
+        WARN("Event query tested from wrong thread\n");
+        return WINED3D_EVENT_QUERY_WRONG_THREAD;
+    }
+
+    context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+    gl_info = context->gl_info;
+
+    ENTER_GL();
+
+    if (gl_info->supported[ARB_SYNC])
+    {
+        GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, 0));
+        checkGLcall("glClientWaitSync");
+
+        switch (gl_ret)
+        {
+            case GL_ALREADY_SIGNALED:
+            case GL_CONDITION_SATISFIED:
+                ret = WINED3D_EVENT_QUERY_OK;
+                break;
+
+            case GL_TIMEOUT_EXPIRED:
+                ret = WINED3D_EVENT_QUERY_WAITING;
+                break;
+
+            case GL_WAIT_FAILED:
+            default:
+                ERR("glClientWaitSync returned %#x.\n", gl_ret);
+                ret = WINED3D_EVENT_QUERY_ERROR;
+        }
+    }
+    else if (gl_info->supported[APPLE_FENCE])
+    {
+        fence_result = GL_EXTCALL(glTestFenceAPPLE(query->object.id));
+        checkGLcall("glTestFenceAPPLE");
+        if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+        else ret = WINED3D_EVENT_QUERY_WAITING;
+    }
+    else if (gl_info->supported[NV_FENCE])
+    {
+        fence_result = GL_EXTCALL(glTestFenceNV(query->object.id));
+        checkGLcall("glTestFenceNV");
+        if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+        else ret = WINED3D_EVENT_QUERY_WAITING;
+    }
+    else
+    {
+        ERR("Event query created despite lack of GL support\n");
+        ret = WINED3D_EVENT_QUERY_ERROR;
+    }
+
+    LEAVE_GL();
+
+    context_release(context);
+    return ret;
+}
+
+static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+
+    if (query->context)
+    {
+        if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+        {
+            context_free_event_query(query);
+            context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+            context_alloc_event_query(context, query);
+        }
+        else
+        {
+            context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+        }
+    }
+    else
+    {
+        context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+        context_alloc_event_query(context, query);
+    }
+
+    gl_info = context->gl_info;
+
+    ENTER_GL();
+
+    if (gl_info->supported[ARB_SYNC])
+    {
+        if (query->object.sync) GL_EXTCALL(glDeleteSync(query->object.sync));
+        checkGLcall("glDeleteSync");
+        query->object.sync = GL_EXTCALL(glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
+        checkGLcall("glFenceSync");
+    }
+    else if (gl_info->supported[APPLE_FENCE])
+    {
+        GL_EXTCALL(glSetFenceAPPLE(query->object.id));
+        checkGLcall("glSetFenceAPPLE");
+    }
+    else if (gl_info->supported[NV_FENCE])
+    {
+        GL_EXTCALL(glSetFenceNV(query->object.id, GL_ALL_COMPLETED_NV));
+        checkGLcall("glSetFenceNV");
+    }
+
+    LEAVE_GL();
+
+    context_release(context);
+}
+
 /*
  * Occlusion Queries:
  * http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf
  * http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
  */
 
-WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->device->adapter->gl_info
-
 /* *******************************************
    IWineD3DQuery IUnknown parts follow
    ******************************************* */
@@ -70,17 +219,16 @@ static ULONG  WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) {
         if (This->type == WINED3DQUERYTYPE_EVENT)
         {
             struct wined3d_event_query *query = This->extendedData;
-
-            if (query->context) context_free_event_query(query);
+            if (query) wined3d_event_query_destroy(query);
         }
         else if (This->type == WINED3DQUERYTYPE_OCCLUSION)
         {
             struct wined3d_occlusion_query *query = This->extendedData;
 
             if (query->context) context_free_occlusion_query(query);
+            HeapFree(GetProcessHeap(), 0, This->extendedData);
         }
 
-        HeapFree(GetProcessHeap(), 0, This->extendedData);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
@@ -101,168 +249,6 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown
     return WINED3D_OK;
 }
 
-static HRESULT  WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-    HRESULT res = S_OK;
-
-    TRACE("(%p) : type %#x, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, This->type, pData, dwSize, dwGetDataFlags);
-
-    switch (This->type){
-
-    case WINED3DQUERYTYPE_VCACHE:
-    {
-
-        WINED3DDEVINFO_VCACHE *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VCACHE\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        data->Pattern     = WINEMAKEFOURCC('C','A','C','H');
-        data->OptMethod   = 0; /*0 get longest strips, 1 optimize vertex cache*/
-        data->CacheSize   = 0; /*cache size, only required if OptMethod == 1*/
-        data->MagicNumber = 0; /*only required if OptMethod == 1 (used internally)*/
-
-    }
-    break;
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    {
-        WINED3DDEVINFO_RESOURCEMANAGER *data = pData;
-        int i;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_RESOURCEMANAGER\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        for(i = 0; i < WINED3DRTYPECOUNT; i++){
-            /*I'm setting the default values to 1 so as to reduce the risk of a div/0 in the caller*/
-            /*  isTextureResident could be used to get some of this information  */
-            data->stats[i].bThrashing            = FALSE;
-            data->stats[i].ApproxBytesDownloaded = 1;
-            data->stats[i].NumEvicts             = 1;
-            data->stats[i].NumVidCreates         = 1;
-            data->stats[i].LastPri               = 1;
-            data->stats[i].NumUsed               = 1;
-            data->stats[i].NumUsedInVidMem       = 1;
-            data->stats[i].WorkingSet            = 1;
-            data->stats[i].WorkingSetBytes       = 1;
-            data->stats[i].TotalManaged          = 1;
-            data->stats[i].TotalBytes            = 1;
-        }
-
-    }
-    break;
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    {
-        WINED3DDEVINFO_VERTEXSTATS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXSTATS\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        data->NumRenderedTriangles      = 1;
-        data->NumExtraClippingTriangles = 1;
-
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    {
-        UINT64* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMP\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = 1; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    {
-        BOOL* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPDISJOINT\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = FALSE; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    {
-        UINT64* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPFREQ\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = 1; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    {
-        WINED3DDEVINFO_PIPELINETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIPELINETIMINGS\n", This);
-        if(pData == NULL || dwSize == 0) break;
-
-        data->VertexProcessingTimePercent    =   1.0f;
-        data->PixelProcessingTimePercent     =   1.0f;
-        data->OtherGPUProcessingTimePercent  =  97.0f;
-        data->GPUIdleTimePercent             =   1.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    {
-        WINED3DDEVINFO_INTERFACETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_INTERFACETIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->WaitingForGPUToUseApplicationResourceTimePercent =   1.0f;
-        data->WaitingForGPUToAcceptMoreCommandsTimePercent     =   1.0f;
-        data->WaitingForGPUToStayWithinLatencyTimePercent      =   1.0f;
-        data->WaitingForGPUExclusiveResourceTimePercent        =   1.0f;
-        data->WaitingForGPUOtherTimePercent                    =  96.0f;
-    }
-
-    break;
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    {
-        WINED3DDEVINFO_STAGETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MemoryProcessingPercent      = 50.0f;
-        data->ComputationProcessingPercent = 50.0f;
-
-    }
-    break;
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    {
-        WINED3DDEVINFO_STAGETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIXELTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MemoryProcessingPercent      = 50.0f;
-        data->ComputationProcessingPercent = 50.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    {
-        WINED3DDEVINFO_BANDWIDTHTIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_BANDWIDTHTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MaxBandwidthUtilized                =  1.0f;
-        data->FrontEndUploadMemoryUtilizedPercent =  1.0f;
-        data->VertexRateUtilizedPercent           =  1.0f;
-        data->TriangleSetupRateUtilizedPercent    =  1.0f;
-        data->FillRateUtilizedPercent             = 97.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    {
-        WINED3DDEVINFO_CACHEUTILIZATION *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_CACHEUTILIZATION\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->TextureCacheHitRate             = 1.0f;
-        data->PostTransformVertexCacheHitRate = 1.0f;
-    }
-
-
-    break;
-    default:
-        FIXME("(%p) Unhandled query type %d\n",This , This->type);
-
-    };
-
-    /*dwGetDataFlags = 0 || D3DGETDATA_FLUSH
-    D3DGETDATA_FLUSH may return WINED3DERR_DEVICELOST if the device is lost
-    */
-    return res; /* S_OK if the query data is available*/
-}
-
 static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
     struct wined3d_occlusion_query *query = This->extendedData;
@@ -341,108 +327,44 @@ static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
 static HRESULT  WINAPI IWineD3DEventQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
     struct wined3d_event_query *query = This->extendedData;
-    struct wined3d_context *context;
     BOOL *data = pData;
+    enum wined3d_event_query_result ret;
 
     TRACE("(%p) : type D3DQUERY_EVENT, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags);
 
     if (!pData || !dwSize) return S_OK;
-
-    if (!query->context)
+    if (!query)
     {
-        TRACE("Query not started, returning TRUE.\n");
+        WARN("(%p): Event query not supported by GL, reporting GPU idle\n", This);
         *data = TRUE;
-
         return S_OK;
     }
 
-    if (query->context->tid != GetCurrentThreadId())
+    ret = wined3d_event_query_test(query, This->device);
+    switch(ret)
     {
-        /* See comment in IWineD3DQuery::Issue, event query codeblock */
-        FIXME("Wrong thread, reporting GPU idle.\n");
-        *data = TRUE;
-
-        return S_OK;
-    }
+        case WINED3D_EVENT_QUERY_OK:
+        case WINED3D_EVENT_QUERY_NOT_STARTED:
+            *data = TRUE;
+            break;
 
-    context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+        case WINED3D_EVENT_QUERY_WAITING:
+            *data = FALSE;
+            break;
 
-    ENTER_GL();
+        case WINED3D_EVENT_QUERY_WRONG_THREAD:
+            FIXME("(%p) Wrong thread, reporting GPU idle.\n", This);
+            *data = TRUE;
+            break;
 
-    if (context->gl_info->supported[APPLE_FENCE])
-    {
-        *data = GL_EXTCALL(glTestFenceAPPLE(query->id));
-        checkGLcall("glTestFenceAPPLE");
+        case WINED3D_EVENT_QUERY_ERROR:
+            ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n");
+            return WINED3DERR_INVALIDCALL;
     }
-    else if (context->gl_info->supported[NV_FENCE])
-    {
-        *data = GL_EXTCALL(glTestFenceNV(query->id));
-        checkGLcall("glTestFenceNV");
-    }
-    else
-    {
-        WARN("(%p): reporting GPU idle\n", This);
-        *data = TRUE;
-    }
-
-    LEAVE_GL();
-
-    context_release(context);
 
     return S_OK;
 }
 
-static DWORD  WINAPI IWineD3DQueryImpl_GetDataSize(IWineD3DQuery* iface){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-    int dataSize = 0;
-    TRACE("(%p) : type %#x\n", This, This->type);
-    switch(This->type){
-    case WINED3DQUERYTYPE_VCACHE:
-        dataSize = sizeof(WINED3DDEVINFO_VCACHE);
-        break;
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-        dataSize = sizeof(WINED3DDEVINFO_RESOURCEMANAGER);
-        break;
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-        dataSize = sizeof(WINED3DDEVINFO_VERTEXSTATS);
-        break;
-    case WINED3DQUERYTYPE_EVENT:
-        dataSize = sizeof(BOOL);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMP:
-        dataSize = sizeof(UINT64);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-        dataSize = sizeof(BOOL);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-        dataSize = sizeof(UINT64);
-        break;
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_PIPELINETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_INTERFACETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-        dataSize = sizeof(WINED3DQUERYTYPE_BANDWIDTHTIMINGS);
-        break;
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-        dataSize = sizeof(WINED3DDEVINFO_CACHEUTILIZATION);
-        break;
-    default:
-       FIXME("(%p) Unhandled query type %d\n",This , This->type);
-       dataSize = 0;
-    }
-    return dataSize;
-}
-
 static DWORD  WINAPI IWineD3DEventQueryImpl_GetDataSize(IWineD3DQuery* iface){
     TRACE("(%p) : type D3DQUERY_EVENT\n", iface);
 
@@ -460,7 +382,6 @@ static WINED3DQUERYTYPE  WINAPI IWineD3DQueryImpl_GetType(IWineD3DQuery* iface){
     return This->type;
 }
 
-
 static HRESULT  WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIssueFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
 
@@ -468,43 +389,11 @@ static HRESULT  WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface,  DWORD
     if (dwIssueFlags & WINED3DISSUE_END)
     {
         struct wined3d_event_query *query = This->extendedData;
-        struct wined3d_context *context;
 
-        if (query->context)
-        {
-            if (query->context->tid != GetCurrentThreadId())
-            {
-                context_free_event_query(query);
-                context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
-                context_alloc_event_query(context, query);
-            }
-            else
-            {
-                context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
-            }
-        }
-        else
-        {
-            context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
-            context_alloc_event_query(context, query);
-        }
-
-        ENTER_GL();
+        /* Faked event query support */
+        if (!query) return WINED3D_OK;
 
-        if (context->gl_info->supported[APPLE_FENCE])
-        {
-            GL_EXTCALL(glSetFenceAPPLE(query->id));
-            checkGLcall("glSetFenceAPPLE");
-        }
-        else if (context->gl_info->supported[NV_FENCE])
-        {
-            GL_EXTCALL(glSetFenceNV(query->id, GL_ALL_COMPLETED_NV));
-            checkGLcall("glSetFenceNV");
-        }
-
-        LEAVE_GL();
-
-        context_release(context);
+        wined3d_event_query_issue(query, This->device);
     }
     else if(dwIssueFlags & WINED3DISSUE_BEGIN)
     {
@@ -604,43 +493,7 @@ static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface,  D
     return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL.    */
 }
 
-static HRESULT  WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIssueFlags){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-
-    TRACE("(%p) : dwIssueFlags %#x, type %#x\n", This, dwIssueFlags, This->type);
-
-    /* The fixme is printed when the app asks for the resulting data */
-    WARN("(%p) : Unhandled query type %#x\n", This, This->type);
-
-    if(dwIssueFlags & WINED3DISSUE_BEGIN) {
-        This->state = QUERY_BUILDING;
-    } else {
-        This->state = QUERY_SIGNALLED;
-    }
-
-    return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL.    */
-}
-
-
-/**********************************************************
- * IWineD3DQuery VTbl follows
- **********************************************************/
-
-const IWineD3DQueryVtbl IWineD3DQuery_Vtbl =
-{
-    /*** IUnknown methods ***/
-    IWineD3DQueryImpl_QueryInterface,
-    IWineD3DQueryImpl_AddRef,
-    IWineD3DQueryImpl_Release,
-     /*** IWineD3Dquery methods ***/
-    IWineD3DQueryImpl_GetParent,
-    IWineD3DQueryImpl_GetData,
-    IWineD3DQueryImpl_GetDataSize,
-    IWineD3DQueryImpl_GetType,
-    IWineD3DQueryImpl_Issue
-};
-
-const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
 {
     /*** IUnknown methods ***/
     IWineD3DQueryImpl_QueryInterface,
@@ -654,7 +507,7 @@ const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
     IWineD3DEventQueryImpl_Issue
 };
 
-const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
 {
     /*** IUnknown methods ***/
     IWineD3DQueryImpl_QueryInterface,
@@ -667,3 +520,72 @@ const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
     IWineD3DQueryImpl_GetType,
     IWineD3DOcclusionQueryImpl_Issue
 };
+
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+        WINED3DQUERYTYPE type, IUnknown *parent)
+{
+    const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+    HRESULT hr;
+
+    switch (type)
+    {
+        case WINED3DQUERYTYPE_OCCLUSION:
+            TRACE("Occlusion query.\n");
+            if (!gl_info->supported[ARB_OCCLUSION_QUERY])
+            {
+                WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY.\n");
+                return WINED3DERR_NOTAVAILABLE;
+            }
+            query->lpVtbl = &IWineD3DOcclusionQuery_Vtbl;
+            query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
+            if (!query->extendedData)
+            {
+                ERR("Failed to allocate occlusion query extended data.\n");
+                return E_OUTOFMEMORY;
+            }
+            ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL;
+            break;
+
+        case WINED3DQUERYTYPE_EVENT:
+            TRACE("Event query.\n");
+            query->lpVtbl = &IWineD3DEventQuery_Vtbl;
+            hr = wined3d_event_query_init(gl_info, (struct wined3d_event_query **) &query->extendedData);
+            if (hr == E_NOTIMPL)
+            {
+                /* Half-Life 2 needs this query. It does not render the main
+                 * menu correctly otherwise. Pretend to support it, faking
+                 * this query does not do much harm except potentially
+                 * lowering performance. */
+                FIXME("Event query: Unimplemented, but pretending to be supported.\n");
+            }
+            else if(FAILED(hr))
+            {
+                return hr;
+            }
+            break;
+
+        case WINED3DQUERYTYPE_VCACHE:
+        case WINED3DQUERYTYPE_RESOURCEMANAGER:
+        case WINED3DQUERYTYPE_VERTEXSTATS:
+        case WINED3DQUERYTYPE_TIMESTAMP:
+        case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
+        case WINED3DQUERYTYPE_TIMESTAMPFREQ:
+        case WINED3DQUERYTYPE_PIPELINETIMINGS:
+        case WINED3DQUERYTYPE_INTERFACETIMINGS:
+        case WINED3DQUERYTYPE_VERTEXTIMINGS:
+        case WINED3DQUERYTYPE_PIXELTIMINGS:
+        case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
+        case WINED3DQUERYTYPE_CACHEUTILIZATION:
+        default:
+            FIXME("Unhandled query type %#x.\n", type);
+            return WINED3DERR_NOTAVAILABLE;
+    }
+
+    query->type = type;
+    query->state = QUERY_CREATED;
+    query->device = device;
+    query->parent = parent;
+    query->ref = 1;
+
+    return WINED3D_OK;
+}
index 398ea64..307cadf 100644 (file)
 
 #include <math.h>
 #include <stdio.h>
+#include <string.h>
 
 #include "wined3d_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
+WINE_DECLARE_DEBUG_CHANNEL(d3d);
+
+static const char *shader_opcode_names[] =
+{
+    /* WINED3DSIH_ABS           */ "abs",
+    /* WINED3DSIH_ADD           */ "add",
+    /* WINED3DSIH_BEM           */ "bem",
+    /* WINED3DSIH_BREAK         */ "break",
+    /* WINED3DSIH_BREAKC        */ "breakc",
+    /* WINED3DSIH_BREAKP        */ "breakp",
+    /* WINED3DSIH_CALL          */ "call",
+    /* WINED3DSIH_CALLNZ        */ "callnz",
+    /* WINED3DSIH_CMP           */ "cmp",
+    /* WINED3DSIH_CND           */ "cnd",
+    /* WINED3DSIH_CRS           */ "crs",
+    /* WINED3DSIH_CUT           */ "cut",
+    /* WINED3DSIH_DCL           */ "dcl",
+    /* WINED3DSIH_DEF           */ "def",
+    /* WINED3DSIH_DEFB          */ "defb",
+    /* WINED3DSIH_DEFI          */ "defi",
+    /* WINED3DSIH_DP2ADD        */ "dp2add",
+    /* WINED3DSIH_DP3           */ "dp3",
+    /* WINED3DSIH_DP4           */ "dp4",
+    /* WINED3DSIH_DST           */ "dst",
+    /* WINED3DSIH_DSX           */ "dsx",
+    /* WINED3DSIH_DSY           */ "dsy",
+    /* WINED3DSIH_ELSE          */ "else",
+    /* WINED3DSIH_EMIT          */ "emit",
+    /* WINED3DSIH_ENDIF         */ "endif",
+    /* WINED3DSIH_ENDLOOP       */ "endloop",
+    /* WINED3DSIH_ENDREP        */ "endrep",
+    /* WINED3DSIH_EXP           */ "exp",
+    /* WINED3DSIH_EXPP          */ "expp",
+    /* WINED3DSIH_FRC           */ "frc",
+    /* WINED3DSIH_IADD          */ "iadd",
+    /* WINED3DSIH_IF            */ "if",
+    /* WINED3DSIH_IFC           */ "ifc",
+    /* WINED3DSIH_IGE           */ "ige",
+    /* WINED3DSIH_LABEL         */ "label",
+    /* WINED3DSIH_LIT           */ "lit",
+    /* WINED3DSIH_LOG           */ "log",
+    /* WINED3DSIH_LOGP          */ "logp",
+    /* WINED3DSIH_LOOP          */ "loop",
+    /* WINED3DSIH_LRP           */ "lrp",
+    /* WINED3DSIH_LT            */ "lt",
+    /* WINED3DSIH_M3x2          */ "m3x2",
+    /* WINED3DSIH_M3x3          */ "m3x3",
+    /* WINED3DSIH_M3x4          */ "m3x4",
+    /* WINED3DSIH_M4x3          */ "m4x3",
+    /* WINED3DSIH_M4x4          */ "m4x4",
+    /* WINED3DSIH_MAD           */ "mad",
+    /* WINED3DSIH_MAX           */ "max",
+    /* WINED3DSIH_MIN           */ "min",
+    /* WINED3DSIH_MOV           */ "mov",
+    /* WINED3DSIH_MOVA          */ "mova",
+    /* WINED3DSIH_MUL           */ "mul",
+    /* WINED3DSIH_NOP           */ "nop",
+    /* WINED3DSIH_NRM           */ "nrm",
+    /* WINED3DSIH_PHASE         */ "phase",
+    /* WINED3DSIH_POW           */ "pow",
+    /* WINED3DSIH_RCP           */ "rcp",
+    /* WINED3DSIH_REP           */ "rep",
+    /* WINED3DSIH_RET           */ "ret",
+    /* WINED3DSIH_RSQ           */ "rsq",
+    /* WINED3DSIH_SETP          */ "setp",
+    /* WINED3DSIH_SGE           */ "sge",
+    /* WINED3DSIH_SGN           */ "sgn",
+    /* WINED3DSIH_SINCOS        */ "sincos",
+    /* WINED3DSIH_SLT           */ "slt",
+    /* WINED3DSIH_SUB           */ "sub",
+    /* WINED3DSIH_TEX           */ "texld",
+    /* WINED3DSIH_TEXBEM        */ "texbem",
+    /* WINED3DSIH_TEXBEML       */ "texbeml",
+    /* WINED3DSIH_TEXCOORD      */ "texcrd",
+    /* WINED3DSIH_TEXDEPTH      */ "texdepth",
+    /* WINED3DSIH_TEXDP3        */ "texdp3",
+    /* WINED3DSIH_TEXDP3TEX     */ "texdp3tex",
+    /* WINED3DSIH_TEXKILL       */ "texkill",
+    /* WINED3DSIH_TEXLDD        */ "texldd",
+    /* WINED3DSIH_TEXLDL        */ "texldl",
+    /* WINED3DSIH_TEXM3x2DEPTH  */ "texm3x2depth",
+    /* WINED3DSIH_TEXM3x2PAD    */ "texm3x2pad",
+    /* WINED3DSIH_TEXM3x2TEX    */ "texm3x2tex",
+    /* WINED3DSIH_TEXM3x3       */ "texm3x3",
+    /* WINED3DSIH_TEXM3x3DIFF   */ "texm3x3diff",
+    /* WINED3DSIH_TEXM3x3PAD    */ "texm3x3pad",
+    /* WINED3DSIH_TEXM3x3SPEC   */ "texm3x3spec",
+    /* WINED3DSIH_TEXM3x3TEX    */ "texm3x3tex",
+    /* WINED3DSIH_TEXM3x3VSPEC  */ "texm3x3vspec",
+    /* WINED3DSIH_TEXREG2AR     */ "texreg2ar",
+    /* WINED3DSIH_TEXREG2GB     */ "texreg2gb",
+    /* WINED3DSIH_TEXREG2RGB    */ "texreg2rgb",
+};
+
+static const char *semantic_names[] =
+{
+    /* WINED3DDECLUSAGE_POSITION        */ "SV_POSITION",
+    /* WINED3DDECLUSAGE_BLENDWEIGHT     */ "BLENDWEIGHT",
+    /* WINED3DDECLUSAGE_BLENDINDICES    */ "BLENDINDICES",
+    /* WINED3DDECLUSAGE_NORMAL          */ "NORMAL",
+    /* WINED3DDECLUSAGE_PSIZE           */ "PSIZE",
+    /* WINED3DDECLUSAGE_TEXCOORD        */ "TEXCOORD",
+    /* WINED3DDECLUSAGE_TANGENT         */ "TANGENT",
+    /* WINED3DDECLUSAGE_BINORMAL        */ "BINORMAL",
+    /* WINED3DDECLUSAGE_TESSFACTOR      */ "TESSFACTOR",
+    /* WINED3DDECLUSAGE_POSITIONT       */ "POSITIONT",
+    /* WINED3DDECLUSAGE_COLOR           */ "COLOR",
+    /* WINED3DDECLUSAGE_FOG             */ "FOG",
+    /* WINED3DDECLUSAGE_DEPTH           */ "DEPTH",
+    /* WINED3DDECLUSAGE_SAMPLE          */ "SAMPLE",
+};
+
+static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
+{
+    if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
+    {
+        FIXME("Unrecognized usage %#x.\n", usage);
+        return "UNRECOGNIZED";
+    }
+
+    return semantic_names[usage];
+}
+
+static WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
+{
+    unsigned int i;
+
+    for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
+    {
+        if (!strcmp(name, semantic_names[i])) return i;
+    }
+
+    return ~0U;
+}
+
+BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage)
+{
+    return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
+}
+
+static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e,
+        const struct wined3d_shader_semantic *s)
+{
+    e->semantic_name = shader_semantic_name_from_usage(s->usage);
+    e->semantic_idx = s->usage_idx;
+    e->sysval_semantic = 0;
+    e->component_type = 0;
+    e->register_idx = s->reg.reg.idx;
+    e->mask = s->reg.write_mask;
+}
+
+static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
+{
+    switch (version_token >> 16)
+    {
+        case WINED3D_SM1_VS:
+        case WINED3D_SM1_PS:
+            return &sm1_shader_frontend;
+
+        case WINED3D_SM4_PS:
+        case WINED3D_SM4_VS:
+        case WINED3D_SM4_GS:
+            return &sm4_shader_frontend;
+
+        default:
+            FIXME("Unrecognised version token %#x\n", version_token);
+            return NULL;
+    }
+}
+
+void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
+{
+    buffer->buffer[0] = '\0';
+    buffer->bsize = 0;
+    buffer->lineNo = 0;
+    buffer->newline = TRUE;
+}
+
+BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
+{
+    buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
+    if (!buffer->buffer)
+    {
+        ERR("Failed to allocate shader buffer memory.\n");
+        return FALSE;
+    }
+
+    shader_buffer_clear(buffer);
+    return TRUE;
+}
+
+void shader_buffer_free(struct wined3d_shader_buffer *buffer)
+{
+    HeapFree(GetProcessHeap(), 0, buffer->buffer);
+}
+
+int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
+{
+    char *base = buffer->buffer + buffer->bsize;
+    int rc;
+
+    rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
+
+    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
+    {
+        ERR("The buffer allocated for the shader program string "
+            "is too small at %d bytes.\n", SHADER_PGMSIZE);
+        buffer->bsize = SHADER_PGMSIZE - 1;
+        return -1;
+    }
+
+    if (buffer->newline)
+    {
+        TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
+        buffer->newline = FALSE;
+    }
+    else
+    {
+        TRACE("%s", base);
+    }
+
+    buffer->bsize += rc;
+    if (buffer->buffer[buffer->bsize-1] == '\n')
+    {
+        ++buffer->lineNo;
+        buffer->newline = TRUE;
+    }
+
+    return 0;
+}
+
+int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
+{
+    va_list args;
+    int ret;
+
+    va_start(args, format);
+    ret = shader_vaddline(buffer, format, args);
+    va_end(args);
+
+    return ret;
+}
+
+static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
+        IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
+{
+    shader->ref = 1;
+    shader->device = (IWineD3DDevice *)device;
+    shader->parent = parent;
+    shader->parent_ops = parent_ops;
+    list_init(&shader->linked_programs);
+    list_add_head(&device->shaders, &shader->shader_list_entry);
+}
+
+/* Convert floating point offset relative to a register file to an absolute
+ * offset for float constants. */
+static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
+{
+    switch (register_type)
+    {
+        case WINED3DSPR_CONST: return register_idx;
+        case WINED3DSPR_CONST2: return 2048 + register_idx;
+        case WINED3DSPR_CONST3: return 4096 + register_idx;
+        case WINED3DSPR_CONST4: return 6144 + register_idx;
+        default:
+            FIXME("Unsupported register type: %u.\n", register_type);
+            return register_idx;
+    }
+}
+
+static void shader_delete_constant_list(struct list *clist)
+{
+    struct local_constant *constant;
+    struct list *ptr;
+
+    ptr = list_head(clist);
+    while (ptr)
+    {
+        constant = LIST_ENTRY(ptr, struct local_constant, entry);
+        ptr = list_next(clist, ptr);
+        HeapFree(GetProcessHeap(), 0, constant);
+    }
+    list_init(clist);
+}
+
+static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
+{
+    DWORD idx, shift;
+    idx = bit >> 5;
+    shift = bit & 0x1f;
+    bitmap[idx] |= (1 << shift);
+}
+
+static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct shader_reg_maps *reg_maps,
+        const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
+{
+    switch (reg->type)
+    {
+        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
+            else reg_maps->address |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_TEMP:
+            reg_maps->temporary |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_INPUT:
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                if (reg->rel_addr)
+                {
+                    /* If relative addressing is used, we must assume that all registers
+                     * are used. Even if it is a construct like v3[aL], we can't assume
+                     * that v0, v1 and v2 aren't read because aL can be negative */
+                    unsigned int i;
+                    for (i = 0; i < MAX_REG_INPUT; ++i)
+                    {
+                        ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[i] = TRUE;
+                    }
+                }
+                else
+                {
+                    ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[reg->idx] = TRUE;
+                }
+            }
+            else reg_maps->input_registers |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_RASTOUT:
+            if (reg->idx == 1) reg_maps->fog = 1;
+            break;
+
+        case WINED3DSPR_MISCTYPE:
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                if (reg->idx == 0) reg_maps->vpos = 1;
+                else if (reg->idx == 1) reg_maps->usesfacing = 1;
+            }
+            break;
+
+        case WINED3DSPR_CONST:
+            if (reg->rel_addr)
+            {
+                if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
+                {
+                    if (reg->idx < ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset)
+                    {
+                        ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset = reg->idx;
+                    }
+                    if (reg->idx > ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset)
+                    {
+                        ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset = reg->idx;
+                    }
+                }
+                reg_maps->usesrelconstF = TRUE;
+            }
+            else
+            {
+                set_bitmap_bit(reg_maps->constf, reg->idx);
+            }
+            break;
+
+        case WINED3DSPR_CONSTINT:
+            reg_maps->integer_constants |= (1 << reg->idx);
+            break;
+
+        case WINED3DSPR_CONSTBOOL:
+            reg_maps->boolean_constants |= (1 << reg->idx);
+            break;
+
+        case WINED3DSPR_COLOROUT:
+            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
+            break;
+
+        default:
+            TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
+            break;
+    }
+}
+
+static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
+{
+    switch (instr)
+    {
+        case WINED3DSIH_M4x4:
+        case WINED3DSIH_M3x4:
+            return param == 1 ? 3 : 0;
+
+        case WINED3DSIH_M4x3:
+        case WINED3DSIH_M3x3:
+            return param == 1 ? 2 : 0;
+
+        case WINED3DSIH_M3x2:
+            return param == 1 ? 1 : 0;
+
+        default:
+            return 0;
+    }
+}
+
+/* Note that this does not count the loop register as an address register. */
+static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
+        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
+        struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+    unsigned int cur_loop_depth = 0, max_loop_depth = 0;
+    void *fe_data = shader->baseShader.frontend_data;
+    struct wined3d_shader_version shader_version;
+    const DWORD *ptr = byte_code;
+
+    memset(reg_maps, 0, sizeof(*reg_maps));
+
+    /* get_registers_used() is called on every compile on some 1.x shaders,
+     * which can result in stacking up a collection of local constants.
+     * Delete the old constants if existing. */
+    shader_delete_constant_list(&shader->baseShader.constantsF);
+    shader_delete_constant_list(&shader->baseShader.constantsB);
+    shader_delete_constant_list(&shader->baseShader.constantsI);
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+    reg_maps->shader_version = shader_version;
+
+    reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+            sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
+    if (!reg_maps->constf)
+    {
+        ERR("Failed to allocate constant map memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        struct wined3d_shader_instruction ins;
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* Skip comments. */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment) continue;
+
+        /* Fetch opcode. */
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+
+        /* Unhandled opcode, and its parameters. */
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        /* Handle declarations. */
+        if (ins.handler_idx == WINED3DSIH_DCL)
+        {
+            struct wined3d_shader_semantic semantic;
+
+            fe->shader_read_semantic(&ptr, &semantic);
+
+            switch (semantic.reg.reg.type)
+            {
+                /* Mark input registers used. */
+                case WINED3DSPR_INPUT:
+                    reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
+                    shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
+                    break;
+
+                /* Vertex shader: mark 3.0 output registers used, save token. */
+                case WINED3DSPR_OUTPUT:
+                    reg_maps->output_registers |= 1 << semantic.reg.reg.idx;
+                    shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic);
+                    if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
+                    break;
+
+                /* Save sampler usage token. */
+                case WINED3DSPR_SAMPLER:
+                    reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
+                    break;
+
+                default:
+                    TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
+                    break;
+            }
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEF)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+            ptr += 4;
+
+            /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
+            if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                float *value = (float *)lconst->value;
+                if (value[0] < -1.0f) value[0] = -1.0f;
+                else if (value[0] > 1.0f) value[0] = 1.0f;
+                if (value[1] < -1.0f) value[1] = -1.0f;
+                else if (value[1] > 1.0f) value[1] = 1.0f;
+                if (value[2] < -1.0f) value[2] = -1.0f;
+                else if (value[2] > 1.0f) value[2] = 1.0f;
+                if (value[3] < -1.0f) value[3] = -1.0f;
+                else if (value[3] > 1.0f) value[3] = 1.0f;
+            }
+
+            list_add_head(&shader->baseShader.constantsF, &lconst->entry);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFI)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+            ptr += 4;
+
+            list_add_head(&shader->baseShader.constantsI, &lconst->entry);
+            reg_maps->local_int_consts |= (1 << dst.reg.idx);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFB)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, sizeof(DWORD));
+            ++ptr;
+
+            list_add_head(&shader->baseShader.constantsB, &lconst->entry);
+            reg_maps->local_bool_consts |= (1 << dst.reg.idx);
+        }
+        /* If there's a loop in the shader. */
+        else if (ins.handler_idx == WINED3DSIH_LOOP
+                || ins.handler_idx == WINED3DSIH_REP)
+        {
+            struct wined3d_shader_src_param src, rel_addr;
+
+            fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+
+            /* Rep and Loop always use an integer constant for the control parameters. */
+            if (ins.handler_idx == WINED3DSIH_REP)
+            {
+                reg_maps->integer_constants |= 1 << src.reg.idx;
+            }
+            else
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+                reg_maps->integer_constants |= 1 << src.reg.idx;
+            }
+
+            cur_loop_depth++;
+            if (cur_loop_depth > max_loop_depth) max_loop_depth = cur_loop_depth;
+        }
+        else if (ins.handler_idx == WINED3DSIH_ENDLOOP
+                || ins.handler_idx == WINED3DSIH_ENDREP)
+        {
+            cur_loop_depth--;
+        }
+        /* For subroutine prototypes. */
+        else if (ins.handler_idx == WINED3DSIH_LABEL)
+        {
+            struct wined3d_shader_src_param src, rel_addr;
+
+            fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+            reg_maps->labels |= 1 << src.reg.idx;
+        }
+        /* Set texture, address, temporary registers. */
+        else
+        {
+            BOOL color0_mov = FALSE;
+            int i, limit;
+
+            /* This will loop over all the registers and try to
+             * make a bitmask of the ones we're interested in.
+             *
+             * Relative addressing tokens are ignored, but that's
+             * okay, since we'll catch any address registers when
+             * they are initialized (required by spec). */
+            if (ins.dst_count)
+            {
+                struct wined3d_shader_src_param dst_rel_addr;
+                struct wined3d_shader_dst_param dst_param;
+
+                fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+                shader_record_register_usage(shader, reg_maps, &dst_param.reg, shader_version.type);
+
+                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
+                 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
+                 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */
+                if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
+                        && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
+                {
+                    reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
+                }
+
+                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+                {
+                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+
+                    if (dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
+                    {
+                    /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
+                     * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
+                     * the mov and perform the sRGB write correction from the source register.
+                     *
+                     * However, if the mov is only partial, we can't do this, and if the write
+                     * comes from an instruction other than MOV it is hard to do as well. If
+                     * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
+
+                        ps->color0_mov = FALSE;
+                        if (ins.handler_idx == WINED3DSIH_MOV)
+                        {
+                            /* Used later when the source register is read. */
+                            color0_mov = TRUE;
+                        }
+                    }
+                    /* Also drop the MOV marker if the source register is overwritten prior to the shader
+                     * end
+                     */
+                    else if (dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
+                    {
+                        ps->color0_mov = FALSE;
+                    }
+                }
+
+                /* Declare 1.x samplers implicitly, based on the destination reg. number. */
+                if (shader_version.major == 1
+                        && (ins.handler_idx == WINED3DSIH_TEX
+                            || ins.handler_idx == WINED3DSIH_TEXBEM
+                            || ins.handler_idx == WINED3DSIH_TEXBEML
+                            || ins.handler_idx == WINED3DSIH_TEXDP3TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
+                            || ins.handler_idx == WINED3DSIH_TEXREG2AR
+                            || ins.handler_idx == WINED3DSIH_TEXREG2GB
+                            || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
+                {
+                    /* Fake sampler usage, only set reserved bit and type. */
+                    DWORD sampler_code = dst_param.reg.idx;
+
+                    TRACE("Setting fake 2D sampler for 1.x pixelshader.\n");
+                    reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
+
+                    /* texbem is only valid with < 1.4 pixel shaders */
+                    if (ins.handler_idx == WINED3DSIH_TEXBEM
+                            || ins.handler_idx == WINED3DSIH_TEXBEML)
+                    {
+                        reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+                        if (ins.handler_idx == WINED3DSIH_TEXBEML)
+                        {
+                            reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
+                        }
+                    }
+                }
+                else if (ins.handler_idx == WINED3DSIH_BEM)
+                {
+                    reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+                }
+            }
+
+            if (ins.handler_idx == WINED3DSIH_NRM) reg_maps->usesnrm = 1;
+            else if (ins.handler_idx == WINED3DSIH_DSY) reg_maps->usesdsy = 1;
+            else if (ins.handler_idx == WINED3DSIH_DSX) reg_maps->usesdsx = 1;
+            else if (ins.handler_idx == WINED3DSIH_TEXLDD) reg_maps->usestexldd = 1;
+            else if (ins.handler_idx == WINED3DSIH_TEXLDL) reg_maps->usestexldl = 1;
+            else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1;
+            else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
+            else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
+
+            limit = ins.src_count + (ins.predicate ? 1 : 0);
+            for (i = 0; i < limit; ++i)
+            {
+                struct wined3d_shader_src_param src_param, src_rel_addr;
+                unsigned int count;
+
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                count = get_instr_extra_regcount(ins.handler_idx, i);
+
+                shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+                while (count)
+                {
+                    ++src_param.reg.idx;
+                    shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+                    --count;
+                }
+
+                if (color0_mov)
+                {
+                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+                    if (src_param.reg.type == WINED3DSPR_TEMP
+                            && src_param.swizzle == WINED3DSP_NOSWIZZLE)
+                    {
+                        ps->color0_mov = TRUE;
+                        ps->color0_reg = src_param.reg.idx;
+                    }
+                }
+            }
+        }
+    }
+    reg_maps->loop_depth = max_loop_depth;
+
+    shader->baseShader.functionLength = ((const char *)ptr - (const char *)byte_code);
+
+    return WINED3D_OK;
+}
+
+unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max)
+{
+    DWORD map = 1 << max;
+    map |= map - 1;
+    map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
+
+    return wined3d_log2i(map);
+}
+
+static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic,
+        const struct wined3d_shader_version *shader_version)
+{
+    TRACE("dcl");
+
+    if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
+    {
+        switch (semantic->sampler_type)
+        {
+            case WINED3DSTT_2D: TRACE("_2d"); break;
+            case WINED3DSTT_CUBE: TRACE("_cube"); break;
+            case WINED3DSTT_VOLUME: TRACE("_volume"); break;
+            default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
+        }
+    }
+    else
+    {
+        /* Pixel shaders 3.0 don't have usage semantics. */
+        if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) return;
+        else TRACE("_");
+
+        switch (semantic->usage)
+        {
+            case WINED3DDECLUSAGE_POSITION:
+                TRACE("position%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_BLENDINDICES:
+                TRACE("blend");
+                break;
+
+            case WINED3DDECLUSAGE_BLENDWEIGHT:
+                TRACE("weight");
+                break;
+
+            case WINED3DDECLUSAGE_NORMAL:
+                TRACE("normal%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_PSIZE:
+                TRACE("psize");
+                break;
+
+            case WINED3DDECLUSAGE_COLOR:
+                if (semantic->usage_idx == 0) TRACE("color");
+                else TRACE("specular%u", (semantic->usage_idx - 1));
+                break;
+
+            case WINED3DDECLUSAGE_TEXCOORD:
+                TRACE("texture%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_TANGENT:
+                TRACE("tangent");
+                break;
+
+            case WINED3DDECLUSAGE_BINORMAL:
+                TRACE("binormal");
+                break;
+
+            case WINED3DDECLUSAGE_TESSFACTOR:
+                TRACE("tessfactor");
+                break;
+
+            case WINED3DDECLUSAGE_POSITIONT:
+                TRACE("positionT%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_FOG:
+                TRACE("fog");
+                break;
+
+            case WINED3DDECLUSAGE_DEPTH:
+                TRACE("depth");
+                break;
+
+            case WINED3DDECLUSAGE_SAMPLE:
+                TRACE("sample");
+                break;
+
+            default:
+                FIXME("unknown_semantics(0x%08x)", semantic->usage);
+        }
+    }
+}
+
+static void shader_dump_register(const struct wined3d_shader_register *reg,
+        const struct wined3d_shader_version *shader_version)
+{
+    static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
+    static const char * const misctype_reg_names[] = {"vPos", "vFace"};
+    UINT offset = reg->idx;
+
+    switch (reg->type)
+    {
+        case WINED3DSPR_TEMP:
+            TRACE("r");
+            break;
+
+        case WINED3DSPR_INPUT:
+            TRACE("v");
+            break;
+
+        case WINED3DSPR_CONST:
+        case WINED3DSPR_CONST2:
+        case WINED3DSPR_CONST3:
+        case WINED3DSPR_CONST4:
+            TRACE("c");
+            offset = shader_get_float_offset(reg->type, reg->idx);
+            break;
+
+        case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
+            TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
+            break;
+
+        case WINED3DSPR_RASTOUT:
+            TRACE("%s", rastout_reg_names[reg->idx]);
+            break;
+
+        case WINED3DSPR_COLOROUT:
+            TRACE("oC");
+            break;
+
+        case WINED3DSPR_DEPTHOUT:
+            TRACE("oDepth");
+            break;
+
+        case WINED3DSPR_ATTROUT:
+            TRACE("oD");
+            break;
+
+        case WINED3DSPR_TEXCRDOUT:
+            /* Vertex shaders >= 3.0 use general purpose output registers
+             * (WINED3DSPR_OUTPUT), which can include an address token. */
+            if (shader_version->major >= 3) TRACE("o");
+            else TRACE("oT");
+            break;
+
+        case WINED3DSPR_CONSTINT:
+            TRACE("i");
+            break;
+
+        case WINED3DSPR_CONSTBOOL:
+            TRACE("b");
+            break;
+
+        case WINED3DSPR_LABEL:
+            TRACE("l");
+            break;
+
+        case WINED3DSPR_LOOP:
+            TRACE("aL");
+            break;
+
+        case WINED3DSPR_SAMPLER:
+            TRACE("s");
+            break;
+
+        case WINED3DSPR_MISCTYPE:
+            if (reg->idx > 1) FIXME("Unhandled misctype register %u.\n", reg->idx);
+            else TRACE("%s", misctype_reg_names[reg->idx]);
+            break;
+
+        case WINED3DSPR_PREDICATE:
+            TRACE("p");
+            break;
+
+        case WINED3DSPR_IMMCONST:
+            TRACE("l");
+            break;
+
+        case WINED3DSPR_CONSTBUFFER:
+            TRACE("cb");
+            break;
+
+        default:
+            TRACE("unhandled_rtype(%#x)", reg->type);
+            break;
+    }
+
+    if (reg->type == WINED3DSPR_IMMCONST)
+    {
+        TRACE("(");
+        switch (reg->immconst_type)
+        {
+            case WINED3D_IMMCONST_FLOAT:
+                TRACE("%.8e", *(const float *)reg->immconst_data);
+                break;
+
+            case WINED3D_IMMCONST_FLOAT4:
+                TRACE("%.8e, %.8e, %.8e, %.8e",
+                        *(const float *)&reg->immconst_data[0], *(const float *)&reg->immconst_data[1],
+                        *(const float *)&reg->immconst_data[2], *(const float *)&reg->immconst_data[3]);
+                break;
+
+            default:
+                TRACE("<unhandled immconst_type %#x>", reg->immconst_type);
+                break;
+        }
+        TRACE(")");
+    }
+    else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
+    {
+        if (reg->array_idx != ~0U)
+        {
+            TRACE("%u[%u", offset, reg->array_idx);
+            if (reg->rel_addr)
+            {
+                TRACE(" + ");
+                shader_dump_src_param(reg->rel_addr, shader_version);
+            }
+            TRACE("]");
+        }
+        else
+        {
+            if (reg->rel_addr)
+            {
+                TRACE("[");
+                shader_dump_src_param(reg->rel_addr, shader_version);
+                TRACE(" + ");
+            }
+            TRACE("%u", offset);
+            if (reg->rel_addr) TRACE("]");
+        }
+    }
+}
+
+void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
+        const struct wined3d_shader_version *shader_version)
+{
+    DWORD write_mask = param->write_mask;
+
+    shader_dump_register(&param->reg, shader_version);
+
+    if (write_mask != WINED3DSP_WRITEMASK_ALL)
+    {
+        static const char *write_mask_chars = "xyzw";
+
+        TRACE(".");
+        if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
+        if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
+        if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
+        if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
+    }
+}
+
+void shader_dump_src_param(const struct wined3d_shader_src_param *param,
+        const struct wined3d_shader_version *shader_version)
+{
+    DWORD src_modifier = param->modifiers;
+    DWORD swizzle = param->swizzle;
+
+    if (src_modifier == WINED3DSPSM_NEG
+            || src_modifier == WINED3DSPSM_BIASNEG
+            || src_modifier == WINED3DSPSM_SIGNNEG
+            || src_modifier == WINED3DSPSM_X2NEG
+            || src_modifier == WINED3DSPSM_ABSNEG)
+        TRACE("-");
+    else if (src_modifier == WINED3DSPSM_COMP)
+        TRACE("1-");
+    else if (src_modifier == WINED3DSPSM_NOT)
+        TRACE("!");
+
+    if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
+        TRACE("abs(");
+
+    shader_dump_register(&param->reg, shader_version);
+
+    if (src_modifier)
+    {
+        switch (src_modifier)
+        {
+            case WINED3DSPSM_NONE:    break;
+            case WINED3DSPSM_NEG:     break;
+            case WINED3DSPSM_NOT:     break;
+            case WINED3DSPSM_BIAS:    TRACE("_bias"); break;
+            case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
+            case WINED3DSPSM_SIGN:    TRACE("_bx2"); break;
+            case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
+            case WINED3DSPSM_COMP:    break;
+            case WINED3DSPSM_X2:      TRACE("_x2"); break;
+            case WINED3DSPSM_X2NEG:   TRACE("_x2"); break;
+            case WINED3DSPSM_DZ:      TRACE("_dz"); break;
+            case WINED3DSPSM_DW:      TRACE("_dw"); break;
+            case WINED3DSPSM_ABSNEG:  TRACE(")"); break;
+            case WINED3DSPSM_ABS:     TRACE(")"); break;
+            default:                  TRACE("_unknown_modifier(%#x)", src_modifier);
+        }
+    }
+
+    if (swizzle != WINED3DSP_NOSWIZZLE)
+    {
+        static const char *swizzle_chars = "xyzw";
+        DWORD swizzle_x = swizzle & 0x03;
+        DWORD swizzle_y = (swizzle >> 2) & 0x03;
+        DWORD swizzle_z = (swizzle >> 4) & 0x03;
+        DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+        if (swizzle_x == swizzle_y
+                && swizzle_x == swizzle_z
+                && swizzle_x == swizzle_w)
+        {
+            TRACE(".%c", swizzle_chars[swizzle_x]);
+        }
+        else
+        {
+            TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
+                    swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
+        }
+    }
+}
+
+/* Shared code in order to generate the bulk of the shader string.
+ * NOTE: A description of how to parse tokens can be found on MSDN. */
+void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
+        const shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    const struct wined3d_shader_frontend *fe = shader->baseShader.frontend;
+    void *fe_data = shader->baseShader.frontend_data;
+    struct wined3d_shader_src_param src_rel_addr[4];
+    struct wined3d_shader_src_param src_param[4];
+    struct wined3d_shader_version shader_version;
+    struct wined3d_shader_src_param dst_rel_addr;
+    struct wined3d_shader_dst_param dst_param;
+    struct wined3d_shader_instruction ins;
+    struct wined3d_shader_context ctx;
+    const DWORD *ptr = byte_code;
+    DWORD i;
+
+    /* Initialize current parsing state. */
+    ctx.shader = iface;
+    ctx.gl_info = &device->adapter->gl_info;
+    ctx.reg_maps = reg_maps;
+    ctx.buffer = buffer;
+    ctx.backend_data = backend_ctx;
+
+    ins.ctx = &ctx;
+    ins.dst = &dst_param;
+    ins.src = src_param;
+    shader->baseShader.parse_state.current_row = 0;
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* Skip comment tokens. */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment) continue;
+
+        /* Read opcode. */
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+
+        /* Unknown opcode and its parameters. */
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        /* Nothing to do. */
+        if (ins.handler_idx == WINED3DSIH_DCL
+                || ins.handler_idx == WINED3DSIH_NOP
+                || ins.handler_idx == WINED3DSIH_DEF
+                || ins.handler_idx == WINED3DSIH_DEFI
+                || ins.handler_idx == WINED3DSIH_DEFB
+                || ins.handler_idx == WINED3DSIH_PHASE)
+        {
+            ptr += param_size;
+            continue;
+        }
+
+        /* Destination token */
+        if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+        /* Predication token */
+        if (ins.predicate) ins.predicate = *ptr++;
+
+        /* Other source tokens */
+        for (i = 0; i < ins.src_count; ++i)
+        {
+            fe->shader_read_src_param(fe_data, &ptr, &src_param[i], &src_rel_addr[i]);
+        }
+
+        /* Call appropriate function for output target */
+        device->shader_backend->shader_handle_instruction(&ins);
+    }
+}
+
+static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
+{
+    DWORD mmask = dst->modifiers;
+
+    switch (dst->shift)
+    {
+        case 0: break;
+        case 13: TRACE("_d8"); break;
+        case 14: TRACE("_d4"); break;
+        case 15: TRACE("_d2"); break;
+        case 1: TRACE("_x2"); break;
+        case 2: TRACE("_x4"); break;
+        case 3: TRACE("_x8"); break;
+        default: TRACE("_unhandled_shift(%d)", dst->shift); break;
+    }
+
+    if (mmask & WINED3DSPDM_SATURATE)         TRACE("_sat");
+    if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
+    if (mmask & WINED3DSPDM_MSAMPCENTROID)    TRACE("_centroid");
+
+    mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
+    if (mmask) FIXME("_unrecognized_modifier(%#x)", mmask);
+}
+
+static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *byte_code)
+{
+    struct wined3d_shader_version shader_version;
+    const DWORD *ptr = byte_code;
+    const char *type_prefix;
+    DWORD i;
+
+    TRACE("Parsing %p.\n", byte_code);
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+    switch (shader_version.type)
+    {
+        case WINED3D_SHADER_TYPE_VERTEX:
+            type_prefix = "vs";
+            break;
+
+        case WINED3D_SHADER_TYPE_GEOMETRY:
+            type_prefix = "gs";
+            break;
+
+        case WINED3D_SHADER_TYPE_PIXEL:
+            type_prefix = "ps";
+            break;
+
+        default:
+            FIXME("Unhandled shader type %#x.\n", shader_version.type);
+            type_prefix = "unknown";
+            break;
+    }
+
+    TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        struct wined3d_shader_instruction ins;
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* comment */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment)
+        {
+            if (comment_size > 4 && *(const DWORD *)comment == WINEMAKEFOURCC('T', 'E', 'X', 'T'))
+            {
+                const char *end = comment + comment_size;
+                const char *ptr = comment + 4;
+                const char *line = ptr;
+
+                TRACE("// TEXT\n");
+                while (ptr != end)
+                {
+                    if (*ptr == '\n')
+                    {
+                        UINT len = ptr - line;
+                        if (len && *(ptr - 1) == '\r') --len;
+                        TRACE("// %s\n", debugstr_an(line, len));
+                        line = ++ptr;
+                    }
+                    else ++ptr;
+                }
+                if (line != ptr) TRACE("// %s\n", debugstr_an(line, ptr - line));
+            }
+            else TRACE("// %s\n", debugstr_an(comment, comment_size));
+            continue;
+        }
+
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        if (ins.handler_idx == WINED3DSIH_DCL)
+        {
+            struct wined3d_shader_semantic semantic;
+
+            fe->shader_read_semantic(&ptr, &semantic);
+
+            shader_dump_decl_usage(&semantic, &shader_version);
+            shader_dump_ins_modifiers(&semantic.reg);
+            TRACE(" ");
+            shader_dump_dst_param(&semantic.reg, &shader_version);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEF)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
+                    *(const float *)(ptr),
+                    *(const float *)(ptr + 1),
+                    *(const float *)(ptr + 2),
+                    *(const float *)(ptr + 3));
+            ptr += 4;
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFI)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
+                    *(ptr),
+                    *(ptr + 1),
+                    *(ptr + 2),
+                    *(ptr + 3));
+            ptr += 4;
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFB)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("defb b%u = %s", dst.reg.idx, *ptr ? "true" : "false");
+            ++ptr;
+        }
+        else
+        {
+            struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
+            struct wined3d_shader_dst_param dst_param;
+            struct wined3d_shader_src_param src_param;
+
+            if (ins.dst_count)
+            {
+                fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+            }
+
+            /* Print out predication source token first - it follows
+             * the destination token. */
+            if (ins.predicate)
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                TRACE("(");
+                shader_dump_src_param(&src_param, &shader_version);
+                TRACE(") ");
+            }
+
+            /* PixWin marks instructions with the coissue flag with a '+' */
+            if (ins.coissue) TRACE("+");
+
+            TRACE("%s", shader_opcode_names[ins.handler_idx]);
+
+            if (ins.handler_idx == WINED3DSIH_IFC
+                    || ins.handler_idx == WINED3DSIH_BREAKC)
+            {
+                switch (ins.flags)
+                {
+                    case COMPARISON_GT: TRACE("_gt"); break;
+                    case COMPARISON_EQ: TRACE("_eq"); break;
+                    case COMPARISON_GE: TRACE("_ge"); break;
+                    case COMPARISON_LT: TRACE("_lt"); break;
+                    case COMPARISON_NE: TRACE("_ne"); break;
+                    case COMPARISON_LE: TRACE("_le"); break;
+                    default: TRACE("_(%u)", ins.flags);
+                }
+            }
+            else if (ins.handler_idx == WINED3DSIH_TEX
+                    && shader_version.major >= 2
+                    && (ins.flags & WINED3DSI_TEXLD_PROJECT))
+            {
+                TRACE("p");
+            }
+
+            /* We already read the destination token, print it. */
+            if (ins.dst_count)
+            {
+                shader_dump_ins_modifiers(&dst_param);
+                TRACE(" ");
+                shader_dump_dst_param(&dst_param, &shader_version);
+            }
+
+            /* Other source tokens */
+            for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                TRACE(!i ? " " : ", ");
+                shader_dump_src_param(&src_param, &shader_version);
+            }
+        }
+        TRACE("\n");
+    }
+}
+
+static void shader_cleanup(IWineD3DBaseShader *iface)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+
+    ((IWineD3DDeviceImpl *)shader->baseShader.device)->shader_backend->shader_destroy(iface);
+    HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf);
+    HeapFree(GetProcessHeap(), 0, shader->baseShader.function);
+    shader_delete_constant_list(&shader->baseShader.constantsF);
+    shader_delete_constant_list(&shader->baseShader.constantsB);
+    shader_delete_constant_list(&shader->baseShader.constantsI);
+    list_remove(&shader->baseShader.shader_list_entry);
+
+    if (shader->baseShader.frontend && shader->baseShader.frontend_data)
+    {
+        shader->baseShader.frontend->shader_free(shader->baseShader.frontend_data);
+    }
+}
+
+static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
+static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
+static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
+static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
+static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
+static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
+static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
+static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
+static void shader_none_destroy(IWineD3DBaseShader *iface) {}
+static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
+static void shader_none_free(IWineD3DDevice *iface) {}
+static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;}
+
+static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
+{
+    /* Set the shader caps to 0 for the none shader backend */
+    caps->VertexShaderVersion = 0;
+    caps->PixelShaderVersion = 0;
+    caps->PixelShader1xMaxValue = 0.0f;
+}
+
+static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
+{
+    if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
+    {
+        TRACE("Checking support for fixup:\n");
+        dump_color_fixup_desc(fixup);
+    }
+
+    /* Faked to make some apps happy. */
+    if (!is_complex_fixup(fixup))
+    {
+        TRACE("[OK]\n");
+        return TRUE;
+    }
+
+    TRACE("[FAILED]\n");
+    return FALSE;
+}
+
+const shader_backend_t none_shader_backend = {
+    shader_none_handle_instruction,
+    shader_none_select,
+    shader_none_select_depth_blt,
+    shader_none_deselect_depth_blt,
+    shader_none_update_float_vertex_constants,
+    shader_none_update_float_pixel_constants,
+    shader_none_load_constants,
+    shader_none_load_np2fixup_constants,
+    shader_none_destroy,
+    shader_none_alloc,
+    shader_none_free,
+    shader_none_dirty_const,
+    shader_none_get_caps,
+    shader_none_color_fixup_supported,
+};
 
 static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent)
 {
index 64876b3..aa1da56 100644 (file)
@@ -641,9 +641,10 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_se
     shader_parse_dst_param(dst_token, NULL, &semantic->reg);
 }
 
-static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm1_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
 {
     DWORD token = **ptr;
+    UINT size;
 
     if ((token & WINED3DSI_OPCODE_MASK) != WINED3D_SM1_OP_COMMENT)
     {
@@ -651,8 +652,10 @@ static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
         return;
     }
 
+    size = (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
     *comment = (const char *)++(*ptr);
-    *ptr += (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
+    *comment_size = size * sizeof(DWORD);
+    *ptr += size;
 }
 
 static BOOL shader_sm1_is_end(void *data, const DWORD **ptr)
index 91aa882..b463790 100644 (file)
@@ -49,10 +49,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
 enum wined3d_sm4_opcode
 {
     WINED3D_SM4_OP_ADD      = 0x00,
+    WINED3D_SM4_OP_BREAK    = 0x02,
+    WINED3D_SM4_OP_BREAKC   = 0x03,
+    WINED3D_SM4_OP_CUT      = 0x09,
     WINED3D_SM4_OP_DP3      = 0x10,
     WINED3D_SM4_OP_DP4      = 0x11,
+    WINED3D_SM4_OP_EMIT     = 0x13,
+    WINED3D_SM4_OP_ENDIF    = 0x15,
+    WINED3D_SM4_OP_ENDLOOP  = 0x16,
     WINED3D_SM4_OP_EXP      = 0x19,
+    WINED3D_SM4_OP_IADD     = 0x1e,
+    WINED3D_SM4_OP_IF       = 0x1f,
+    WINED3D_SM4_OP_IGE      = 0x21,
     WINED3D_SM4_OP_LOG      = 0x2f,
+    WINED3D_SM4_OP_LT       = 0x31,
     WINED3D_SM4_OP_MIN      = 0x33,
     WINED3D_SM4_OP_MAX      = 0x34,
     WINED3D_SM4_OP_MOV      = 0x36,
@@ -102,10 +112,20 @@ struct sysval_map
 static const struct wined3d_sm4_opcode_info opcode_table[] =
 {
     {WINED3D_SM4_OP_ADD,    WINED3DSIH_ADD,         1,  2},
+    {WINED3D_SM4_OP_BREAK,  WINED3DSIH_BREAK,       0,  0},
+    {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP,      0,  1},
+    {WINED3D_SM4_OP_CUT,    WINED3DSIH_CUT,         0,  0},
     {WINED3D_SM4_OP_DP3,    WINED3DSIH_DP3,         1,  2},
     {WINED3D_SM4_OP_DP4,    WINED3DSIH_DP4,         1,  2},
+    {WINED3D_SM4_OP_EMIT,   WINED3DSIH_EMIT,        0,  0},
+    {WINED3D_SM4_OP_ENDIF,  WINED3DSIH_ENDIF,       0,  0},
+    {WINED3D_SM4_OP_ENDLOOP,WINED3DSIH_ENDLOOP,     0,  0},
     {WINED3D_SM4_OP_EXP,    WINED3DSIH_EXP,         1,  1},
+    {WINED3D_SM4_OP_IADD,   WINED3DSIH_IADD,        1,  2},
+    {WINED3D_SM4_OP_IF,     WINED3DSIH_IF,          0,  1},
+    {WINED3D_SM4_OP_IGE,    WINED3DSIH_IGE,         1,  2},
     {WINED3D_SM4_OP_LOG,    WINED3DSIH_LOG,         1,  1},
+    {WINED3D_SM4_OP_LT,     WINED3DSIH_LT,          1,  2},
     {WINED3D_SM4_OP_MIN,    WINED3DSIH_MIN,         1,  2},
     {WINED3D_SM4_OP_MAX,    WINED3DSIH_MAX,         1,  2},
     {WINED3D_SM4_OP_MOV,    WINED3DSIH_MOV,         1,  1},
@@ -386,9 +406,9 @@ static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_se
     FIXME("ptr %p, semantic %p stub!\n", ptr, semantic);
 }
 
-static void shader_sm4_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm4_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
 {
-    FIXME("ptr %p, comment %p stub!\n", ptr, comment);
+    FIXME("ptr %p, comment %p, comment_size %p stub!\n", ptr, comment, comment_size);
     *comment = NULL;
 }
 
index adb426b..5efe069 100644 (file)
@@ -584,6 +584,10 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
             glEnable(GL_DEPTH_CLAMP);
             checkGLcall("glEnable(GL_DEPTH_CLAMP)");
         }
+        else
+        {
+            FIXME("Clipping disabled, but ARB_depth_clamp isn't supported.\n");
+        }
     }
 
     if (enable & WINED3DCLIPPLANE0)  { glEnable(GL_CLIP_PLANE0);  checkGLcall("glEnable(clip plane 0)"); }
@@ -3523,7 +3527,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
     if(stateblock->textures[sampler]) {
         BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE];
         IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
-        tex_impl->baseTexture.internal_preload(stateblock->textures[sampler], srgb ? SRGB_SRGB : SRGB_RGB);
         IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
         basetexture_apply_state_changes(stateblock->textures[sampler],
                 stateblock->textureState[sampler], stateblock->samplerState[sampler], gl_info);
@@ -3597,9 +3600,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
         }
     } else {
         /* Disabled the pixel shader - color ops weren't applied
-         * while it was enabled, so re-apply them.
-         */
-        for(i=0; i < MAX_TEXTURES; i++) {
+         * while it was enabled, so re-apply them. */
+        for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+        {
             if(!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) {
                 device->StateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply
                         (STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
@@ -3880,62 +3883,18 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
     glLoadIdentity();
     checkGLcall("glLoadIdentity");
 
-    if(context->last_was_rhw) {
-        double X, Y, height, width, minZ, maxZ;
-
-        X      = stateblock->viewport.X;
-        Y      = stateblock->viewport.Y;
-        height = stateblock->viewport.Height;
-        width  = stateblock->viewport.Width;
-        minZ   = stateblock->viewport.MinZ;
-        maxZ   = stateblock->viewport.MaxZ;
+    if (context->last_was_rhw)
+    {
+        double x = stateblock->viewport.X;
+        double y = stateblock->viewport.Y;
+        double w = stateblock->viewport.Width;
+        double h = stateblock->viewport.Height;
 
-        if (!stateblock->device->untransformed)
-        {
-            /* Transformed vertices are supposed to bypass the whole transform pipeline including
-             * frustum clipping. This can't be done in opengl, so this code adjusts the Z range to
-             * suppress depth clipping. This can be done because it is an orthogonal projection and
-             * the Z coordinate does not affect the size of the primitives. Half Life 1 and Prince of
-             * Persia 3D need this.
-             *
-             * Note that using minZ and maxZ here doesn't entirely fix the problem, since view frustum
-             * clipping is still enabled, but it seems to fix it for all apps tested so far. A minor
-             * problem can be witnessed in half-life 1 engine based games, the weapon is clipped close
-             * to the viewer.
-             *
-             * Also note that this breaks z comparison against z values filled in with clear,
-             * but no app depending on that and disabled clipping has been found yet. Comparing
-             * primitives against themselves works, so the Z buffer is still intact for normal hidden
-             * surface removal.
-             *
-             * We could disable clipping entirely by setting the near to infinity and far to -infinity,
-             * but this would break Z buffer operation. Raising the range to something less than
-             * infinity would help a bit at the cost of Z precision, but it wouldn't eliminate the
-             * problem either.
-             */
-            TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-            if (context->render_offscreen)
-            {
-                glOrtho(X, X + width, -Y, -Y - height, -minZ, -maxZ);
-            } else {
-                glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
-            }
-        } else {
-            /* If the app mixes transformed and untransformed primitives we can't use the coordinate system
-             * trick above because this would mess up transformed and untransformed Z order. Pass the z position
-             * unmodified to opengl.
-             *
-             * If the app depends on mixed types and disabled clipping we're out of luck without a pipeline
-             * replacement shader.
-             */
-            TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0);
-            if (context->render_offscreen)
-            {
-                glOrtho(X, X + width, -Y, -Y - height, 0.0, -1.0);
-            } else {
-                glOrtho(X, X + width, Y + height, Y, 0.0, -1.0);
-            }
-        }
+        TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h);
+        if (context->render_offscreen)
+            glOrtho(x, x + w, -y, -y - h, 0.0, -1.0);
+        else
+            glOrtho(x, x + w, y + h, y, 0.0, -1.0);
         checkGLcall("glOrtho");
 
         /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */
@@ -4167,7 +4126,7 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
                     GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr));
                     break;
                 case WINED3DFMT_B8G8R8A8_UNORM:
-                    if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+                    if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
                     {
                         const DWORD *src = (const DWORD *)ptr;
                         DWORD c = *src & 0xff00ff00;
@@ -4479,87 +4438,11 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
     loadTexCoords(context, stateblock, si, &curVBO);
 }
 
-static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_info *dataLocations)
-{
-    /* Dump out what parts we have supplied */
-    TRACE("Strided Data:\n");
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_POSITION);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDWEIGHT);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDINDICES);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_NORMAL);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_PSIZE);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_DIFFUSE);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_SPECULAR);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD0);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD1);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD2);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD3);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD4);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD5);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD6);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD7);
-}
-
 static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
 {
-    const struct wined3d_gl_info *gl_info = context->gl_info;
     IWineD3DDeviceImpl *device = stateblock->device;
-    BOOL fixup = FALSE;
-    struct wined3d_stream_info *dataLocations = &device->strided_streams;
-    BOOL useVertexShaderFunction;
-    BOOL load_numbered = FALSE;
-    BOOL load_named = FALSE;
-
-    useVertexShaderFunction = (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader) ? TRUE : FALSE;
-
-    if(device->up_strided) {
-        /* Note: this is a ddraw fixed-function code path */
-        TRACE("================ Strided Input ===================\n");
-        device_stream_info_from_strided(gl_info, device->up_strided, dataLocations);
-
-        if(TRACE_ON(d3d)) {
-            drawPrimitiveTraceDataLocations(dataLocations);
-        }
-    } else {
-        /* Note: This is a fixed function or shader codepath.
-         * This means it must handle both types of strided data.
-         * Shaders must go through here to zero the strided data, even if they
-         * don't set any declaration at all
-         */
-        TRACE("================ Vertex Declaration  ===================\n");
-        device_stream_info_from_declaration(device, useVertexShaderFunction, dataLocations, &fixup);
-    }
-
-    if (dataLocations->position_transformed) useVertexShaderFunction = FALSE;
-
-    if(useVertexShaderFunction) {
-        if(((IWineD3DVertexDeclarationImpl *) stateblock->vertexDecl)->half_float_conv_needed && !fixup) {
-            TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion\n");
-            device->useDrawStridedSlow = TRUE;
-        } else {
-            load_numbered = TRUE;
-            device->useDrawStridedSlow = FALSE;
-        }
-    }
-    else
-    {
-        WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
-        slow_mask |= -!gl_info->supported[EXT_VERTEX_ARRAY_BGRA]
-                & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
-
-        if (fixup || (!dataLocations->position_transformed
-                && !(dataLocations->use_map & slow_mask)))
-        {
-            /* Load the vertex data using named arrays */
-            load_named = TRUE;
-            device->useDrawStridedSlow = FALSE;
-        }
-        else
-        {
-            TRACE("Not loading vertex data\n");
-            device->useDrawStridedSlow = TRUE;
-        }
-    }
+    BOOL load_numbered = use_vs(stateblock) && !device->useDrawStridedSlow;
+    BOOL load_named = !use_vs(stateblock) && !device->useDrawStridedSlow;
 
     if (context->numberedArraysLoaded && !load_numbered)
     {
@@ -4576,13 +4459,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
     if (load_numbered)
     {
         TRACE("Loading numbered arrays\n");
-        loadNumberedArrays(stateblock, dataLocations, context);
+        loadNumberedArrays(stateblock, &device->strided_streams, context);
         context->numberedArraysLoaded = TRUE;
     }
     else if (load_named)
     {
         TRACE("Loading vertex data\n");
-        loadVertexData(context, stateblock, dataLocations);
+        loadVertexData(context, stateblock, &device->strided_streams);
         context->namedArraysLoaded = TRUE;
     }
 }
@@ -5634,8 +5517,7 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
 /* Context activation is done by the caller. */
 static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
 
-static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
 {
     pCaps->TextureOpCaps =  WINED3DTEXOPCAPS_ADD         |
                             WINED3DTEXOPCAPS_ADDSIGNED   |
@@ -5670,7 +5552,7 @@ static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
     if (gl_info->supported[ARB_TEXTURE_ENV_DOT3])
         pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3;
 
-    pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+    pCaps->MaxTextureBlendStages = gl_info->limits.textures;
     pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
 }
 
@@ -5725,6 +5607,43 @@ static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock,
     stateblock->device->multistate_funcs[state][2](state, stateblock, context);
 }
 
+static void prune_invalid_states(struct StateEntry *state_table, const struct wined3d_gl_info *gl_info)
+{
+    unsigned int start, last, i;
+
+    start = STATE_TEXTURESTAGE(gl_info->limits.texture_stages, 0);
+    last = STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE);
+    for (i = start; i <= last; ++i)
+    {
+        state_table[i].representative = 0;
+        state_table[i].apply = state_undefined;
+    }
+
+    start = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + gl_info->limits.texture_stages);
+    last = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + MAX_TEXTURES - 1);
+    for (i = start; i <= last; ++i)
+    {
+        state_table[i].representative = 0;
+        state_table[i].apply = state_undefined;
+    }
+}
+
+static void validate_state_table(struct StateEntry *state_table)
+{
+    unsigned int i;
+
+    for (i = 0; i < STATE_HIGHEST + 1; ++i)
+    {
+        DWORD rep = state_table[i].representative;
+        if (rep && !state_table[rep].representative)
+        {
+            ERR("State %s (%#x) has invalid representative %s (%#x).\n",
+                    debug_d3dstate(i), i, debug_d3dstate(rep), rep);
+            state_table[i].representative = 0;
+        }
+    }
+}
+
 HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs,
         const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex,
         const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc)
@@ -5824,6 +5743,9 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
         }
     }
 
+    prune_invalid_states(StateTable, gl_info);
+    validate_state_table(StateTable);
+
     return WINED3D_OK;
 
 out_of_mem:
index 8dcc691..d17d35c 100644 (file)
@@ -1253,6 +1253,37 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
     TRACE("Updated target %d\n", This->texture_target);
 }
 
+/* Context activation is done by the caller. */
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
+{
+    DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
+    GLenum format, internal, type;
+    GLsizei width, height;
+    CONVERT_TYPES convert;
+    int bpp;
+
+    if (surface->Flags & alloc_flag) return;
+
+    d3dfmt_get_conv(surface, TRUE, TRUE, &format, &internal, &type, &convert, &bpp, srgb);
+    if(convert != NO_CONVERSION) surface->Flags |= SFLAG_CONVERTED;
+    else surface->Flags &= ~SFLAG_CONVERTED;
+
+    if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE))
+    {
+        width = surface->pow2Width;
+        height = surface->pow2Height;
+    }
+    else
+    {
+        width = surface->glRect.right - surface->glRect.left;
+        height = surface->glRect.bottom - surface->glRect.top;
+    }
+
+    surface_bind_and_dirtify(surface, srgb);
+    surface_allocate_surface(surface, internal, width, height, format, type);
+    surface->Flags |= alloc_flag;
+}
+
 static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
 {
     IWineD3DDeviceImpl *device = This->resource.device;
@@ -1822,7 +1853,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
              * in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which
              * conflicts with this.
              */
-            if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (gl_info->supported[ARB_FRAGMENT_PROGRAM]
+            if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)
                     && device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0]))
                     || colorkey_active || !use_texturing)
             {
@@ -1836,7 +1867,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
                     *convert = CONVERT_PALETTED;
                 }
             }
-            else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && gl_info->supported[ARB_FRAGMENT_PROGRAM])
+            else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup))
             {
                 *format = GL_ALPHA;
                 *type = GL_UNSIGNED_BYTE;
@@ -2553,34 +2584,10 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
          * The 8bit pixel data will be used as an index in this palette texture to retrieve the final color. */
         TRACE("Using fragment shaders for emulating 8-bit paletted texture support\n");
 
-        ENTER_GL();
-
-        /* Create the fragment program if we don't have it */
-        if(!device->paletteConversionShader)
-        {
-            const char *fragment_palette_conversion =
-                "!!ARBfp1.0\n"
-                "TEMP index;\n"
-                /* { 255/256, 0.5/255*255/256, 0, 0 } */
-                "PARAM constants = { 0.996, 0.00195, 0, 0 };\n"
-                /* The alpha-component contains the palette index */
-                "TEX index, fragment.texcoord[0], texture[0], 2D;\n"
-                /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
-                "MAD index.a, index.a, constants.x, constants.y;\n"
-                /* Use the alpha-component as an index in the palette to get the final color */
-                "TEX result.color, index.a, texture[1], 1D;\n"
-                "END";
-
-            glEnable(GL_FRAGMENT_PROGRAM_ARB);
-            GL_EXTCALL(glGenProgramsARB(1, &device->paletteConversionShader));
-            GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
-            GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), fragment_palette_conversion));
-            glDisable(GL_FRAGMENT_PROGRAM_ARB);
-        }
-
-        glEnable(GL_FRAGMENT_PROGRAM_ARB);
-        GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
+        device->blitter->set_shader((IWineD3DDevice *) device, This->resource.format_desc,
+                This->texture_target, This->pow2Width, This->pow2Height);
 
+        ENTER_GL();
         GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
@@ -2594,7 +2601,6 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
 
         /* Rebind the texture because it isn't bound anymore */
         glBindTexture(This->texture_target, This->texture_name);
-
         LEAVE_GL();
     }
 }
@@ -2700,7 +2706,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
 static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) {
     /* TODO: check for locks */
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
-    IWineD3DDeviceImpl *device = This->resource.device;
     IWineD3DBaseTexture *baseTexture = NULL;
 
     TRACE("(%p)Checking to see if the container is a base texture\n", This);
@@ -2711,13 +2716,11 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
     }
     else
     {
-        struct wined3d_context *context = NULL;
         GLuint *name;
 
         TRACE("(%p) : Binding surface\n", This);
 
         name = srgb ? &This->texture_name_srgb : &This->texture_name;
-        if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
 
         ENTER_GL();
 
@@ -2751,8 +2754,6 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
         checkGLcall("glBindTexture");
 
         LEAVE_GL();
-
-        if (context) context_release(context);
     }
 }
 
@@ -3447,6 +3448,9 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
     }
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     /* The texture is now most up to date - If the surface is a render target and has a drawable, this
@@ -3921,9 +3925,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
         /* Leave the opengl state valid for blitting */
         myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice);
 
-        /* Flush in case the drawable is used by multiple GL contexts */
-        if(dstSwapchain && (This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer || dstSwapchain->num_contexts >= 2))
-            wglFlush();
+        wglFlush(); /* Flush to ensure ordering across contexts. */
 
         context_release(context);
 
@@ -4552,7 +4554,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
             else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
 
             LEAVE_GL();
-        } else {
+
+            wglFlush(); /* Flush to ensure ordering across contexts. */
+        }
+        else
+        {
             FIXME("No up to date depth stencil location\n");
         }
     } else if (location == SFLAG_DS_ONSCREEN) {
@@ -4569,7 +4575,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
             if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
 
             LEAVE_GL();
-        } else {
+
+            wglFlush(); /* Flush to ensure ordering across contexts. */
+        }
+        else
+        {
             FIXME("No up to date depth stencil location\n");
         }
     } else {
@@ -4656,11 +4666,10 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float
 static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
 {
     IWineD3DDeviceImpl *device = This->resource.device;
+    IWineD3DBaseTextureImpl *texture;
     struct wined3d_context *context;
     struct coords coords[4];
     RECT rect;
-    IWineD3DSwapChain *swapchain;
-    IWineD3DBaseTexture *texture;
     GLenum bind_target;
     struct float_rect f;
 
@@ -4802,25 +4811,16 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
 
     LEAVE_GL();
 
-    if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DSwapChain, (void **) &swapchain)))
-    {
-        /* Make sure to flush the buffers. This is needed in apps like Red Alert II and Tiberian SUN that use multiple WGL contexts. */
-        if(((IWineD3DSwapChainImpl*)swapchain)->frontBuffer == (IWineD3DSurface*)This ||
-           ((IWineD3DSwapChainImpl*)swapchain)->num_contexts >= 2)
-            wglFlush();
+    wglFlush(); /* Flush to ensure ordering across contexts. */
 
-        IWineD3DSwapChain_Release(swapchain);
-    } else {
-        /* We changed the filtering settings on the texture. Inform the container about this to get the filters
-         * reset properly next draw
-         */
-        if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DBaseTexture, (void **) &texture)))
-        {
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
-            IWineD3DBaseTexture_Release(texture);
-        }
+    /* We changed the filtering settings on the texture. Inform the
+     * container about this to get the filters reset properly next draw. */
+    if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)This, &IID_IWineD3DBaseTexture, (void **)&texture)))
+    {
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
+        IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
     }
 
     context_release(context);
@@ -4977,7 +4977,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
         {
             /* Upload from system memory */
             BOOL srgb = flag == SFLAG_INSRGBTEX;
-            DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
             struct wined3d_context *context = NULL;
 
             d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */,
@@ -5004,6 +5003,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
             }
 
             if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+
+            surface_prepare_texture(This, srgb);
             surface_bind_and_dirtify(This, srgb);
 
             if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -5037,17 +5038,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
                     return WINED3DERR_OUTOFVIDEOMEMORY;
                 }
                 d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
-
-                This->Flags |= SFLAG_CONVERTED;
             }
             else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
-                    && (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM]))
+                    && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)))
             {
                 d3dfmt_p8_upload_palette(iface, convert);
-                This->Flags &= ~SFLAG_CONVERTED;
                 mem = This->resource.allocatedMemory;
             } else {
-                This->Flags &= ~SFLAG_CONVERTED;
                 mem = This->resource.allocatedMemory;
             }
 
@@ -5058,10 +5055,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
 
             if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
                 TRACE("non power of two support\n");
-                if(!(This->Flags & alloc_flag)) {
-                    surface_allocate_surface(This, internal, This->pow2Width, This->pow2Height, format, type);
-                    This->Flags |= alloc_flag;
-                }
                 if (mem || (This->Flags & SFLAG_PBO)) {
                     surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem);
                 }
@@ -5069,10 +5062,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
                 /* When making the realloc conditional, keep in mind that GL_APPLE_client_storage may be in use, and This->resource.allocatedMemory
                  * changed. So also keep track of memory changes. In this case the texture has to be reallocated
                  */
-                if(!(This->Flags & alloc_flag)) {
-                    surface_allocate_surface(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type);
-                    This->Flags |= alloc_flag;
-                }
                 if (mem || (This->Flags & SFLAG_PBO)) {
                     surface_upload_data(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem);
                 }
index 6493704..cbdb961 100644 (file)
@@ -217,6 +217,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
     unsigned int sync;
     int retval;
 
+    IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
+
     context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
 
     /* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */
@@ -272,12 +274,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
         IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
     }
 
-    TRACE("presetting HDC %p\n", This->context[0]->hdc);
-
-    /* Don't call checkGLcall, as glGetError is not applicable here */
-    if (hDestWindowOverride && This->win_handle != hDestWindowOverride) {
-        IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
-    }
+    TRACE("Presenting HDC %p.\n", context->hdc);
 
     render_to_fbo = This->render_to_fbo;
 
@@ -343,7 +340,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
         swapchain_blit(This, context, &src_rect, &dst_rect);
     }
 
-    SwapBuffers(This->context[0]->hdc); /* TODO: cycle through the swapchain buffers */
+    if (This->num_contexts > 1) wglFinish();
+    SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */
 
     TRACE("SwapBuffers called, Starting new frame\n");
     /* FPS support */
@@ -521,7 +519,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh
     WINED3DLOCKED_RECT r;
     BYTE *mem;
 
-    if(window == This->win_handle) return WINED3D_OK;
+    if (!window || window == This->win_handle) return WINED3D_OK;
 
     TRACE("Performing dest override of swapchain %p from window %p to %p\n", This, This->win_handle, window);
     if (This->context[0] == This->device->contexts[0])
@@ -913,10 +911,15 @@ err:
         HeapFree(GetProcessHeap(), 0, swapchain->backBuffer);
     }
 
-    if (swapchain->context && swapchain->context[0])
+    if (swapchain->context)
     {
-        context_release(swapchain->context[0]);
-        context_destroy(device, swapchain->context[0]);
+        if (swapchain->context[0])
+        {
+            context_release(swapchain->context[0]);
+            context_destroy(device, swapchain->context[0]);
+            swapchain->num_contexts = 0;
+        }
+        HeapFree(GetProcessHeap(), 0, swapchain->context);
     }
 
     if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer);
index c1e921d..2ff1675 100644 (file)
@@ -387,7 +387,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_RGBA,                    GL_UNSIGNED_INT_8_8_8_8_REV,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
-    {WINED3DFMT_R16G16_UNORM,           GL_RGB16_EXT,                     GL_RGB16_EXT,               GL_RGBA16_EXT,
+    {WINED3DFMT_R16G16_UNORM,           GL_RGB16,                         GL_RGB16,                       GL_RGBA16,
             GL_RGB,                     GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -395,7 +395,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_BGRA,                    GL_UNSIGNED_INT_2_10_10_10_REV,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
-    {WINED3DFMT_R16G16B16A16_UNORM,     GL_RGBA16_EXT,                    GL_RGBA16_EXT,                          0,
+    {WINED3DFMT_R16G16B16A16_UNORM,     GL_RGBA16,                        GL_RGBA16,                              0,
             GL_RGBA,                    GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
             WINED3D_GL_EXT_NONE},
@@ -445,7 +445,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_RGBA,                    GL_BYTE,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             NV_TEXTURE_SHADER},
-    {WINED3DFMT_R16G16_SNORM,           GL_RGB16_EXT,                     GL_RGB16_EXT,                           0,
+    {WINED3DFMT_R16G16_SNORM,           GL_RGB16,                         GL_RGB16,                               0,
             GL_BGR,                     GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -506,7 +506,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_DEPTH_COMPONENT,         GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
             ARB_DEPTH_TEXTURE},
-    {WINED3DFMT_L16_UNORM,              GL_LUMINANCE16_EXT,               GL_LUMINANCE16_EXT,                     0,
+    {WINED3DFMT_L16_UNORM,              GL_LUMINANCE16,                   GL_LUMINANCE16,                         0,
             GL_LUMINANCE,               GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -950,7 +950,7 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3
     if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
     {
         WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n");
-        if (vendor == VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
+        if (vendor == HW_VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
         {
             TRACE("Nvidia card with texture_float support: Assuming float16 blending\n");
             filtered = TRUE;
@@ -1088,17 +1088,20 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
     if (!gl_info->supported[APPLE_YCBCR_422])
     {
         idx = getFmtIdx(WINED3DFMT_YUY2);
-        gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YUY2);
+        gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
 
         idx = getFmtIdx(WINED3DFMT_UYVY);
-        gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_UYVY);
+        gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
     }
 
     idx = getFmtIdx(WINED3DFMT_YV12);
     gl_info->gl_formats[idx].heightscale = 1.5f;
-    gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YV12);
+    gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
 
-    if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+    idx = getFmtIdx(WINED3DFMT_P8_UINT);
+    gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+
+    if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
     {
         idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM);
         gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA;
@@ -1786,6 +1789,51 @@ const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) {
     }
 }
 
+const char *debug_d3dstate(DWORD state)
+{
+    if (STATE_IS_RENDER(state))
+        return wine_dbg_sprintf("STATE_RENDER(%s)", debug_d3drenderstate(state - STATE_RENDER(0)));
+    if (STATE_IS_TEXTURESTAGE(state))
+    {
+        DWORD texture_stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+        DWORD texture_state = state - STATE_TEXTURESTAGE(texture_stage, 0);
+        return wine_dbg_sprintf("STATE_TEXTURESTAGE(%#x, %s)",
+                texture_stage, debug_d3dtexturestate(texture_state));
+    }
+    if (STATE_IS_SAMPLER(state))
+        return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0));
+    if (STATE_IS_PIXELSHADER(state))
+        return "STATE_PIXELSHADER";
+    if (STATE_IS_TRANSFORM(state))
+        return wine_dbg_sprintf("STATE_TRANSFORM(%s)", debug_d3dtstype(state - STATE_TRANSFORM(0)));
+    if (STATE_IS_STREAMSRC(state))
+        return "STATE_STREAMSRC";
+    if (STATE_IS_INDEXBUFFER(state))
+        return "STATE_INDEXBUFFER";
+    if (STATE_IS_VDECL(state))
+        return "STATE_VDECL";
+    if (STATE_IS_VSHADER(state))
+        return "STATE_VSHADER";
+    if (STATE_IS_VIEWPORT(state))
+        return "STATE_VIEWPORT";
+    if (STATE_IS_VERTEXSHADERCONSTANT(state))
+        return "STATE_VERTEXSHADERCONSTANT";
+    if (STATE_IS_PIXELSHADERCONSTANT(state))
+        return "STATE_PIXELSHADERCONSTANT";
+    if (STATE_IS_ACTIVELIGHT(state))
+        return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0));
+    if (STATE_IS_SCISSORRECT(state))
+        return "STATE_SCISSORRECT";
+    if (STATE_IS_CLIPPLANE(state))
+        return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0));
+    if (STATE_IS_MATERIAL(state))
+        return "STATE_MATERIAL";
+    if (STATE_IS_FRONTFACE(state))
+        return "STATE_FRONTFACE";
+
+    return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state);
+}
+
 const char* debug_d3dpool(WINED3DPOOL Pool) {
   switch (Pool) {
 #define POOL_TO_STR(p) case p: return #p
@@ -1868,8 +1916,8 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
         WINED3D_TO_STR(CHANNEL_SOURCE_Y);
         WINED3D_TO_STR(CHANNEL_SOURCE_Z);
         WINED3D_TO_STR(CHANNEL_SOURCE_W);
-        WINED3D_TO_STR(CHANNEL_SOURCE_YUV0);
-        WINED3D_TO_STR(CHANNEL_SOURCE_YUV1);
+        WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX0);
+        WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX1);
 #undef WINED3D_TO_STR
         default:
             FIXME("Unrecognized fixup_channel_source %#x\n", source);
@@ -1877,26 +1925,27 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
     }
 }
 
-static const char *debug_yuv_fixup(enum yuv_fixup yuv_fixup)
+static const char *debug_complex_fixup(enum complex_fixup fixup)
 {
-    switch(yuv_fixup)
+    switch(fixup)
     {
 #define WINED3D_TO_STR(x) case x: return #x
-        WINED3D_TO_STR(YUV_FIXUP_YUY2);
-        WINED3D_TO_STR(YUV_FIXUP_UYVY);
-        WINED3D_TO_STR(YUV_FIXUP_YV12);
+        WINED3D_TO_STR(COMPLEX_FIXUP_YUY2);
+        WINED3D_TO_STR(COMPLEX_FIXUP_UYVY);
+        WINED3D_TO_STR(COMPLEX_FIXUP_YV12);
+        WINED3D_TO_STR(COMPLEX_FIXUP_P8);
 #undef WINED3D_TO_STR
         default:
-            FIXME("Unrecognized YUV fixup %#x\n", yuv_fixup);
+            FIXME("Unrecognized complex fixup %#x\n", fixup);
             return "unrecognized";
     }
 }
 
 void dump_color_fixup_desc(struct color_fixup_desc fixup)
 {
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        TRACE("\tYUV: %s\n", debug_yuv_fixup(get_yuv_fixup(fixup)));
+        TRACE("\tComplex: %s\n", debug_complex_fixup(get_complex_fixup(fixup)));
         return;
     }
 
@@ -2795,40 +2844,3 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
     else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI;
     else *ps_selected = SHADER_NONE;
 }
-
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
-    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
-    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
-    return &none_shader_backend;
-}
-
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type)
-{
-    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
-    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
-            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
-    else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
-    else if (gl_info->supported[NV_REGISTER_COMBINERS]
-            && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
-    else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
-    else return &ffp_fragment_pipeline;
-}
-
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
-    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
-    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
-            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
-    else return &ffp_blit;
-}
index 7262e66..5a42ff6 100644 (file)
@@ -16,7 +16,6 @@
 
        <file>ati_fragment_shader.c</file>
        <file>arb_program_shader.c</file>
-       <file>baseshader.c</file>
        <file>basetexture.c</file>
        <file>buffer.c</file>
        <file>clipper.c</file>
index d6d9794..f8097d6 100644 (file)
@@ -75,6 +75,9 @@ typedef double          GLclampd;
 typedef void            GLvoid;
 typedef ptrdiff_t       GLintptr;
 typedef ptrdiff_t       GLsizeiptr;
+typedef INT64           GLint64;
+typedef UINT64          GLuint64;
+typedef struct __GLsync *GLsync;
 
 /* Booleans */
 #define GL_FALSE                                0x0
@@ -804,6 +807,197 @@ typedef ptrdiff_t       GLsizeiptr;
 #define GL_SAMPLE_COVERAGE_INVERT         0x80AB
 #define GL_MULTISAMPLE_BIT                0x20000000
 
+/* GL_VERSION_2_0 */
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+#define GL_BLEND_EQUATION_RGB                               GL_BLEND_EQUATION
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED                      0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE                         0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE                       0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE                         0x8625
+#define GL_CURRENT_VERTEX_ATTRIB                            0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE                        0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE                          0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER                      0x8645
+#define GL_STENCIL_BACK_FUNC                                0x8800
+#define GL_STENCIL_BACK_FAIL                                0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL                     0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS                     0x8803
+#define GL_MAX_DRAW_BUFFERS                                 0x8824
+#define GL_DRAW_BUFFER0                                     0x8825
+#define GL_DRAW_BUFFER1                                     0x8826
+#define GL_DRAW_BUFFER2                                     0x8827
+#define GL_DRAW_BUFFER3                                     0x8828
+#define GL_DRAW_BUFFER4                                     0x8829
+#define GL_DRAW_BUFFER5                                     0x882a
+#define GL_DRAW_BUFFER6                                     0x882b
+#define GL_DRAW_BUFFER7                                     0x882c
+#define GL_DRAW_BUFFER8                                     0x882d
+#define GL_DRAW_BUFFER9                                     0x882e
+#define GL_DRAW_BUFFER10                                    0x882f
+#define GL_DRAW_BUFFER11                                    0x8830
+#define GL_DRAW_BUFFER12                                    0x8831
+#define GL_DRAW_BUFFER13                                    0x8832
+#define GL_DRAW_BUFFER14                                    0x8833
+#define GL_DRAW_BUFFER15                                    0x8834
+#define GL_BLEND_EQUATION_ALPHA                             0x883d
+#define GL_POINT_SPRITE                                     0x8861
+#define GL_COORD_REPLACE                                    0x8862
+#define GL_MAX_VERTEX_ATTRIBS                               0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED                   0x886a
+#define GL_MAX_TEXTURE_COORDS                               0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS                          0x8872
+#define GL_FRAGMENT_SHADER                                  0x8b30
+#define GL_VERTEX_SHADER                                    0x8b31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS                  0x8b49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS                    0x8b4a
+#define GL_MAX_VARYING_FLOATS                               0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS                   0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS                 0x8b4d
+#define GL_SHADER_TYPE                                      0x8b4f
+#define GL_FLOAT_VEC2                                       0x8b50
+#define GL_FLOAT_VEC3                                       0x8b51
+#define GL_FLOAT_VEC4                                       0x8b52
+#define GL_INT_VEC2                                         0x8b53
+#define GL_INT_VEC3                                         0x8b54
+#define GL_INT_VEC4                                         0x8b55
+#define GL_BOOL                                             0x8b56
+#define GL_BOOL_VEC2                                        0x8b57
+#define GL_BOOL_VEC3                                        0x8b58
+#define GL_BOOL_VEC4                                        0x8b59
+#define GL_FLOAT_MAT2                                       0x8b5a
+#define GL_FLOAT_MAT3                                       0x8b5b
+#define GL_FLOAT_MAT4                                       0x8b5c
+#define GL_SAMPLER_1D                                       0x8b5d
+#define GL_SAMPLER_2D                                       0x8b5e
+#define GL_SAMPLER_3D                                       0x8b5f
+#define GL_SAMPLER_CUBE                                     0x8b60
+#define GL_SAMPLER_1D_SHADOW                                0x8b61
+#define GL_SAMPLER_2D_SHADOW                                0x8b62
+#define GL_DELETE_STATUS                                    0x8b80
+#define GL_COMPILE_STATUS                                   0x8b81
+#define GL_LINK_STATUS                                      0x8b82
+#define GL_VALIDATE_STATUS                                  0x8b83
+#define GL_INFO_LOG_LENGTH                                  0x8b84
+#define GL_ATTACHED_SHADERS                                 0x8b85
+#define GL_ACTIVE_UNIFORMS                                  0x8b86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH                        0x8b87
+#define GL_SHADER_SOURCE_LENGTH                             0x8b88
+#define GL_ACTIVE_ATTRIBUTES                                0x8b89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH                      0x8b8a
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT                  0x8b8b
+#define GL_SHADING_LANGUAGE_VERSION                         0x8b8c
+#define GL_CURRENT_PROGRAM                                  0x8b8d
+#define GL_POINT_SPRITE_COORD_ORIGIN                        0x8ca0
+#define GL_LOWER_LEFT                                       0x8ca1
+#define GL_UPPER_LEFT                                       0x8ca2
+#define GL_STENCIL_BACK_REF                                 0x8ca3
+#define GL_STENCIL_BACK_VALUE_MASK                          0x8ca4
+#define GL_STENCIL_BACK_WRITEMASK                           0x8ca5
+typedef char GLchar;
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs);
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNCOMPILESHADERPROC)(GLuint shader);
+typedef GLuint (WINE_GLAPI *PGLFNCREATEPROGRAMPROC)(void);
+typedef GLuint (WINE_GLAPI *PGLFNCREATESHADERPROC)(GLenum type);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETESHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEATTRIBPROC)(GLuint program,
+        GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEUNIFORMPROC)(GLuint program,
+        GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+typedef GLint (WINE_GLAPI *PGLFNGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMINFOLOGPROC)(GLuint program,
+        GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef GLint (WINE_GLAPI *PGLFNGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMPROC)(GLuint program);
+typedef GLboolean (WINE_GLAPI *PGLFNISSHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNLINKPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNSHADERSOURCEPROC)(GLuint shader,
+        GLsizei count, const GLchar* *string, const GLint *length);
+typedef void (WINE_GLAPI *PGLFNUSEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX2FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX3FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX4FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERPROC)(GLuint index,
+        GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+
 void (WINE_GLAPI *glAccum)(GLenum op, GLfloat value) DECLSPEC_HIDDEN;
 void (WINE_GLAPI *glAlphaFunc)(GLenum func, GLclampf ref) DECLSPEC_HIDDEN;
 GLboolean (WINE_GLAPI *glAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences) DECLSPEC_HIDDEN;
@@ -1524,68 +1718,273 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN;
     USE_WGL_FUNC(wglMakeCurrent) \
     USE_WGL_FUNC(wglShareLists)
 
+/* OpenGL extensions. */
+typedef enum wined3d_gl_extension
+{
+    WINED3D_GL_EXT_NONE,
 
-/****************************************************
- * OpenGL Extensions (EXT and ARB)
- *     #defines and functions pointer
- ****************************************************/
+    /* APPLE */
+    APPLE_CLIENT_STORAGE,
+    APPLE_FENCE,
+    APPLE_FLOAT_PIXELS,
+    APPLE_FLUSH_BUFFER_RANGE,
+    APPLE_FLUSH_RENDER,
+    APPLE_YCBCR_422,
+    /* ARB */
+    ARB_COLOR_BUFFER_FLOAT,
+    ARB_DEPTH_BUFFER_FLOAT,
+    ARB_DEPTH_CLAMP,
+    ARB_DEPTH_TEXTURE,
+    ARB_DRAW_BUFFERS,
+    ARB_FRAGMENT_PROGRAM,
+    ARB_FRAGMENT_SHADER,
+    ARB_FRAMEBUFFER_OBJECT,
+    ARB_GEOMETRY_SHADER4,
+    ARB_HALF_FLOAT_PIXEL,
+    ARB_HALF_FLOAT_VERTEX,
+    ARB_IMAGING,
+    ARB_MAP_BUFFER_RANGE,
+    ARB_MULTISAMPLE,
+    ARB_MULTITEXTURE,
+    ARB_OCCLUSION_QUERY,
+    ARB_PIXEL_BUFFER_OBJECT,
+    ARB_POINT_PARAMETERS,
+    ARB_POINT_SPRITE,
+    ARB_PROVOKING_VERTEX,
+    ARB_SHADER_OBJECTS,
+    ARB_SHADER_TEXTURE_LOD,
+    ARB_SHADING_LANGUAGE_100,
+    ARB_SYNC,
+    ARB_TEXTURE_BORDER_CLAMP,
+    ARB_TEXTURE_COMPRESSION,
+    ARB_TEXTURE_CUBE_MAP,
+    ARB_TEXTURE_ENV_ADD,
+    ARB_TEXTURE_ENV_COMBINE,
+    ARB_TEXTURE_ENV_DOT3,
+    ARB_TEXTURE_FLOAT,
+    ARB_TEXTURE_MIRRORED_REPEAT,
+    ARB_TEXTURE_NON_POWER_OF_TWO,
+    ARB_TEXTURE_RECTANGLE,
+    ARB_TEXTURE_RG,
+    ARB_VERTEX_ARRAY_BGRA,
+    ARB_VERTEX_BLEND,
+    ARB_VERTEX_BUFFER_OBJECT,
+    ARB_VERTEX_PROGRAM,
+    ARB_VERTEX_SHADER,
+    /* ATI */
+    ATI_FRAGMENT_SHADER,
+    ATI_SEPARATE_STENCIL,
+    ATI_TEXTURE_COMPRESSION_3DC,
+    ATI_TEXTURE_ENV_COMBINE3,
+    ATI_TEXTURE_MIRROR_ONCE,
+    /* EXT */
+    EXT_BLEND_COLOR,
+    EXT_BLEND_EQUATION_SEPARATE,
+    EXT_BLEND_FUNC_SEPARATE,
+    EXT_BLEND_MINMAX,
+    EXT_FOG_COORD,
+    EXT_FRAMEBUFFER_BLIT,
+    EXT_FRAMEBUFFER_MULTISAMPLE,
+    EXT_FRAMEBUFFER_OBJECT,
+    EXT_GPU_PROGRAM_PARAMETERS,
+    EXT_GPU_SHADER4,
+    EXT_PACKED_DEPTH_STENCIL,
+    EXT_PALETTED_TEXTURE,
+    EXT_POINT_PARAMETERS,
+    EXT_PROVOKING_VERTEX,
+    EXT_SECONDARY_COLOR,
+    EXT_STENCIL_TWO_SIDE,
+    EXT_STENCIL_WRAP,
+    EXT_TEXTURE3D,
+    EXT_TEXTURE_COMPRESSION_RGTC,
+    EXT_TEXTURE_COMPRESSION_S3TC,
+    EXT_TEXTURE_ENV_ADD,
+    EXT_TEXTURE_ENV_COMBINE,
+    EXT_TEXTURE_ENV_DOT3,
+    EXT_TEXTURE_FILTER_ANISOTROPIC,
+    EXT_TEXTURE_LOD_BIAS,
+    EXT_TEXTURE_SRGB,
+    EXT_VERTEX_ARRAY_BGRA,
+    /* NVIDIA */
+    NV_DEPTH_CLAMP,
+    NV_FENCE,
+    NV_FOG_DISTANCE,
+    NV_FRAGMENT_PROGRAM,
+    NV_FRAGMENT_PROGRAM2,
+    NV_FRAGMENT_PROGRAM_OPTION,
+    NV_HALF_FLOAT,
+    NV_LIGHT_MAX_EXPONENT,
+    NV_REGISTER_COMBINERS,
+    NV_REGISTER_COMBINERS2,
+    NV_TEXGEN_REFLECTION,
+    NV_TEXTURE_ENV_COMBINE4,
+    NV_TEXTURE_SHADER,
+    NV_TEXTURE_SHADER2,
+    NV_VERTEX_PROGRAM,
+    NV_VERTEX_PROGRAM1_1,
+    NV_VERTEX_PROGRAM2,
+    NV_VERTEX_PROGRAM2_OPTION,
+    NV_VERTEX_PROGRAM3,
+    /* SGI */
+    SGIS_GENERATE_MIPMAP,
+    SGI_VIDEO_SYNC,
+    /* WGL extensions */
+    WGL_ARB_PBUFFER,
+    WGL_ARB_PIXEL_FORMAT,
+    WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
+    /* Internally used */
+    WINE_NORMALIZED_TEXRECT,
+
+    WINED3D_GL_EXT_COUNT,
+} GL_SupportedExt;
+
+/* GL_APPLE_client_storage */
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+#define GL_UNPACK_CLIENT_STORAGE_APPLE                      0x85b2
+#endif
+
+/* GL_APPLE_fence */
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+#define GL_DRAW_PIXELS_APPLE                                0x8a0a
+#define GL_FENCE_APPLE                                      0x8a0b
+#endif
+typedef void (WINE_GLAPI *PGLFNGENFENCESAPPLEPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESAPPLEPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCEAPPLEPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTOBJECTAPPLEPROC)(GLenum, GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHOBJECTAPPLEPROC)(GLenum, GLuint);
+
+/* GL_APPLE_float_pixels */
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+#define GL_HALF_APPLE                                       0x140b
+#define GL_COLOR_FLOAT_APPLE                                0x8a0f
+#define GL_RGBA_FLOAT32_APPLE                               0x8814
+#define GL_RGB_FLOAT32_APPLE                                0x8815
+#define GL_ALPHA_FLOAT32_APPLE                              0x8816
+#define GL_INTENSITY_FLOAT32_APPLE                          0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE                          0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE                    0x8819
+#define GL_RGBA_FLOAT16_APPLE                               0x881a
+#define GL_RGB_FLOAT16_APPLE                                0x881b
+#define GL_ALPHA_FLOAT16_APPLE                              0x881c
+#define GL_INTENSITY_FLOAT16_APPLE                          0x881d
+#define GL_LUMINANCE_FLOAT16_APPLE                          0x881e
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE                    0x881f
+#endif
+
+/* GL_APPLE_flush_buffer_range */
+#ifndef GL_APPLE_flush_buffer_range
+#define GL_APPLE_flush_buffer_range 1
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE                   0x8a12
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE                      0x8a13
+typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE)(GLenum target, GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size);
+#endif
+
+/* GL_APPLE_flush_render */
+typedef void (WINE_GLAPI *PGLFNFLUSHRENDERAPPLEPROC)(void);
+typedef void (WINE_GLAPI *PGLFNFINISHRENDERAPPLEPROC)(void);
+
+/* GL_APPLE_ycbcr_422 */
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+#define GL_YCBCR_422_APPLE                                  0x85b9
+#define UNSIGNED_SHORT_8_8_APPLE                            0x85ba
+#define UNSIGNED_SHORT_8_8_REV_APPLE                        0x85bb
+#endif
 
 /* GL_ARB_color_buffer_float */
 #ifndef GL_ARB_color_buffer_float
-#define GL_RGBA_FLOAT_MODE_ARB            0x8820
-#define GL_CLAMP_VERTEX_COLOR_ARB         0x891A
-#define GL_CLAMP_FRAGMENT_COLOR_ARB       0x891B
-#define GL_CLAMP_READ_COLOR_ARB           0x891C
-#define GL_FIXED_ONLY_ARB                 0x891D
+#define GL_ARB_color_buffer_float 1
+#define GL_RGBA_FLOAT_MODE_ARB                              0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB                           0x891a
+#define GL_CLAMP_FRAGMENT_COLOR_ARB                         0x891b
+#define GL_CLAMP_READ_COLOR_ARB                             0x891c
+#define GL_FIXED_ONLY_ARB                                   0x891d
 #endif
-typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC)(GLenum target, GLenum clamp);
 
 /* GL_ARB_depth_buffer_float */
 #ifndef GL_ARB_depth_buffer_float
 #define GL_ARB_depth_buffer_float 1
-#define GL_DEPTH_COMPONENT32F             0x8cac
-#define GL_DEPTH32F_STENCIL8              0x8cad
-#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad
+#define GL_DEPTH_COMPONENT32F                               0x8cac
+#define GL_DEPTH32F_STENCIL8                                0x8cad
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV                   0x8dad
 #endif
 
 /* GL_ARB_depth_clamp */
 #ifndef GL_ARB_depth_clamp
 #define GL_ARB_depth_clamp 1
-#define GL_DEPTH_CLAMP                    0x864f
+#define GL_DEPTH_CLAMP                                      0x864f
 #endif
 
 /* GL_ARB_depth_texture */
 #ifndef GL_ARB_depth_texture
 #define GL_ARB_depth_texture 1
-#define GL_DEPTH_COMPONENT16_ARB          0x81A5
-#define GL_DEPTH_COMPONENT24_ARB          0x81A6
-#define GL_DEPTH_COMPONENT32_ARB          0x81A7
-#define GL_TEXTURE_DEPTH_SIZE_ARB         0x884A
-#define GL_DEPTH_TEXTURE_MODE_ARB         0x884B
+#define GL_DEPTH_COMPONENT16_ARB                            0x81a5
+#define GL_DEPTH_COMPONENT24_ARB                            0x81a6
+#define GL_DEPTH_COMPONENT32_ARB                            0x81a7
+#define GL_TEXTURE_DEPTH_SIZE_ARB                           0x884a
+#define GL_DEPTH_TEXTURE_MODE_ARB                           0x884b
 #endif
 
 /* GL_ARB_draw_buffers */
 #ifndef GL_ARB_draw_buffers
 #define GL_ARB_draw_buffers 1
-#define GL_MAX_DRAW_BUFFERS_ARB           0x8824
-#define GL_DRAW_BUFFER0_ARB               0x8825
-#define GL_DRAW_BUFFER1_ARB               0x8826
-#define GL_DRAW_BUFFER2_ARB               0x8827
-#define GL_DRAW_BUFFER3_ARB               0x8828
-#define GL_DRAW_BUFFER4_ARB               0x8829
-#define GL_DRAW_BUFFER5_ARB               0x882A
-#define GL_DRAW_BUFFER6_ARB               0x882B
-#define GL_DRAW_BUFFER7_ARB               0x882C
-#define GL_DRAW_BUFFER8_ARB               0x882D
-#define GL_DRAW_BUFFER9_ARB               0x882E
-#define GL_DRAW_BUFFER10_ARB              0x882F
-#define GL_DRAW_BUFFER11_ARB              0x8830
-#define GL_DRAW_BUFFER12_ARB              0x8831
-#define GL_DRAW_BUFFER13_ARB              0x8832
-#define GL_DRAW_BUFFER14_ARB              0x8833
-#define GL_DRAW_BUFFER15_ARB              0x8834
+#define GL_MAX_DRAW_BUFFERS_ARB                             0x8824
+#define GL_DRAW_BUFFER0_ARB                                 0x8825
+#define GL_DRAW_BUFFER1_ARB                                 0x8826
+#define GL_DRAW_BUFFER2_ARB                                 0x8827
+#define GL_DRAW_BUFFER3_ARB                                 0x8828
+#define GL_DRAW_BUFFER4_ARB                                 0x8829
+#define GL_DRAW_BUFFER5_ARB                                 0x882a
+#define GL_DRAW_BUFFER6_ARB                                 0x882b
+#define GL_DRAW_BUFFER7_ARB                                 0x882c
+#define GL_DRAW_BUFFER8_ARB                                 0x882d
+#define GL_DRAW_BUFFER9_ARB                                 0x882e
+#define GL_DRAW_BUFFER10_ARB                                0x882f
+#define GL_DRAW_BUFFER11_ARB                                0x8830
+#define GL_DRAW_BUFFER12_ARB                                0x8831
+#define GL_DRAW_BUFFER13_ARB                                0x8832
+#define GL_DRAW_BUFFER14_ARB                                0x8833
+#define GL_DRAW_BUFFER15_ARB                                0x8834
+#endif
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC)(GLsizei n, const GLenum *bufs);
+
+/* GL_ARB_fragment_program */
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+#define GL_FRAGMENT_PROGRAM_ARB                             0x8804
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB                     0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB                     0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB                     0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB              0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB              0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB              0x880a
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB                 0x880b
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB                 0x880c
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB                 0x880d
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB          0x880e
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB          0x880f
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB          0x8810
+#define GL_MAX_TEXTURE_COORDS_ARB                           0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB                      0x8872
+/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
+#endif
+
+/* GL_ARB_fragment_shader */
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ARB                              0x8b30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB              0x8b49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB              0x8b8b
 #endif
-typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs);
 
 /* GL_ARB_framebuffer_object */
 #ifndef GL_ARB_framebuffer_object
@@ -1665,58 +2064,59 @@ typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *buf
 #define GL_DEPTH24_STENCIL8                                 0x88f0
 #define GL_TEXTURE_STENCIL_SIZE                             0x88f1
 #endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
         GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
         GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
         GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
         GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
         GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
 
 /* GL_ARB_geometry_shader4 */
 #ifndef GL_ARB_geometry_shader4
-#define GL_GEOMETRY_SHADER_ARB                      0x8dd9
-#define GL_GEOMETRY_VERTICES_OUT_ARB                0x8dda
-#define GL_GEOMETRY_INPUT_TYPE_ARB                  0x8ddb
-#define GL_GEOMETRY_OUTPUT_TYPE_ARB                 0x8ddc
-#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB     0x8c29
-#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB      0x8ddd
-#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB        0x8dde
-#define GL_MAX_VARYING_COMPONENTS_ARB               0x8b4b
-#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB      0x8ddf
-#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB         0x8de0
-#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1
-#define GL_LINES_ADJACENCY_ARB                      0x000a
-#define GL_LINE_STRIP_ADJACENCY_ARB                 0x000b
-#define GL_TRIANGLES_ADJACENCY_ARB                  0x000c
-#define GL_TRIANGLE_STRIP_ADJACENCY_ARB             0x000d
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB   0x8da9
-#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB       0x8da7
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER     0x8cd4
-#define GL_PROGRAM_POINT_SIZE_ARB                   0x8642
+#define GL_ARB_geometry_shader4 1
+#define GL_GEOMETRY_SHADER_ARB                              0x8dd9
+#define GL_GEOMETRY_VERTICES_OUT_ARB                        0x8dda
+#define GL_GEOMETRY_INPUT_TYPE_ARB                          0x8ddb
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB                         0x8ddc
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB             0x8c29
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB              0x8ddd
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB                0x8dde
+#define GL_MAX_VARYING_COMPONENTS_ARB                       0x8b4b
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB              0x8ddf
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB                 0x8de0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB         0x8de1
+#define GL_LINES_ADJACENCY_ARB                              0x000a
+#define GL_LINE_STRIP_ADJACENCY_ARB                         0x000b
+#define GL_TRIANGLES_ADJACENCY_ARB                          0x000c
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB                     0x000d
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB         0x8da8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB           0x8da9
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB               0x8da7
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER             0x8cd4
+#define GL_PROGRAM_POINT_SIZE_ARB                           0x8642
 #endif
 typedef void (WINE_GLAPI *PGLFNPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
 typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment,
@@ -1726,380 +2126,1067 @@ typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GL
 typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment,
         GLuint texture, GLint level, GLenum face);
 
+/* GL_ARB_half_float_pixel */
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+#define GL_HALF_FLOAT_ARB                                   0x140b
+#endif
+
+/* GL_ARB_half_float_vertex */
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+/* No _ARB, see extension spec */
+#define GL_HALF_FLOAT                                       0x140b
+#endif
+
 /* GL_ARB_imaging */
 #ifndef GL_ARB_imaging
 #define GL_ARB_imaging 1
-#define GL_CONSTANT_COLOR                 0x8001
-#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002
-#define GL_CONSTANT_ALPHA                 0x8003
-#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
-#define GL_BLEND_COLOR                    0x8005
-#define GL_FUNC_ADD                       0x8006
-#define GL_MIN                            0x8007
-#define GL_MAX                            0x8008
-#define GL_BLEND_EQUATION                 0x8009
-#define GL_FUNC_SUBTRACT                  0x800A
-#define GL_FUNC_REVERSE_SUBTRACT          0x800B
-#define GL_CONVOLUTION_1D                 0x8010
-#define GL_CONVOLUTION_2D                 0x8011
-#define GL_SEPARABLE_2D                   0x8012
-#define GL_CONVOLUTION_BORDER_MODE        0x8013
-#define GL_CONVOLUTION_FILTER_SCALE       0x8014
-#define GL_CONVOLUTION_FILTER_BIAS        0x8015
-#define GL_REDUCE                         0x8016
-#define GL_CONVOLUTION_FORMAT             0x8017
-#define GL_CONVOLUTION_WIDTH              0x8018
-#define GL_CONVOLUTION_HEIGHT             0x8019
-#define GL_MAX_CONVOLUTION_WIDTH          0x801A
-#define GL_MAX_CONVOLUTION_HEIGHT         0x801B
-#define GL_POST_CONVOLUTION_RED_SCALE     0x801C
-#define GL_POST_CONVOLUTION_GREEN_SCALE   0x801D
-#define GL_POST_CONVOLUTION_BLUE_SCALE    0x801E
-#define GL_POST_CONVOLUTION_ALPHA_SCALE   0x801F
-#define GL_POST_CONVOLUTION_RED_BIAS      0x8020
-#define GL_POST_CONVOLUTION_GREEN_BIAS    0x8021
-#define GL_POST_CONVOLUTION_BLUE_BIAS     0x8022
-#define GL_POST_CONVOLUTION_ALPHA_BIAS    0x8023
-#define GL_HISTOGRAM                      0x8024
-#define GL_PROXY_HISTOGRAM                0x8025
-#define GL_HISTOGRAM_WIDTH                0x8026
-#define GL_HISTOGRAM_FORMAT               0x8027
-#define GL_HISTOGRAM_RED_SIZE             0x8028
-#define GL_HISTOGRAM_GREEN_SIZE           0x8029
-#define GL_HISTOGRAM_BLUE_SIZE            0x802A
-#define GL_HISTOGRAM_ALPHA_SIZE           0x802B
-#define GL_HISTOGRAM_LUMINANCE_SIZE       0x802C
-#define GL_HISTOGRAM_SINK                 0x802D
-#define GL_MINMAX                         0x802E
-#define GL_MINMAX_FORMAT                  0x802F
-#define GL_MINMAX_SINK                    0x8030
-#define GL_TABLE_TOO_LARGE                0x8031
-#define GL_COLOR_MATRIX                   0x80B1
-#define GL_COLOR_MATRIX_STACK_DEPTH       0x80B2
-#define GL_MAX_COLOR_MATRIX_STACK_DEPTH   0x80B3
-#define GL_POST_COLOR_MATRIX_RED_SCALE    0x80B4
-#define GL_POST_COLOR_MATRIX_GREEN_SCALE  0x80B5
-#define GL_POST_COLOR_MATRIX_BLUE_SCALE   0x80B6
-#define GL_POST_COLOR_MATRIX_ALPHA_SCALE  0x80B7
-#define GL_POST_COLOR_MATRIX_RED_BIAS     0x80B8
-#define GL_POST_COLOR_MATRIX_GREEN_BIAS   0x80B9
-#define GL_POST_COLOR_MATRIX_BLUE_BIAS    0x80BA
-#define GL_POST_COLOR_MATRIX_ALPHA_BIAS   0x80BB
-#define GL_COLOR_TABLE                    0x80D0
-#define GL_POST_CONVOLUTION_COLOR_TABLE   0x80D1
-#define GL_POST_COLOR_MATRIX_COLOR_TABLE  0x80D2
-#define GL_PROXY_COLOR_TABLE              0x80D3
-#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
-#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
-#define GL_COLOR_TABLE_SCALE              0x80D6
-#define GL_COLOR_TABLE_BIAS               0x80D7
-#define GL_COLOR_TABLE_FORMAT             0x80D8
-#define GL_COLOR_TABLE_WIDTH              0x80D9
-#define GL_COLOR_TABLE_RED_SIZE           0x80DA
-#define GL_COLOR_TABLE_GREEN_SIZE         0x80DB
-#define GL_COLOR_TABLE_BLUE_SIZE          0x80DC
-#define GL_COLOR_TABLE_ALPHA_SIZE         0x80DD
-#define GL_COLOR_TABLE_LUMINANCE_SIZE     0x80DE
-#define GL_COLOR_TABLE_INTENSITY_SIZE     0x80DF
-#define GL_CONSTANT_BORDER                0x8151
-#define GL_REPLICATE_BORDER               0x8153
-#define GL_CONVOLUTION_BORDER_COLOR       0x8154
+#define GL_CONSTANT_COLOR                                   0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR                         0x8002
+#define GL_CONSTANT_ALPHA                                   0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA                         0x8004
+#define GL_BLEND_COLOR                                      0x8005
+#define GL_FUNC_ADD                                         0x8006
+#define GL_MIN                                              0x8007
+#define GL_MAX                                              0x8008
+#define GL_BLEND_EQUATION                                   0x8009
+#define GL_FUNC_SUBTRACT                                    0x800a
+#define GL_FUNC_REVERSE_SUBTRACT                            0x800b
+#define GL_CONVOLUTION_1D                                   0x8010
+#define GL_CONVOLUTION_2D                                   0x8011
+#define GL_SEPARABLE_2D                                     0x8012
+#define GL_CONVOLUTION_BORDER_MODE                          0x8013
+#define GL_CONVOLUTION_FILTER_SCALE                         0x8014
+#define GL_CONVOLUTION_FILTER_BIAS                          0x8015
+#define GL_REDUCE                                           0x8016
+#define GL_CONVOLUTION_FORMAT                               0x8017
+#define GL_CONVOLUTION_WIDTH                                0x8018
+#define GL_CONVOLUTION_HEIGHT                               0x8019
+#define GL_MAX_CONVOLUTION_WIDTH                            0x801a
+#define GL_MAX_CONVOLUTION_HEIGHT                           0x801b
+#define GL_POST_CONVOLUTION_RED_SCALE                       0x801d
+#define GL_POST_CONVOLUTION_GREEN_SCALE                     0x801f
+#define GL_POST_CONVOLUTION_BLUE_SCALE                      0x801e
+#define GL_POST_CONVOLUTION_ALPHA_SCALE                     0x801f
+#define GL_POST_CONVOLUTION_RED_BIAS                        0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS                      0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS                       0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS                      0x8023
+#define GL_HISTOGRAM                                        0x8024
+#define GL_PROXY_HISTOGRAM                                  0x8025
+#define GL_HISTOGRAM_WIDTH                                  0x8026
+#define GL_HISTOGRAM_FORMAT                                 0x8027
+#define GL_HISTOGRAM_RED_SIZE                               0x8028
+#define GL_HISTOGRAM_GREEN_SIZE                             0x8029
+#define GL_HISTOGRAM_BLUE_SIZE                              0x802a
+#define GL_HISTOGRAM_ALPHA_SIZE                             0x802b
+#define GL_HISTOGRAM_LUMINANCE_SIZE                         0x802c
+#define GL_HISTOGRAM_SINK                                   0x802d
+#define GL_MINMAX                                           0x802e
+#define GL_MINMAX_FORMAT                                    0x802f
+#define GL_MINMAX_SINK                                      0x8030
+#define GL_TABLE_TOO_LARGE                                  0x8031
+#define GL_COLOR_MATRIX                                     0x80b1
+#define GL_COLOR_MATRIX_STACK_DEPTH                         0x80b2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH                     0x80b3
+#define GL_POST_COLOR_MATRIX_RED_SCALE                      0x80b4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE                    0x80b5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE                     0x80b6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE                    0x80b7
+#define GL_POST_COLOR_MATRIX_RED_BIAS                       0x80b8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS                     0x80b9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS                      0x80ba
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS                     0x80bb
+#define GL_COLOR_TABLE                                      0x80d0
+#define GL_POST_CONVOLUTION_COLOR_TABLE                     0x80d1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE                    0x80d2
+#define GL_PROXY_COLOR_TABLE                                0x80d3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE               0x80d4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE              0x80d5
+#define GL_COLOR_TABLE_SCALE                                0x80d6
+#define GL_COLOR_TABLE_BIAS                                 0x80d7
+#define GL_COLOR_TABLE_FORMAT                               0x80d8
+#define GL_COLOR_TABLE_WIDTH                                0x80d9
+#define GL_COLOR_TABLE_RED_SIZE                             0x80da
+#define GL_COLOR_TABLE_GREEN_SIZE                           0x80db
+#define GL_COLOR_TABLE_BLUE_SIZE                            0x80dc
+#define GL_COLOR_TABLE_ALPHA_SIZE                           0x80dd
+#define GL_COLOR_TABLE_LUMINANCE_SIZE                       0x80de
+#define GL_COLOR_TABLE_INTENSITY_SIZE                       0x80df
+#define GL_CONSTANT_BORDER                                  0x8151
+#define GL_REPLICATE_BORDER                                 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR                         0x8154
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC)(GLenum mode);
+
+/* GL_ARB_map_buffer_range */
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+#define GL_MAP_READ_BIT                                     0x0001
+#define GL_MAP_WRITE_BIT                                    0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT                         0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT                        0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT                           0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT                           0x0020
 #endif
-typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC) (GLenum mode);
+typedef GLvoid *(WINE_GLAPI *PGLFNMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);
+
+/* GL_ARB_multisample */
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+#define GL_MULTISAMPLE_ARB                                  0x809d
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB                     0x809e
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB                          0x809f
+#define GL_SAMPLE_COVERAGE_ARB                              0x80a0
+#define GL_SAMPLE_BUFFERS_ARB                               0x80a8
+#define GL_SAMPLES_ARB                                      0x80a9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB                        0x80aa
+#define GL_SAMPLE_COVERAGE_INVERT_ARB                       0x80ab
+#define GL_MULTISAMPLE_BIT_ARB                              0x20000000
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLSAMPLECOVERAGEARBPROC)(GLclampf value, GLboolean invert);
+
 /* GL_ARB_multitexture */
 #ifndef GL_ARB_multitexture
 #define GL_ARB_multitexture 1
-#define GL_TEXTURE0_ARB                   0x84C0
-#define GL_TEXTURE1_ARB                   0x84C1
-#define GL_TEXTURE2_ARB                   0x84C2
-#define GL_TEXTURE3_ARB                   0x84C3
-#define GL_TEXTURE4_ARB                   0x84C4
-#define GL_TEXTURE5_ARB                   0x84C5
-#define GL_TEXTURE6_ARB                   0x84C6
-#define GL_TEXTURE7_ARB                   0x84C7
-#define GL_TEXTURE8_ARB                   0x84C8
-#define GL_TEXTURE9_ARB                   0x84C9
-#define GL_TEXTURE10_ARB                  0x84CA
-#define GL_TEXTURE11_ARB                  0x84CB
-#define GL_TEXTURE12_ARB                  0x84CC
-#define GL_TEXTURE13_ARB                  0x84CD
-#define GL_TEXTURE14_ARB                  0x84CE
-#define GL_TEXTURE15_ARB                  0x84CF
-#define GL_TEXTURE16_ARB                  0x84D0
-#define GL_TEXTURE17_ARB                  0x84D1
-#define GL_TEXTURE18_ARB                  0x84D2
-#define GL_TEXTURE19_ARB                  0x84D3
-#define GL_TEXTURE20_ARB                  0x84D4
-#define GL_TEXTURE21_ARB                  0x84D5
-#define GL_TEXTURE22_ARB                  0x84D6
-#define GL_TEXTURE23_ARB                  0x84D7
-#define GL_TEXTURE24_ARB                  0x84D8
-#define GL_TEXTURE25_ARB                  0x84D9
-#define GL_TEXTURE26_ARB                  0x84DA
-#define GL_TEXTURE27_ARB                  0x84DB
-#define GL_TEXTURE28_ARB                  0x84DC
-#define GL_TEXTURE29_ARB                  0x84DD
-#define GL_TEXTURE30_ARB                  0x84DE
-#define GL_TEXTURE31_ARB                  0x84DF
-#define GL_ACTIVE_TEXTURE_ARB             0x84E0
-#define GL_CLIENT_ACTIVE_TEXTURE_ARB      0x84E1
-#define GL_MAX_TEXTURE_UNITS_ARB          0x84E2
+#define GL_TEXTURE0_ARB                                     0x84c0
+#define GL_TEXTURE1_ARB                                     0x84c1
+#define GL_TEXTURE2_ARB                                     0x84c2
+#define GL_TEXTURE3_ARB                                     0x84c3
+#define GL_TEXTURE4_ARB                                     0x84c4
+#define GL_TEXTURE5_ARB                                     0x84c5
+#define GL_TEXTURE6_ARB                                     0x84c6
+#define GL_TEXTURE7_ARB                                     0x84c7
+#define GL_TEXTURE8_ARB                                     0x84c8
+#define GL_TEXTURE9_ARB                                     0x84c9
+#define GL_TEXTURE10_ARB                                    0x84ca
+#define GL_TEXTURE11_ARB                                    0x84cb
+#define GL_TEXTURE12_ARB                                    0x84cc
+#define GL_TEXTURE13_ARB                                    0x84cd
+#define GL_TEXTURE14_ARB                                    0x84ce
+#define GL_TEXTURE15_ARB                                    0x84cf
+#define GL_TEXTURE16_ARB                                    0x84d0
+#define GL_TEXTURE17_ARB                                    0x84d1
+#define GL_TEXTURE18_ARB                                    0x84d2
+#define GL_TEXTURE19_ARB                                    0x84d3
+#define GL_TEXTURE20_ARB                                    0x84d4
+#define GL_TEXTURE21_ARB                                    0x84d5
+#define GL_TEXTURE22_ARB                                    0x84d6
+#define GL_TEXTURE23_ARB                                    0x84d7
+#define GL_TEXTURE24_ARB                                    0x84d8
+#define GL_TEXTURE25_ARB                                    0x84d9
+#define GL_TEXTURE26_ARB                                    0x84da
+#define GL_TEXTURE27_ARB                                    0x84db
+#define GL_TEXTURE28_ARB                                    0x84dc
+#define GL_TEXTURE29_ARB                                    0x84dd
+#define GL_TEXTURE30_ARB                                    0x84de
+#define GL_TEXTURE31_ARB                                    0x84df
+#define GL_ACTIVE_TEXTURE_ARB                               0x84e0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB                        0x84e1
+#define GL_MAX_TEXTURE_UNITS_ARB                            0x84e2
 #endif
-typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC)(GLenum target,
+        GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort *v);
 
-/* GL_ARB_texture_cube_map */
-#ifndef GL_ARB_texture_cube_map
-#define GL_ARB_texture_cube_map 1
-#define GL_NORMAL_MAP_ARB                   0x8511
-#define GL_REFLECTION_MAP_ARB               0x8512
-#define GL_TEXTURE_CUBE_MAP_ARB             0x8513
-#define GL_TEXTURE_BINDING_CUBE_MAP_ARB     0x8514
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB  0x8515
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB  0x8516
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB  0x8517
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB  0x8518
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB  0x8519
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB  0x851A
-#define GL_PROXY_TEXTURE_CUBE_MAP_ARB       0x851B
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB    0x851C
+/* GL_ARB_occlusion_query */
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+#define GL_SAMPLES_PASSED_ARB                               0x8914
+#define GL_QUERY_COUNTER_BITS_ARB                           0x8864
+#define GL_CURRENT_QUERY_ARB                                0x8865
+#define GL_QUERY_RESULT_ARB                                 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB                       0x8867
+#endif
+typedef void (WINE_GLAPI *PGLFNGENQUERIESARBPROC)(GLsizei n, GLuint *queries);
+typedef void (WINE_GLAPI *PGLFNDELETEQUERIESARBPROC)(GLsizei n, const GLuint *queries);
+typedef GLboolean (WINE_GLAPI *PGLFNISQUERYARBPROC)(GLuint query);
+typedef void (WINE_GLAPI *PGLFNBEGINQUERYARBPROC)(GLenum target, GLuint query);
+typedef void (WINE_GLAPI *PGLFNENDQUERYARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTIVARBPROC)(GLuint query, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTUIVARBPROC)(GLuint query, GLenum pname, GLuint *params);
+
+/* GL_ARB_pixel_buffer_object */
+#ifndef GL_ARB_pixel_buffer_object
+#define GL_ARB_pixel_buffer_object 1
+#define GL_PIXEL_PACK_BUFFER_ARB                            0x88eb
+#define GL_PIXEL_UNPACK_BUFFER_ARB                          0x88ec
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB                    0x88ed
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB                  0x88ef
 #endif
 
 /* GL_ARB_point_parameters */
 #ifndef GL_ARB_point_parameters
 #define GL_ARB_point_parameters 1
-#define GL_POINT_SIZE_MIN_ARB             0x8126
-#define GL_POINT_SIZE_MAX_ARB             0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_ARB  0x8128
-#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+#define GL_POINT_SIZE_MIN_ARB                               0x8126
+#define GL_POINT_SIZE_MAX_ARB                               0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB                    0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB                   0x8129
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat *params);
+
+/* GL_ARB_point_sprite */
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+#define GL_POINT_SPRITE_ARB                                 0x8861
+#define GL_COORD_REPLACE_ARB                                0x8862
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);
 
 /* GL_ARB_provoking_vertex */
 #ifndef GL_ARB_provoking_vertex
 #define GL_ARB_provoking_vertex 1
-#define GL_FIRST_VERTEX_CONVENTION                      0x8e4d
-#define GL_LAST_VERTEX_CONVENTION                       0x8e4e
-#define GL_PROVOKING_VERTEX                             0x8e4f
-#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION     0x8e4c
+#define GL_FIRST_VERTEX_CONVENTION                          0x8e4d
+#define GL_LAST_VERTEX_CONVENTION                           0x8e4e
+#define GL_PROVOKING_VERTEX                                 0x8e4f
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION         0x8e4c
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
+
+/* GL_ARB_shader_objects */
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+#define GL_PROGRAM_OBJECT_ARB                               0x8b40
+#define GL_OBJECT_TYPE_ARB                                  0x8b4e
+#define GL_OBJECT_SUBTYPE_ARB                               0x8b4f
+#define GL_OBJECT_DELETE_STATUS_ARB                         0x8b80
+#define GL_OBJECT_COMPILE_STATUS_ARB                        0x8b81
+#define GL_OBJECT_LINK_STATUS_ARB                           0x8b82
+#define GL_OBJECT_VALIDATE_STATUS_ARB                       0x8b83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB                       0x8b84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB                      0x8b85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB                       0x8b86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB             0x8b87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB                  0x8b88
+#define GL_SHADER_OBJECT_ARB                                0x8b48
+#define GL_FLOAT_VEC2_ARB                                   0x8b50
+#define GL_FLOAT_VEC3_ARB                                   0x8b51
+#define GL_FLOAT_VEC4_ARB                                   0x8b52
+#define GL_INT_VEC2_ARB                                     0x8b53
+#define GL_INT_VEC3_ARB                                     0x8b54
+#define GL_INT_VEC4_ARB                                     0x8b55
+#define GL_BOOL_ARB                                         0x8b56
+#define GL_BOOL_VEC2_ARB                                    0x8b57
+#define GL_BOOL_VEC3_ARB                                    0x8b58
+#define GL_BOOL_VEC4_ARB                                    0x8b59
+#define GL_FLOAT_MAT2_ARB                                   0x8b5a
+#define GL_FLOAT_MAT3_ARB                                   0x8b5b
+#define GL_FLOAT_MAT4_ARB                                   0x8b5c
+#define GL_SAMPLER_1D_ARB                                   0x8b5d
+#define GL_SAMPLER_2D_ARB                                   0x8b5e
+#define GL_SAMPLER_3D_ARB                                   0x8b5f
+#define GL_SAMPLER_CUBE_ARB                                 0x8b60
+#define GL_SAMPLER_1D_SHADOW_ARB                            0x8b61
+#define GL_SAMPLER_2D_SHADOW_ARB                            0x8b62
+#define GL_SAMPLER_2D_RECT_ARB                              0x8b63
+#define GL_SAMPELR_2D_RECT_SHADOW_ARB                       0x8b64
+#endif
+
+/* GL_ARB_shading_language_100 */
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+#define GL_SHADING_LANGUAGE_VERSION_ARB                     0x8b8c
+#endif
+
+/* GL_ARB_sync */
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#define GL_MAX_SERVER_WAIT_TIMEOUT              0x9111
+#define GL_OBJECT_TYPE                          0x9112
+#define GL_SYNC_CONDITION                       0x9113
+#define GL_SYNC_STATUS                          0x9114
+#define GL_SYNC_FLAGS                           0x9115
+#define GL_SYNC_FENCE                           0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE           0x9117
+#define GL_UNSIGNALED                           0x9118
+#define GL_SIGNALED                             0x9119
+#define GL_SYNC_FLUSH_COMMANDS_BIT              0x00000001
+#define GL_TIMEOUT_IGNORED                      0xffffffffffffffffULL
+#define GL_ALREADY_SIGNALED                     0x911a
+#define GL_TIMEOUT_EXPIRED                      0x911b
+#define GL_CONDITION_SATISFIED                  0x911c
+#define GL_WAIT_FAILED                          0x911d
+#endif
+typedef GLsync (WINE_GLAPI *PGLFNFENCESYNCPROC)(GLenum condition, GLbitfield flags);
+typedef GLboolean (WINE_GLAPI *PGLFNISSYNCPROC)(GLsync sync);
+typedef GLvoid (WINE_GLAPI *PGLFNDELETESYNCPROC)(GLsync sync);
+typedef GLenum (WINE_GLAPI *PGLFNCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGER64VPROC)(GLenum pname, GLint64 *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufsize,
+        GLsizei *length, GLint *values);
+
+/* GL_ARB_texture_border_clamp */
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_ARB                              0x812d
+#endif
+
+/* GL_ARB_texture_cube_map */
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+#define GL_NORMAL_MAP_ARB                                   0x8511
+#define GL_REFLECTION_MAP_ARB                               0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB                             0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB                     0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB                  0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB                  0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB                  0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB                  0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB                  0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB                  0x851a
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB                       0x851b
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB                    0x851c
+#endif
+
+/* GL_ARB_texture_env_dot3 */
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+#define GL_DOT3_RGB_ARB                                     0x86ae
+#define GL_DOT3_RGBA_ARB                                    0x86af
+#endif
+
+/* GL_ARB_texture_float */
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+#define GL_RGBA32F_ARB                                      0x8814
+#define GL_RGB32F_ARB                                       0x8815
+#define GL_RGBA16F_ARB                                      0x881a
+#define GL_RGB16F_ARB                                       0x881b
+#endif
+
+/* GL_ARB_texture_mirrored_repeat */
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+#define GL_MIRRORED_REPEAT_ARB                              0x8370
+#endif
+
+/* GL_ARB_texture_rectangle */
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_ARB                            0x84f5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB                    0x84f6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB                      0x84f7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB                   0x84f8
+#define GL_SAMPLER_2D_RECT_ARB                              0x8b63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB                       0x8b64
+#endif
+
+/* GL_ARB_texture_rg */
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+#define GL_RG                                               0x8227
+#define GL_RG_INTEGER                                       0x8228
+#define GL_R8                                               0x8229
+#define GL_R16                                              0x822a
+#define GL_RG8                                              0x822b
+#define GL_RG16                                             0x822c
+#define GL_R16F                                             0x822d
+#define GL_R32F                                             0x822e
+#define GL_RG16F                                            0x822f
+#define GL_RG32F                                            0x8230
+#define GL_R8I                                              0x8231
+#define GL_R8UI                                             0x8232
+#define GL_R16I                                             0x8233
+#define GL_R16UI                                            0x8234
+#define GL_R32I                                             0x8235
+#define GL_R32UI                                            0x8236
+#define GL_RG8I                                             0x8237
+#define GL_RG8UI                                            0x8238
+#define GL_RG16I                                            0x8239
+#define GL_RG16UI                                           0x823a
+#define GL_RG32I                                            0x823b
+#define GL_RG32UI                                           0x823c
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
 
 /* GL_ARB_vertex_blend */
 #ifndef GL_ARB_vertex_blend
 #define GL_ARB_vertex_blend 1
-#define GL_MAX_VERTEX_UNITS_ARB           0x86A4
-#define GL_ACTIVE_VERTEX_UNITS_ARB        0x86A5
-#define GL_WEIGHT_SUM_UNITY_ARB           0x86A6
-#define GL_VERTEX_BLEND_ARB               0x86A7
-#define GL_CURRENT_WEIGHT_ARB             0x86A8
-#define GL_WEIGHT_ARRAY_TYPE_ARB          0x86A9
-#define GL_WEIGHT_ARRAY_STRIDE_ARB        0x86AA
-#define GL_WEIGHT_ARRAY_SIZE_ARB          0x86AB
-#define GL_WEIGHT_ARRAY_POINTER_ARB       0x86AC
-#define GL_WEIGHT_ARRAY_ARB               0x86AD
-#define GL_MODELVIEW0_ARB                 0x1700
-#define GL_MODELVIEW1_ARB                 0x850A
-#define GL_MODELVIEW2_ARB                 0x8722
-#define GL_MODELVIEW3_ARB                 0x8723
-#define GL_MODELVIEW4_ARB                 0x8724
-#define GL_MODELVIEW5_ARB                 0x8725
-#define GL_MODELVIEW6_ARB                 0x8726
-#define GL_MODELVIEW7_ARB                 0x8727
-#define GL_MODELVIEW8_ARB                 0x8728
-#define GL_MODELVIEW9_ARB                 0x8729
-#define GL_MODELVIEW10_ARB                0x872A
-#define GL_MODELVIEW11_ARB                0x872B
-#define GL_MODELVIEW12_ARB                0x872C
-#define GL_MODELVIEW13_ARB                0x872D
-#define GL_MODELVIEW14_ARB                0x872E
-#define GL_MODELVIEW15_ARB                0x872F
-#define GL_MODELVIEW16_ARB                0x8730
-#define GL_MODELVIEW17_ARB                0x8731
-#define GL_MODELVIEW18_ARB                0x8732
-#define GL_MODELVIEW19_ARB                0x8733
-#define GL_MODELVIEW20_ARB                0x8734
-#define GL_MODELVIEW21_ARB                0x8735
-#define GL_MODELVIEW22_ARB                0x8736
-#define GL_MODELVIEW23_ARB                0x8737
-#define GL_MODELVIEW24_ARB                0x8738
-#define GL_MODELVIEW25_ARB                0x8739
-#define GL_MODELVIEW26_ARB                0x873A
-#define GL_MODELVIEW27_ARB                0x873B
-#define GL_MODELVIEW28_ARB                0x873C
-#define GL_MODELVIEW29_ARB                0x873D
-#define GL_MODELVIEW30_ARB                0x873E
-#define GL_MODELVIEW31_ARB                0x873F
+#define GL_MAX_VERTEX_UNITS_ARB                             0x86a4
+#define GL_ACTIVE_VERTEX_UNITS_ARB                          0x86a5
+#define GL_WEIGHT_SUM_UNITY_ARB                             0x86a6
+#define GL_VERTEX_BLEND_ARB                                 0x86a7
+#define GL_CURRENT_WEIGHT_ARB                               0x86a8
+#define GL_WEIGHT_ARRAY_TYPE_ARB                            0x86a9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB                          0x86aa
+#define GL_WEIGHT_ARRAY_SIZE_ARB                            0x86ab
+#define GL_WEIGHT_ARRAY_POINTER_ARB                         0x86ac
+#define GL_WEIGHT_ARRAY_ARB                                 0x86ad
+#define GL_MODELVIEW0_ARB                                   0x1700
+#define GL_MODELVIEW1_ARB                                   0x850a
+#define GL_MODELVIEW2_ARB                                   0x8722
+#define GL_MODELVIEW3_ARB                                   0x8723
+#define GL_MODELVIEW4_ARB                                   0x8724
+#define GL_MODELVIEW5_ARB                                   0x8725
+#define GL_MODELVIEW6_ARB                                   0x8726
+#define GL_MODELVIEW7_ARB                                   0x8727
+#define GL_MODELVIEW8_ARB                                   0x8728
+#define GL_MODELVIEW9_ARB                                   0x8729
+#define GL_MODELVIEW10_ARB                                  0x872a
+#define GL_MODELVIEW11_ARB                                  0x872b
+#define GL_MODELVIEW12_ARB                                  0x872c
+#define GL_MODELVIEW13_ARB                                  0x872d
+#define GL_MODELVIEW14_ARB                                  0x872e
+#define GL_MODELVIEW15_ARB                                  0x872f
+#define GL_MODELVIEW16_ARB                                  0x8730
+#define GL_MODELVIEW17_ARB                                  0x8731
+#define GL_MODELVIEW18_ARB                                  0x8732
+#define GL_MODELVIEW19_ARB                                  0x8733
+#define GL_MODELVIEW20_ARB                                  0x8734
+#define GL_MODELVIEW21_ARB                                  0x8735
+#define GL_MODELVIEW22_ARB                                  0x8736
+#define GL_MODELVIEW23_ARB                                  0x8737
+#define GL_MODELVIEW24_ARB                                  0x8738
+#define GL_MODELVIEW25_ARB                                  0x8739
+#define GL_MODELVIEW26_ARB                                  0x873a
+#define GL_MODELVIEW27_ARB                                  0x873b
+#define GL_MODELVIEW28_ARB                                  0x873c
+#define GL_MODELVIEW29_ARB                                  0x873d
+#define GL_MODELVIEW30_ARB                                  0x873e
+#define GL_MODELVIEW31_ARB                                  0x873f
 #endif
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTPOINTERARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTBV) (GLint size, const GLbyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTSV) (GLint size, const GLshort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTIV) (GLint size, const GLint *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTFV) (GLint size, const GLfloat *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTDV) (GLint size, const GLdouble *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUBV) (GLint size, const GLubyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUSV) (GLint size, const GLushort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUIV) (GLint size, const GLuint *weights);
-typedef void (WINE_GLAPI * PGLFNGLVERTEXBLENDARB) (GLint count);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_ARB_pixel_buffer_object 1
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTPOINTERARB)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTBV)(GLint size, const GLbyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTSV)(GLint size, const GLshort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTIV)(GLint size, const GLint *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTFV)(GLint size, const GLfloat *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTDV)(GLint size, const GLdouble *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUBV)(GLint size, const GLubyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUSV)(GLint size, const GLushort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUIV)(GLint size, const GLuint *weights);
+typedef void (WINE_GLAPI *PGLFNGLVERTEXBLENDARB)(GLint count);
+
+/* GL_ARB_vertex_buffer_object */
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+#define GL_BUFFER_SIZE_ARB                                  0x8764
+#define GL_BUFFER_USAGE_ARB                                 0x8765
+#define GL_ARRAY_BUFFER_ARB                                 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB                         0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB                         0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB                 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB                  0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB                  0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB                   0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB                   0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB           0x889a
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB               0x889b
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB         0x889c
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB          0x889d
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB                  0x889e
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB           0x889f
+#define GL_READ_ONLY_ARB                                    0x88b8
+#define GL_WRITE_ONLY_ARB                                   0x88b9
+#define GL_READ_WRITE_ARB                                   0x88ba
+#define GL_BUFFER_ACCESS_ARB                                0x88bb
+#define GL_BUFFER_MAPPED_ARB                                0x88bc
+#define GL_BUFFER_MAP_POINTER_ARB                           0x88bd
+#define GL_STREAM_DRAW_ARB                                  0x88e0
+#define GL_STREAM_READ_ARB                                  0x88e1
+#define GL_STREAM_COPY_ARB                                  0x88e2
+#define GL_STATIC_DRAW_ARB                                  0x88e4
+#define GL_STATIC_READ_ARB                                  0x88e5
+#define GL_STATIC_COPY_ARB                                  0x88e6
+#define GL_DYNAMIC_DRAW_ARB                                 0x88e8
+#define GL_DYNAMIC_READ_ARB                                 0x88e9
+#define GL_DYNAMIC_COPY_ARB                                 0x88ea
+#endif
+typedef void (WINE_GLAPI *PGLFNBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNDELETEBUFFERSARBPROC)(GLsizei n, const GLuint *buffers);
+typedef void (WINE_GLAPI *PGLFNGENBUFFERSARBPROC)(GLsizei n, GLuint *buffers);
+typedef GLboolean (WINE_GLAPI *PGLFNISBUFFERARBPROC)(GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNBUFFERDATAARBPROC)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+typedef void (WINE_GLAPI *PGLFNBUFFERSUBDATAARBPROC)(GLenum target,
+        GLintptr offset, GLsizeiptr size, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+typedef GLvoid* (WINE_GLAPI *PGLFNMAPBUFFERARBPROC)(GLenum  target, GLenum access);
+typedef GLboolean (WINE_GLAPI *PGLFNUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, GLvoid* *params);
+
+/* GL_ARB_vertex_program */
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+#define GL_VERTEX_PROGRAM_ARB                               0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB                    0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB                      0x8643
+#define GL_COLOR_SUM_ARB                                    0x8458
+#define GL_PROGRAM_FORMAT_ASCII_ARB                         0x8875
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB                  0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB                     0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB                   0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB                     0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB               0x886a
+#define GL_CURRENT_VERTEX_ATTRIB_ARB                        0x8626
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB                  0x8645
+#define GL_PROGRAM_LENGTH_ARB                               0x8627
+#define GL_PROGRAM_FORMAT_ARB                               0x8876
+#define GL_PROGRAM_BINDING_ARB                              0x8677
+#define GL_PROGRAM_INSTRUCTIONS_ARB                         0x88a0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB                     0x88a1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB                  0x88a2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB              0x88a3
+#define GL_PROGRAM_TEMPORARIES_ARB                          0x88a4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB                      0x88a5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB                   0x88a6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB               0x88a7
+#define GL_PROGRAM_PARAMETERS_ARB                           0x88a8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB                       0x88a9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB                    0x88aa
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB                0x88ab
+#define GL_PROGRAM_ATTRIBS_ARB                              0x88ac
+#define GL_MAX_PROGRAM_ATTRIBS_ARB                          0x88ad
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB                       0x88ae
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB                   0x88af
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB                    0x88b0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB                0x88b1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB             0x88b2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB         0x88b3
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB                 0x88b4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB                   0x88b5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB                  0x88b6
+#define GL_PROGRAM_STRING_ARB                               0x8628
+#define GL_PROGRAM_ERROR_POSITION_ARB                       0x864b
+#define GL_CURRENT_MATRIX_ARB                               0x8641
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB                     0x88b7
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB                   0x8640
+#define GL_MAX_VERTEX_ATTRIBS_ARB                           0x8869
+#define GL_MAX_PROGRAM_MATRICES_ARB                         0x862f
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB               0x862e
+#define GL_PROGRAM_ERROR_STRING_ARB                         0x8874
+#define GL_MATRIX0_ARB                                      0x88c0
+#define GL_MATRIX1_ARB                                      0x88c1
+#define GL_MATRIX2_ARB                                      0x88c2
+#define GL_MATRIX3_ARB                                      0x88c3
+#define GL_MATRIX4_ARB                                      0x88c4
+#define GL_MATRIX5_ARB                                      0x88c5
+#define GL_MATRIX6_ARB                                      0x88c6
+#define GL_MATRIX7_ARB                                      0x88c7
+#define GL_MATRIX8_ARB                                      0x88c8
+#define GL_MATRIX9_ARB                                      0x88c9
+#define GL_MATRIX10_ARB                                     0x88ca
+#define GL_MATRIX11_ARB                                     0x88cb
+#define GL_MATRIX12_ARB                                     0x88cc
+#define GL_MATRIX13_ARB                                     0x88cd
+#define GL_MATRIX14_ARB                                     0x88ce
+#define GL_MATRIX15_ARB                                     0x88cf
+#define GL_MATRIX16_ARB                                     0x88d0
+#define GL_MATRIX17_ARB                                     0x88d1
+#define GL_MATRIX18_ARB                                     0x88d2
+#define GL_MATRIX19_ARB                                     0x88d3
+#define GL_MATRIX20_ARB                                     0x88d4
+#define GL_MATRIX21_ARB                                     0x88d5
+#define GL_MATRIX22_ARB                                     0x88d6
+#define GL_MATRIX23_ARB                                     0x88d7
+#define GL_MATRIX24_ARB                                     0x88d8
+#define GL_MATRIX25_ARB                                     0x88d9
+#define GL_MATRIX26_ARB                                     0x88da
+#define GL_MATRIX27_ARB                                     0x88db
+#define GL_MATRIX28_ARB                                     0x88dc
+#define GL_MATRIX29_ARB                                     0x88dd
+#define GL_MATRIX30_ARB                                     0x88de
+#define GL_MATRIX31_ARB                                     0x88df
+#endif
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size,
+        GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNGENPROGRAMSARBPROC)(GLsizei n, GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DARBPROC)(GLenum target,
+        GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FARBPROC)(GLenum target,
+        GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target,
+        GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target,
+        GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMARBPROC)(GLuint program);
+
+/* GL_ARB_vertex_shader */
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+#define GL_VERTEX_SHADER_ARB                                0x8b31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB                0x8b4a
+#define GL_MAX_VARYING_FLOATS_ARB                           0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB               0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB             0x8b4d
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB                     0x8b89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB           0x8b8a
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat *params);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index,
+        GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FARBPROC)(GLint location,
+        GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETINFOLOGARBPROC)(GLhandleARB obj,
+        GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef void (WINE_GLAPI *WINED3D_PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj,
+        GLsizei count, const GLcharARB* *string, const GLint *length);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef void (WINE_GLAPI *WINED3D_PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj,
+        GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj,
+        GLsizei maxLength, GLsizei *length, GLcharARB *source);
+typedef void (WINE_GLAPI *WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj,
+        GLuint index, const GLcharARB *name);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+
+/* GL_ATI_fragment_shader */
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ATI                              0x8920
+#define GL_REG_0_ATI                                        0x8921
+#define GL_REG_1_ATI                                        0x8922
+#define GL_REG_2_ATI                                        0x8923
+#define GL_REG_3_ATI                                        0x8924
+#define GL_REG_4_ATI                                        0x8925
+#define GL_REG_5_ATI                                        0x8926
+#define GL_CON_0_ATI                                        0x8941
+#define GL_CON_1_ATI                                        0x8942
+#define GL_CON_2_ATI                                        0x8943
+#define GL_CON_3_ATI                                        0x8944
+#define GL_CON_4_ATI                                        0x8945
+#define GL_CON_5_ATI                                        0x8946
+#define GL_CON_6_ATI                                        0x8947
+#define GL_CON_7_ATI                                        0x8948
+#define GL_MOV_ATI                                          0x8961
+#define GL_ADD_ATI                                          0x8963
+#define GL_MUL_ATI                                          0x8964
+#define GL_SUB_ATI                                          0x8965
+#define GL_DOT3_ATI                                         0x8966
+#define GL_DOT4_ATI                                         0x8967
+#define GL_MAD_ATI                                          0x8968
+#define GL_LERP_ATI                                         0x8969
+#define GL_CND_ATI                                          0x896a
+#define GL_CND0_ATI                                         0x896b
+#define GL_DOT2_ADD_ATI                                     0x896c
+#define GL_SECONDARY_INTERPOLATOR_ATI                       0x896d
+#define GL_SWIZZLE_STR_ATI                                  0x8976
+#define GL_SWIZZLE_STQ_ATI                                  0x8977
+#define GL_SWIZZLE_STR_DR_ATI                               0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI                               0x8979
+#define GL_RED_BIT_ATI                                      0x00000001
+#define GL_GREEN_BIT_ATI                                    0x00000002
+#define GL_BLUE_BIT_ATI                                     0x00000004
+#define GL_2X_BIT_ATI                                       0x00000001
+#define GL_4X_BIT_ATI                                       0x00000002
+#define GL_8X_BIT_ATI                                       0x00000004
+#define GL_HALF_BIT_ATI                                     0x00000008
+#define GL_QUARTER_BIT_ATI                                  0x00000010
+#define GL_EIGHTH_BIT_ATI                                   0x00000020
+#define GL_SATURATE_BIT_ATI                                 0x00000040
+#define GL_COMP_BIT_ATI                                     0x00000002
+#define GL_NEGATE_BIT_ATI                                   0x00000004
+#define GL_BIAS_BIT_ATI                                     0x00000008
+#endif
+typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI)(GLuint range);
+typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI)(GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI)(GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep,
+        GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
+        GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep,
+        GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
+        GLuint arg2Mod, GLuint arg3, GLuint arg3Rep,
+        GLuint arg3Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+        GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+        GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
+        GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI)(GLuint dst, const GLfloat *value);
+
+/* GL_ATI_separate_stencil */
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+#define GL_STENCIL_BACK_FUNC_ATI                            0x8800
+#define GL_STENCIL_BACK_FAIL_ATI                            0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI                 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI                 0x8803
+#endif
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEATIPROC)(GLenum, GLenum, GLenum, GLenum);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEATIPROC)(GLenum, GLenum, GLint, GLuint);
+
+/* GL_ATI_texture_compression_3dc */
+#ifndef GL_ATI_texture_compression_3dc
+#define GL_ATI_texture_compression_3dc 1
+#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI               0x8837
+#endif
+
+/* GL_ATI_texture_env_combine3 */
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+#define GL_MODULATE_ADD_ATI                                 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI                          0x8745
+#define GL_MODULATE_SUBTRACT_ATI                            0x8746
+/* #define ONE */
+/* #define ZERO */
 #endif
-#define GL_PIXEL_PACK_BUFFER_ARB               0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB             0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB       0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB     0x88EF
-/* GL_EXT_framebuffer_object */
-#ifndef GL_EXT_framebuffer_object
-#define GL_EXT_framebuffer_object 1
-#define GL_FRAMEBUFFER_EXT                     0x8D40
-#define GL_RENDERBUFFER_EXT                    0x8D41
-#define GL_STENCIL_INDEX1_EXT                  0x8D46
-#define GL_STENCIL_INDEX4_EXT                  0x8D47
-#define GL_STENCIL_INDEX8_EXT                  0x8D48
-#define GL_STENCIL_INDEX16_EXT                 0x8D49
-#define GL_RENDERBUFFER_WIDTH_EXT              0x8D42
-#define GL_RENDERBUFFER_HEIGHT_EXT             0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT    0x8D44
-#define GL_RENDERBUFFER_RED_SIZE_EXT           0x8D50
-#define GL_RENDERBUFFER_GREEN_SIZE_EXT         0x8D51
-#define GL_RENDERBUFFER_BLUE_SIZE_EXT          0x8D52
-#define GL_RENDERBUFFER_ALPHA_SIZE_EXT         0x8D53
-#define GL_RENDERBUFFER_DEPTH_SIZE_EXT         0x8D54
-#define GL_RENDERBUFFER_STENCIL_SIZE_EXT       0x8D55
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT            0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT            0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT          0x8CD2
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT  0x8CD3
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT     0x8CD4
-#define GL_COLOR_ATTACHMENT0_EXT                0x8CE0
-#define GL_COLOR_ATTACHMENT1_EXT                0x8CE1
-#define GL_COLOR_ATTACHMENT2_EXT                0x8CE2
-#define GL_COLOR_ATTACHMENT3_EXT                0x8CE3
-#define GL_COLOR_ATTACHMENT4_EXT                0x8CE4
-#define GL_COLOR_ATTACHMENT5_EXT                0x8CE5
-#define GL_COLOR_ATTACHMENT6_EXT                0x8CE6
-#define GL_COLOR_ATTACHMENT7_EXT                0x8CE7
-#define GL_COLOR_ATTACHMENT8_EXT                0x8CE8
-#define GL_COLOR_ATTACHMENT9_EXT                0x8CE9
-#define GL_COLOR_ATTACHMENT10_EXT               0x8CEA
-#define GL_COLOR_ATTACHMENT11_EXT               0x8CEB
-#define GL_COLOR_ATTACHMENT12_EXT               0x8CEC
-#define GL_COLOR_ATTACHMENT13_EXT               0x8CED
-#define GL_COLOR_ATTACHMENT14_EXT               0x8CEE
-#define GL_COLOR_ATTACHMENT15_EXT               0x8CEF
-#define GL_DEPTH_ATTACHMENT_EXT                 0x8D00
-#define GL_STENCIL_ATTACHMENT_EXT               0x8D20
-#define GL_FRAMEBUFFER_COMPLETE_EXT                          0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT             0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT     0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT             0x8CD9
-#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT                0x8CDA
-#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT            0x8CDB
-#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT            0x8CDC
-#define GL_FRAMEBUFFER_UNSUPPORTED_EXT                       0x8CDD
-#define GL_FRAMEBUFFER_BINDING_EXT             0x8CA6
-#define GL_RENDERBUFFER_BINDING_EXT            0x8CA7
-#define GL_MAX_COLOR_ATTACHMENTS_EXT           0x8CDF
-#define GL_MAX_RENDERBUFFER_SIZE_EXT           0x84E8
-#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT   0x0506
 
+/* GL_ATI_texture_mirror_once */
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+#define GL_MIRROR_CLAMP_ATI                                 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI                         0x8743
+#endif
+
+/* GL_EXT_blend_equation_separate */
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+
+/* GL_EXT_blend_func_separate */
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+#define GL_BLEND_DST_RGB_EXT                                0x80c8
+#define GL_BLEND_SRC_RGB_EXT                                0x80c9
+#define GL_BLEND_DST_ALPHA_EXT                              0x80ca
+#define GL_BLEND_SRC_ALPHA_EXT                              0x80cb
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB,
+        GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+/* GL_EXT_fog_coord */
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+#define GL_FOG_COORDINATE_SOURCE_EXT                        0x8450
+#define GL_FOG_COORDINATE_EXT                               0x8451
+#define GL_FRAGMENT_DEPTH_EXT                               0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT                       0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT                    0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT                  0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT                 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT                         0x8457
 #endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFEXTPROC)(GLfloat coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFVEXTPROC)(const GLfloat *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDEXTPROC)(GLdouble coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDVEXTPROC)(const GLdouble *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, GLvoid *data);
+
 /* GL_EXT_framebuffer_blit */
 #ifndef GL_EXT_framebuffer_blit
 #define GL_EXT_framebuffer_blit 1
-#define GL_READ_FRAMEBUFFER_EXT                0x8CA8
-#define GL_DRAW_FRAMEBUFFER_EXT                0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_EXT        0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT                             0x8ca8
+#define GL_DRAW_FRAMEBUFFER_EXT                             0x8ca9
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT                     0x8ca6
+#define GL_READ_FRAMEBUFFER_BINDING_EXT                     0x8caa
 #endif
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
 
 /* GL_EXT_framebuffer_multisample */
 #ifndef GL_EXT_framebuffer_multisample
 #define GL_EXT_framebuffer_multisample 1
-#define GL_RENDERBUFFER_SAMPLES_EXT                 0x8cab
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT   0x8d56
-#define GL_MAX_SAMPLES_EXT                          0x8d57
+#define GL_RENDERBUFFER_SAMPLES_EXT                         0x8cab
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT           0x8d56
+#define GL_MAX_SAMPLES_EXT                                  0x8d57
+#endif
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples,
+        GLenum internalformat, GLsizei width, GLsizei height);
+
+/* GL_EXT_framebuffer_object */
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 1
+#define GL_FRAMEBUFFER_EXT                                  0x8d40
+#define GL_RENDERBUFFER_EXT                                 0x8d41
+#define GL_STENCIL_INDEX1_EXT                               0x8d46
+#define GL_STENCIL_INDEX4_EXT                               0x8d47
+#define GL_STENCIL_INDEX8_EXT                               0x8d48
+#define GL_STENCIL_INDEX16_EXT                              0x8d49
+#define GL_RENDERBUFFER_WIDTH_EXT                           0x8d42
+#define GL_RENDERBUFFER_HEIGHT_EXT                          0x8d43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT                 0x8d44
+#define GL_RENDERBUFFER_RED_SIZE_EXT                        0x8d50
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT                      0x8d51
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT                       0x8d52
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT                      0x8d53
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT                      0x8d54
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT                    0x8d55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT           0x8cd0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT           0x8cd1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT         0x8cd2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8cd3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT    0x8cd4
+#define GL_COLOR_ATTACHMENT0_EXT                            0x8ce0
+#define GL_COLOR_ATTACHMENT1_EXT                            0x8ce1
+#define GL_COLOR_ATTACHMENT2_EXT                            0x8ce2
+#define GL_COLOR_ATTACHMENT3_EXT                            0x8ce3
+#define GL_COLOR_ATTACHMENT4_EXT                            0x8ce4
+#define GL_COLOR_ATTACHMENT5_EXT                            0x8ce5
+#define GL_COLOR_ATTACHMENT6_EXT                            0x8ce6
+#define GL_COLOR_ATTACHMENT7_EXT                            0x8ce7
+#define GL_COLOR_ATTACHMENT8_EXT                            0x8ce8
+#define GL_COLOR_ATTACHMENT9_EXT                            0x8ce9
+#define GL_COLOR_ATTACHMENT10_EXT                           0x8cea
+#define GL_COLOR_ATTACHMENT11_EXT                           0x8ceb
+#define GL_COLOR_ATTACHMENT12_EXT                           0x8cec
+#define GL_COLOR_ATTACHMENT13_EXT                           0x8ced
+#define GL_COLOR_ATTACHMENT14_EXT                           0x8cee
+#define GL_COLOR_ATTACHMENT15_EXT                           0x8cef
+#define GL_DEPTH_ATTACHMENT_EXT                             0x8d00
+#define GL_STENCIL_ATTACHMENT_EXT                           0x8d20
+#define GL_FRAMEBUFFER_COMPLETE_EXT                         0x8cd5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT            0x8cd6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT    0x8cd7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT            0x8cd9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT               0x8cda
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT           0x8cdb
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT           0x8cdc
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT                      0x8cdd
+#define GL_FRAMEBUFFER_BINDING_EXT                          0x8ca6
+#define GL_RENDERBUFFER_BINDING_EXT                         0x8ca7
+#define GL_MAX_COLOR_ATTACHMENTS_EXT                        0x8cdF
+#define GL_MAX_RENDERBUFFER_SIZE_EXT                        0x84e8
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT                0x0506
+#endif
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target,
+        GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment,
+        GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target,
+        GLenum attachment, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+
+/* GL_EXT_gpu_program_parameters */
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 1
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETERS4FVEXTPROC)(GLenum target,
+        GLuint index, GLsizei count, const float *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLenum target,
+        GLuint index, GLsizei count, const float *params);
+#endif
+
+/* GL_EXT_gpu_shader4 */
+#ifndef GL_EXT_gpu_shader4
+#define GL_EXT_gpu_shader4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT                  0x88fd
+#define GL_SAMPLER_1D_ARRAY_EXT                             0x8dc0
+#define GL_SAMPLER_2D_ARRAY_EXT                             0x8dc1
+#define GL_SAMPLER_BUFFER_EXT                               0x8dc2
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT                      0x8dc3
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT                      0x8dc4
+#define GL_SAMPLER_CUBE_SHADOW_EXT                          0x8dc5
+#define GL_UNSIGNED_INT_VEC2_EXT                            0x8dc6
+#define GL_UNSIGNED_INT_VEC3_EXT                            0x8dc7
+#define GL_UNSIGNED_INT_VEC4_EXT                            0x8dc8
+#define GL_INT_SAMPLER_1D_EXT                               0x8dc9
+#define GL_INT_SAMPLER_2D_EXT                               0x8dca
+#define GL_INT_SAMPLER_3D_EXT                               0x8dcb
+#define GL_INT_SAMPLER_CUBE_EXT                             0x8dcc
+#define GL_INT_SAMPLER_2D_RECT_EXT                          0x8dcd
+#define GL_INT_SAMPLER_1D_ARRAY_EXT                         0x8dce
+#define GL_INT_SAMPLER_2D_ARRAY_EXT                         0x8dcf
+#define GL_INT_SAMPLER_BUFFER_EXT                           0x8dd0
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT                      0x8dd1
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT                      0x8dd2
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT                      0x8dd3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT                    0x8dd4
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT                 0x8dd5
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT                0x8dd6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT                0x8dd7
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT                  0x8dd8
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT                     0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT                     0x8905
 #endif
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type,
+        GLsizei stride, const GLvoid *pointer);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIEXTPROC)(GLint location, GLuint v0);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, const GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color_number, const GLchar *name);
+typedef GLint (WINE_GLAPI *PGLFNGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar *name);
 
 /* GL_EXT_packed_depth_stencil */
 #ifndef GL_EXT_packed_depth_stencil
 #define GL_EXT_packed_depth_stencil 1
-#define GL_DEPTH_STENCIL_EXT                0x84f9
-#define GL_UNSIGNED_INT_24_8_EXT            0x84fa
-#define GL_DEPTH24_STENCIL8_EXT             0x88f0
-#define GL_TEXTURE_STENCIL_SIZE_EXT         0x88f1
+#define GL_DEPTH_STENCIL_EXT                                0x84f9
+#define GL_UNSIGNED_INT_24_8_EXT                            0x84fa
+#define GL_DEPTH24_STENCIL8_EXT                             0x88f0
+#define GL_TEXTURE_STENCIL_SIZE_EXT                         0x88f1
 #endif
 
-/* GL_EXT_secondary_color */
-#ifndef GL_EXT_secondary_color
-#define GL_EXT_secondary_color 1
-#define GL_COLOR_SUM_EXT                     0x8458
-#define GL_CURRENT_SECONDARY_COLOR_EXT       0x8459
-#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT    0x845A
-#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT    0x845B
-#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT  0x845C
-#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
-#define GL_SECONDARY_COLOR_ARRAY_EXT         0x845E
-#endif
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
 /* GL_EXT_paletted_texture */
 #ifndef GL_EXT_paletted_texture
 #define GL_EXT_paletted_texture 1
-#define GL_COLOR_INDEX1_EXT               0x80E2
-#define GL_COLOR_INDEX2_EXT               0x80E3
-#define GL_COLOR_INDEX4_EXT               0x80E4
-#define GL_COLOR_INDEX8_EXT               0x80E5
-#define GL_COLOR_INDEX12_EXT              0x80E6
-#define GL_COLOR_INDEX16_EXT              0x80E7
-#define GL_TEXTURE_INDEX_SIZE_EXT         0x80ED
+#define GL_COLOR_INDEX1_EXT                                 0x80e2
+#define GL_COLOR_INDEX2_EXT                                 0x80e3
+#define GL_COLOR_INDEX4_EXT                                 0x80e4
+#define GL_COLOR_INDEX8_EXT                                 0x80e5
+#define GL_COLOR_INDEX12_EXT                                0x80e6
+#define GL_COLOR_INDEX16_EXT                                0x80e7
+#define GL_TEXTURE_INDEX_SIZE_EXT                           0x80ed
 #endif
-typedef void (WINE_GLAPI * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+typedef void (WINE_GLAPI *PGLFNGLCOLORTABLEEXTPROC)(GLenum target, GLenum internalFormat,
+        GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
 /* GL_EXT_point_parameters */
 #ifndef GL_EXT_point_parameters
 #define GL_EXT_point_parameters 1
-#define GL_POINT_SIZE_MIN_EXT             0x8126
-#define GL_POINT_SIZE_MAX_EXT             0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_EXT  0x8128
-#define GL_DISTANCE_ATTENUATION_EXT       0x8129
+#define GL_POINT_SIZE_MIN_EXT                               0x8126
+#define GL_POINT_SIZE_MAX_EXT                               0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT                    0x8128
+#define GL_DISTANCE_ATTENUATION_EXT                         0x8129
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const GLfloat *params);
 
 /* GL_EXT_provoking_vertex */
 #ifndef GL_EXT_provoking_vertex
@@ -2109,2025 +3196,1304 @@ typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const
 #define GL_PROVOKING_VERTEX_EXT                             0x8e4f
 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT     0x8e4c
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+
+/* GL_EXT_secondary_color */
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+#define GL_COLOR_SUM_EXT                                    0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT                      0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT                   0x845a
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT                   0x845b
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT                 0x845c
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT                0x845d
+#define GL_SECONDARY_COLOR_ARRAY_EXT                        0x845e
+#endif
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type,
+        GLsizei stride, const GLvoid *pointer);
+
+/* GL_EXT_stencil_two_side */
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+#define GL_STENCIL_TEST_TWO_SIDE_EXT                        0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT                          0x8911
+#endif
+typedef void (WINE_GLAPI *PGLFNACTIVESTENCILFACEEXTPROC)(GLenum face);
+
+/* GL_EXT_stencil_wrap */
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+#define GL_INCR_WRAP_EXT                                    0x8507
+#define GL_DECR_WRAP_EXT                                    0x8508
+#endif
 
 /* GL_EXT_texture3D */
 #ifndef GL_EXT_texture3D
 #define GL_EXT_texture3D 1
-#define GL_PACK_SKIP_IMAGES_EXT           0x806B
-#define GL_PACK_IMAGE_HEIGHT_EXT          0x806C
-#define GL_UNPACK_SKIP_IMAGES_EXT         0x806D
-#define GL_UNPACK_IMAGE_HEIGHT_EXT        0x806E
-#define GL_TEXTURE_3D_EXT                 0x806F
-#define GL_PROXY_TEXTURE_3D_EXT           0x8070
-#define GL_TEXTURE_DEPTH_EXT              0x8071
-#define GL_TEXTURE_WRAP_R_EXT             0x8072
-#define GL_MAX_3D_TEXTURE_SIZE_EXT        0x8073
+#define GL_PACK_SKIP_IMAGES_EXT                             0x806b
+#define GL_PACK_IMAGE_HEIGHT_EXT                            0x806c
+#define GL_UNPACK_SKIP_IMAGES_EXT                           0x806d
+#define GL_UNPACK_IMAGE_HEIGHT_EXT                          0x806e
+#define GL_TEXTURE_3D_EXT                                   0x806f
+#define GL_PROXY_TEXTURE_3D_EXT                             0x8070
+#define GL_TEXTURE_DEPTH_EXT                                0x8071
+#define GL_TEXTURE_WRAP_R_EXT                               0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT                          0x8073
+#endif
+typedef void (WINE_GLAPI *PGLFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (WINE_GLAPI *PGLFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+        GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+/* GL_EXT_texture_compression_rgtc */
+#ifndef GL_EXT_texture_compression_rgtc
+#define GL_EXT_texture_compression_rgtc 1
+#define GL_COMPRESSED_RED_RGTC1_EXT                         0x8dbb
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT                  0x8dbc
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT                   0x8dbd
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT            0x8dbe
 #endif
-typedef void (WINE_GLAPI * PGLFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-typedef void (WINE_GLAPI * PGLFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+/* GL_EXT_texture_compression_s3tc */
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                     0x83f0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                    0x83f1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT                    0x83f2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT                    0x83f3
+#endif
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level,
+        GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
+        GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+        GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset,
+        GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img);
+
 /* GL_EXT_texture_env_combine */
 #ifndef GL_EXT_texture_env_combine
 #define GL_EXT_texture_env_combine 1
-#define GL_COMBINE_EXT                    0x8570
-#define GL_COMBINE_RGB_EXT                0x8571
-#define GL_COMBINE_ALPHA_EXT              0x8572
-#define GL_RGB_SCALE_EXT                  0x8573
-#define GL_ADD_SIGNED_EXT                 0x8574
-#define GL_INTERPOLATE_EXT                0x8575
-#define GL_SUBTRACT_EXT                   0x84E7
-#define GL_CONSTANT_EXT                   0x8576
-#define GL_PRIMARY_COLOR_EXT              0x8577
-#define GL_PREVIOUS_EXT                   0x8578
-#define GL_SOURCE0_RGB_EXT                0x8580
-#define GL_SOURCE1_RGB_EXT                0x8581
-#define GL_SOURCE2_RGB_EXT                0x8582
-#define GL_SOURCE3_RGB_EXT                0x8583
-#define GL_SOURCE4_RGB_EXT                0x8584
-#define GL_SOURCE5_RGB_EXT                0x8585
-#define GL_SOURCE6_RGB_EXT                0x8586
-#define GL_SOURCE7_RGB_EXT                0x8587
-#define GL_SOURCE0_ALPHA_EXT              0x8588
-#define GL_SOURCE1_ALPHA_EXT              0x8589
-#define GL_SOURCE2_ALPHA_EXT              0x858A
-#define GL_SOURCE3_ALPHA_EXT              0x858B
-#define GL_SOURCE4_ALPHA_EXT              0x858C
-#define GL_SOURCE5_ALPHA_EXT              0x858D
-#define GL_SOURCE6_ALPHA_EXT              0x858E
-#define GL_SOURCE7_ALPHA_EXT              0x858F
-#define GL_OPERAND0_RGB_EXT               0x8590
-#define GL_OPERAND1_RGB_EXT               0x8591
-#define GL_OPERAND2_RGB_EXT               0x8592
-#define GL_OPERAND3_RGB_EXT               0x8593
-#define GL_OPERAND4_RGB_EXT               0x8594
-#define GL_OPERAND5_RGB_EXT               0x8595
-#define GL_OPERAND6_RGB_EXT               0x8596
-#define GL_OPERAND7_RGB_EXT               0x8597
-#define GL_OPERAND0_ALPHA_EXT             0x8598
-#define GL_OPERAND1_ALPHA_EXT             0x8599
-#define GL_OPERAND2_ALPHA_EXT             0x859A
-#define GL_OPERAND3_ALPHA_EXT             0x859B
-#define GL_OPERAND4_ALPHA_EXT             0x859C
-#define GL_OPERAND5_ALPHA_EXT             0x859D
-#define GL_OPERAND6_ALPHA_EXT             0x859E
-#define GL_OPERAND7_ALPHA_EXT             0x859F
+#define GL_COMBINE_EXT                                      0x8570
+#define GL_COMBINE_RGB_EXT                                  0x8571
+#define GL_COMBINE_ALPHA_EXT                                0x8572
+#define GL_RGB_SCALE_EXT                                    0x8573
+#define GL_ADD_SIGNED_EXT                                   0x8574
+#define GL_INTERPOLATE_EXT                                  0x8575
+#define GL_SUBTRACT_EXT                                     0x84e7
+#define GL_CONSTANT_EXT                                     0x8576
+#define GL_PRIMARY_COLOR_EXT                                0x8577
+#define GL_PREVIOUS_EXT                                     0x8578
+#define GL_SOURCE0_RGB_EXT                                  0x8580
+#define GL_SOURCE1_RGB_EXT                                  0x8581
+#define GL_SOURCE2_RGB_EXT                                  0x8582
+#define GL_SOURCE3_RGB_EXT                                  0x8583
+#define GL_SOURCE4_RGB_EXT                                  0x8584
+#define GL_SOURCE5_RGB_EXT                                  0x8585
+#define GL_SOURCE6_RGB_EXT                                  0x8586
+#define GL_SOURCE7_RGB_EXT                                  0x8587
+#define GL_SOURCE0_ALPHA_EXT                                0x8588
+#define GL_SOURCE1_ALPHA_EXT                                0x8589
+#define GL_SOURCE2_ALPHA_EXT                                0x858a
+#define GL_SOURCE3_ALPHA_EXT                                0x858b
+#define GL_SOURCE4_ALPHA_EXT                                0x858c
+#define GL_SOURCE5_ALPHA_EXT                                0x858d
+#define GL_SOURCE6_ALPHA_EXT                                0x858e
+#define GL_SOURCE7_ALPHA_EXT                                0x858f
+#define GL_OPERAND0_RGB_EXT                                 0x8590
+#define GL_OPERAND1_RGB_EXT                                 0x8591
+#define GL_OPERAND2_RGB_EXT                                 0x8592
+#define GL_OPERAND3_RGB_EXT                                 0x8593
+#define GL_OPERAND4_RGB_EXT                                 0x8594
+#define GL_OPERAND5_RGB_EXT                                 0x8595
+#define GL_OPERAND6_RGB_EXT                                 0x8596
+#define GL_OPERAND7_RGB_EXT                                 0x8597
+#define GL_OPERAND0_ALPHA_EXT                               0x8598
+#define GL_OPERAND1_ALPHA_EXT                               0x8599
+#define GL_OPERAND2_ALPHA_EXT                               0x859a
+#define GL_OPERAND3_ALPHA_EXT                               0x859b
+#define GL_OPERAND4_ALPHA_EXT                               0x859c
+#define GL_OPERAND5_ALPHA_EXT                               0x859d
+#define GL_OPERAND6_ALPHA_EXT                               0x859e
+#define GL_OPERAND7_ALPHA_EXT                               0x859f
 #endif
+
 /* GL_EXT_texture_env_dot3 */
 #ifndef GL_EXT_texture_env_dot3
 #define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT                   0x8740
-#define GL_DOT3_RGBA_EXT                  0x8741
-#endif
-/* GL_EXT_texture_lod_bias */
-#ifndef GL_EXT_texture_lod_bias
-#define GL_EXT_texture_lod_bias 1
-#define GL_MAX_TEXTURE_LOD_BIAS_EXT       0x84FD
-#define GL_TEXTURE_FILTER_CONTROL_EXT     0x8500
-#define GL_TEXTURE_LOD_BIAS_EXT           0x8501
-#endif
-/* GL_ARB_texture_border_clamp */
-#ifndef GL_ARB_texture_border_clamp
-#define GL_ARB_texture_border_clamp 1
-#define GL_CLAMP_TO_BORDER_ARB            0x812D
+#define GL_DOT3_RGB_EXT                                     0x8740
+#define GL_DOT3_RGBA_EXT                                    0x8741
 #endif
+
 /* GL_EXT_texture_filter_anisotropic */
 #ifndef GL_EXT_texture_filter_anisotropic
 #define GL_EXT_texture_filter_anisotropic 1
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT     0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-#endif
-/* GL_ARB_texture_mirrored_repeat (full support GL1.4) */
-#ifndef GL_ARB_texture_mirrored_repeat
-#define GL_ARB_texture_mirrored_repeat 1
-#define GL_MIRRORED_REPEAT_ARB            0x8370
-#endif
-/* GL_ATI_texture_mirror_once */
-#ifndef GL_ATI_texture_mirror_once
-#define GL_ATI_texture_mirror_once 1
-#define GL_MIRROR_CLAMP_ATI               0x8742
-#define GL_MIRROR_CLAMP_TO_EDGE_ATI       0x8743
-#endif
-/* GL_ARB_texture_env_dot3 */
-#ifndef GL_ARB_texture_env_dot3
-#define GL_ARB_texture_env_dot3 1
-#define GL_DOT3_RGB_ARB                   0x86AE
-#define GL_DOT3_RGBA_ARB                  0x86AF
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT                       0x84fe
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                   0x84ff
 #endif
-/* GL_EXT_texture_env_dot3 */
-#ifndef GL_EXT_texture_env_dot3
-#define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT                   0x8740
-#define GL_DOT3_RGBA_EXT                  0x8741
+
+/* GL_EXT_texture_lod_bias */
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT                         0x84fd
+#define GL_TEXTURE_FILTER_CONTROL_EXT                       0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT                             0x8501
 #endif
+
 /* GL_EXT_texture_sRGB */
 #ifndef GL_EXT_texture_sRGB
 #define GL_EXT_texture_sRGB 1
-#define GL_SRGB_EXT                            0x8C40
-#define GL_SRGB8_EXT                           0x8C41
-#define GL_SRGB_ALPHA_EXT                      0x8C42
-#define GL_SRGB8_ALPHA8_EXT                    0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT                0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT              0x8C45
-#define GL_SLUMINANCE_EXT                      0x8C46
-#define GL_SLUMINANCE8_EXT                     0x8C47
-#define GL_COMPRESSED_SRGB_EXT                 0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT           0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT           0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT     0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT       0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
-#endif
-/* GL_ARB_texture_float */
-#ifndef GL_ARB_texture_float
-#define GL_ARB_texture_float 1
-#define GL_RGBA32F_ARB                    0x8814
-#define GL_RGB32F_ARB                     0x8815
-#define GL_RGBA16F_ARB                    0x881A
-#define GL_RGB16F_ARB                     0x881B
-#endif
-/* GL_ARB_texture_rg */
-#ifndef GL_ARB_texture_rg
-#define GL_RG                             0x8227
-#define GL_RG_INTEGER                     0x8228
-#define GL_R8                             0x8229
-#define GL_R16                            0x822A
-#define GL_RG8                            0x822B
-#define GL_RG16                           0x822C
-#define GL_R16F                           0x822D
-#define GL_R32F                           0x822E
-#define GL_RG16F                          0x822F
-#define GL_RG32F                          0x8230
-#define GL_R8I                            0x8231
-#define GL_R8UI                           0x8232
-#define GL_R16I                           0x8233
-#define GL_R16UI                          0x8234
-#define GL_R32I                           0x8235
-#define GL_R32UI                          0x8236
-#define GL_RG8I                           0x8237
-#define GL_RG8UI                          0x8238
-#define GL_RG16I                          0x8239
-#define GL_RG16UI                         0x823A
-#define GL_RG32I                          0x823B
-#define GL_RG32UI                         0x823C
-#endif
-/* GL_EXT_texture_swizzle */
-#ifndef GL_EXT_texture_swizzle
-#define GL_TEXTURE_SWIZZLE_R_EXT          0x8E42
-#define GL_TEXTURE_SWIZZLE_G_EXT          0x8E43
-#define GL_TEXTURE_SWIZZLE_B_EXT          0x8E44
-#define GL_TEXTURE_SWIZZLE_A_EXT          0x8E45
-#define GL_TEXTURE_SWIZZLE_RGBA_EXT       0x8E46
-#endif
-/* GL_ARB_half_float_pixel */
-#ifndef GL_ARB_half_float_pixel
-#define GL_ARB_half_float_pixel
-#define GL_HALF_FLOAT_ARB                 0x140B
-#endif
-/* GL_ARB_vertex_program */
-#ifndef GL_ARB_vertex_program
-#define GL_ARB_vertex_program 1
-#define GL_VERTEX_PROGRAM_ARB             0x8620
-#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB  0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB    0x8643
-#define GL_COLOR_SUM_ARB                  0x8458
-#define GL_PROGRAM_FORMAT_ASCII_ARB       0x8875
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB   0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB   0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
-#define GL_CURRENT_VERTEX_ATTRIB_ARB      0x8626
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
-#define GL_PROGRAM_LENGTH_ARB             0x8627
-#define GL_PROGRAM_FORMAT_ARB             0x8876
-#define GL_PROGRAM_BINDING_ARB            0x8677
-#define GL_PROGRAM_INSTRUCTIONS_ARB       0x88A0
-#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB   0x88A1
-#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
-#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
-#define GL_PROGRAM_TEMPORARIES_ARB        0x88A4
-#define GL_MAX_PROGRAM_TEMPORARIES_ARB    0x88A5
-#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
-#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
-#define GL_PROGRAM_PARAMETERS_ARB         0x88A8
-#define GL_MAX_PROGRAM_PARAMETERS_ARB     0x88A9
-#define GL_PROGRAM_NATIVE_PARAMETERS_ARB  0x88AA
-#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
-#define GL_PROGRAM_ATTRIBS_ARB            0x88AC
-#define GL_MAX_PROGRAM_ATTRIBS_ARB        0x88AD
-#define GL_PROGRAM_NATIVE_ATTRIBS_ARB     0x88AE
-#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
-#define GL_PROGRAM_ADDRESS_REGISTERS_ARB  0x88B0
-#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
-#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
-#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
-#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
-#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
-#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
-#define GL_PROGRAM_STRING_ARB             0x8628
-#define GL_PROGRAM_ERROR_POSITION_ARB     0x864B
-#define GL_CURRENT_MATRIX_ARB             0x8641
-#define GL_TRANSPOSE_CURRENT_MATRIX_ARB   0x88B7
-#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
-#define GL_MAX_VERTEX_ATTRIBS_ARB         0x8869
-#define GL_MAX_PROGRAM_MATRICES_ARB       0x862F
-#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
-#define GL_PROGRAM_ERROR_STRING_ARB       0x8874
-#define GL_MATRIX0_ARB                    0x88C0
-#define GL_MATRIX1_ARB                    0x88C1
-#define GL_MATRIX2_ARB                    0x88C2
-#define GL_MATRIX3_ARB                    0x88C3
-#define GL_MATRIX4_ARB                    0x88C4
-#define GL_MATRIX5_ARB                    0x88C5
-#define GL_MATRIX6_ARB                    0x88C6
-#define GL_MATRIX7_ARB                    0x88C7
-#define GL_MATRIX8_ARB                    0x88C8
-#define GL_MATRIX9_ARB                    0x88C9
-#define GL_MATRIX10_ARB                   0x88CA
-#define GL_MATRIX11_ARB                   0x88CB
-#define GL_MATRIX12_ARB                   0x88CC
-#define GL_MATRIX13_ARB                   0x88CD
-#define GL_MATRIX14_ARB                   0x88CE
-#define GL_MATRIX15_ARB                   0x88CF
-#define GL_MATRIX16_ARB                   0x88D0
-#define GL_MATRIX17_ARB                   0x88D1
-#define GL_MATRIX18_ARB                   0x88D2
-#define GL_MATRIX19_ARB                   0x88D3
-#define GL_MATRIX20_ARB                   0x88D4
-#define GL_MATRIX21_ARB                   0x88D5
-#define GL_MATRIX22_ARB                   0x88D6
-#define GL_MATRIX23_ARB                   0x88D7
-#define GL_MATRIX24_ARB                   0x88D8
-#define GL_MATRIX25_ARB                   0x88D9
-#define GL_MATRIX26_ARB                   0x88DA
-#define GL_MATRIX27_ARB                   0x88DB
-#define GL_MATRIX28_ARB                   0x88DC
-#define GL_MATRIX29_ARB                   0x88DD
-#define GL_MATRIX30_ARB                   0x88DE
-#define GL_MATRIX31_ARB                   0x88DF
-#endif
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNBINDPROGRAMARBPROC) (GLenum target, GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMARBPROC) (GLuint program);
-#ifndef GL_ARB_fragment_program
-#define GL_ARB_fragment_program 1
-#define GL_FRAGMENT_PROGRAM_ARB           0x8804
-#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB   0x8805
-#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB   0x8806
-#define GL_PROGRAM_TEX_INDIRECTIONS_ARB   0x8807
-#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
-#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
-#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
-#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
-#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
-#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
-#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
-#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
-#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
-#define GL_MAX_TEXTURE_COORDS_ARB         0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB    0x8872
-/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
-#endif
-/* GL_ARB_multisample */
-#ifndef GL_ARB_multisample
-#define GL_ARB_multisample 1
-#define GL_MULTISAMPLE_ARB                0x809D
-#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB   0x809E
-#define GL_SAMPLE_ALPHA_TO_ONE_ARB        0x809F
-#define GL_SAMPLE_COVERAGE_ARB            0x80A0
-#define GL_SAMPLE_BUFFERS_ARB             0x80A8
-#define GL_SAMPLES_ARB                    0x80A9
-#define GL_SAMPLE_COVERAGE_VALUE_ARB      0x80AA
-#define GL_SAMPLE_COVERAGE_INVERT_ARB     0x80AB
-#define GL_MULTISAMPLE_BIT_ARB            0x20000000
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
-/* GL_ARB_vertex_buffer_object */
-#ifndef GL_ARB_vertex_buffer_object
-#define GL_ARB_vertex_buffer_object 1
-#define GL_BUFFER_SIZE_ARB                0x8764
-#define GL_BUFFER_USAGE_ARB               0x8765
-#define GL_ARRAY_BUFFER_ARB               0x8892
-#define GL_ELEMENT_ARRAY_BUFFER_ARB       0x8893
-#define GL_ARRAY_BUFFER_BINDING_ARB       0x8894
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
-#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB  0x8896
-#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB  0x8897
-#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB   0x8898
-#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB   0x8899
-#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB   0x889A
-#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB       0x889B
-#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
-#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB  0x889D
-#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB          0x889E
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB   0x889F
-#define GL_READ_ONLY_ARB                  0x88B8
-#define GL_WRITE_ONLY_ARB                 0x88B9
-#define GL_READ_WRITE_ARB                 0x88BA
-#define GL_BUFFER_ACCESS_ARB              0x88BB
-#define GL_BUFFER_MAPPED_ARB              0x88BC
-#define GL_BUFFER_MAP_POINTER_ARB         0x88BD
-#define GL_STREAM_DRAW_ARB                0x88E0
-#define GL_STREAM_READ_ARB                0x88E1
-#define GL_STREAM_COPY_ARB                0x88E2
-#define GL_STATIC_DRAW_ARB                0x88E4
-#define GL_STATIC_READ_ARB                0x88E5
-#define GL_STATIC_COPY_ARB                0x88E6
-#define GL_DYNAMIC_DRAW_ARB               0x88E8
-#define GL_DYNAMIC_READ_ARB               0x88E9
-#define GL_DYNAMIC_COPY_ARB               0x88EA
-#endif
-typedef void (WINE_GLAPI * PGLFNBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
-typedef void (WINE_GLAPI * PGLFNGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
-typedef GLboolean (WINE_GLAPI * PGLFNISBUFFERARBPROC) (GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNBUFFERDATAARBPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
-typedef void (WINE_GLAPI * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
-typedef GLvoid* (WINE_GLAPI * PGLFNMAPBUFFERARBPROC) (GLenum target, GLenum access);
-typedef GLboolean (WINE_GLAPI * PGLFNUNMAPBUFFERARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params);
-/* GL_EXT_blend_equation_separate */
-typedef void (WINE_GLAPI * PGLFNBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-/* GL_EXT_blend_func_separate */
-#ifndef GL_EXT_blend_func_separate
-#define GL_BLEND_DST_RGB_EXT              0x80C8
-#define GL_BLEND_SRC_RGB_EXT              0x80C9
-#define GL_BLEND_DST_ALPHA_EXT            0x80CA
-#define GL_BLEND_SRC_ALPHA_EXT            0x80CB
-#endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
-/* GL_EXT_fog_coord */
-#ifndef GL_EXT_fog_coord
-#define GL_EXT_fog_coord 1
-#define GL_FOG_COORDINATE_SOURCE_EXT            0x8450
-#define GL_FOG_COORDINATE_EXT                   0x8451
-#define GL_FRAGMENT_DEPTH_EXT                   0x8452
-#define GL_CURRENT_FOG_COORDINATE_EXT           0x8453
-#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT        0x8454
-#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT      0x8455
-#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT     0x8456
-#define GL_FOG_COORDINATE_ARRAY_EXT             0x8457
-#endif /* GL_EXT_fog_coord */
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFEXTPROC) (GLfloat coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDEXTPROC) (GLdouble coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *data);
-/* GL_ARB_shader_objects (GLSL) */
-#ifndef GL_ARB_shader_objects
-#define GL_ARB_shader_objects 1
-typedef char GLcharARB;
-typedef unsigned int GLhandleARB;
-#define GL_PROGRAM_OBJECT_ARB                   0x8B40
-#define GL_OBJECT_TYPE_ARB                      0x8B4E
-#define GL_OBJECT_SUBTYPE_ARB                   0x8B4F
-#define GL_OBJECT_DELETE_STATUS_ARB             0x8B80
-#define GL_OBJECT_COMPILE_STATUS_ARB            0x8B81
-#define GL_OBJECT_LINK_STATUS_ARB               0x8B82
-#define GL_OBJECT_VALIDATE_STATUS_ARB           0x8B83
-#define GL_OBJECT_INFO_LOG_LENGTH_ARB           0x8B84
-#define GL_OBJECT_ATTACHED_OBJECTS_ARB          0x8B85
-#define GL_OBJECT_ACTIVE_UNIFORMS_ARB           0x8B86
-#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
-#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB      0x8B88
-#define GL_SHADER_OBJECT_ARB                    0x8B48
-#define GL_FLOAT_VEC2_ARB                       0x8B50
-#define GL_FLOAT_VEC3_ARB                       0x8B51
-#define GL_FLOAT_VEC4_ARB                       0x8B52
-#define GL_INT_VEC2_ARB                         0x8B53
-#define GL_INT_VEC3_ARB                         0x8B54
-#define GL_INT_VEC4_ARB                         0x8B55
-#define GL_BOOL_ARB                             0x8B56
-#define GL_BOOL_VEC2_ARB                        0x8B57
-#define GL_BOOL_VEC3_ARB                        0x8B58
-#define GL_BOOL_VEC4_ARB                        0x8B59
-#define GL_FLOAT_MAT2_ARB                       0x8B5A
-#define GL_FLOAT_MAT3_ARB                       0x8B5B
-#define GL_FLOAT_MAT4_ARB                       0x8B5C
-#define GL_SAMPLER_1D_ARB                       0x8B5D
-#define GL_SAMPLER_2D_ARB                       0x8B5E
-#define GL_SAMPLER_3D_ARB                       0x8B5F
-#define GL_SAMPLER_CUBE_ARB                     0x8B60
-#define GL_SAMPLER_1D_SHADOW_ARB                0x8B61
-#define GL_SAMPLER_2D_SHADOW_ARB                0x8B62
-#define GL_SAMPLER_2D_RECT_ARB                  0x8B63
-#define GL_SAMPELR_2D_RECT_SHADOW_ARB           0x8B64
-#endif
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100         1
-#define GL_SHADING_LANGUAGE_VERSION_ARB     0x8B8C
-#endif
-#ifndef GL_ARB_fragment_shader
-#define GL_ARB_fragment_shader 1
-#define GL_FRAGMENT_SHADER_ARB                  0x8B30
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB  0x8B49
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB  0x8B8B
-#endif
-#ifndef GL_ARB_vertex_shader
-#define GL_ARB_vertex_shader 1
-#define GL_VERTEX_SHADER_ARB                        0x8B31
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB        0x8B4A
-#define GL_MAX_VARYING_FLOATS_ARB                   0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB       0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB     0x8B4D
-#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB             0x8B89
-#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB   0x8B8A
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
-typedef void (WINE_GLAPI * WINED3D_PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
-typedef void (WINE_GLAPI * WINED3D_PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
-typedef void (WINE_GLAPI * WINED3D_PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLGETHANDLEARBPROC) (GLenum pname);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
-typedef void (WINE_GLAPI * WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_PIXEL_PACK_BUFFER_ARB          0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB        0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB  0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
-#endif
-/* GL_EXT_texture */
-#ifndef GL_EXT_texture
-#define GL_EXT_texture 1
-#define GL_ALPHA4_EXT                     0x803B
-#define GL_ALPHA8_EXT                     0x803C
-#define GL_ALPHA12_EXT                    0x803D
-#define GL_ALPHA16_EXT                    0x803E
-#define GL_LUMINANCE4_EXT                 0x803F
-#define GL_LUMINANCE8_EXT                 0x8040
-#define GL_LUMINANCE12_EXT                0x8041
-#define GL_LUMINANCE16_EXT                0x8042
-#define GL_LUMINANCE4_ALPHA4_EXT          0x8043
-#define GL_LUMINANCE6_ALPHA2_EXT          0x8044
-#define GL_LUMINANCE8_ALPHA8_EXT          0x8045
-#define GL_LUMINANCE12_ALPHA4_EXT         0x8046
-#define GL_LUMINANCE12_ALPHA12_EXT        0x8047
-#define GL_LUMINANCE16_ALPHA16_EXT        0x8048
-#define GL_INTENSITY_EXT                  0x8049
-#define GL_INTENSITY4_EXT                 0x804A
-#define GL_INTENSITY8_EXT                 0x804B
-#define GL_INTENSITY12_EXT                0x804C
-#define GL_INTENSITY16_EXT                0x804D
-#define GL_RGB2_EXT                       0x804E
-#define GL_RGB4_EXT                       0x804F
-#define GL_RGB5_EXT                       0x8050
-#define GL_RGB8_EXT                       0x8051
-#define GL_RGB10_EXT                      0x8052
-#define GL_RGB12_EXT                      0x8053
-#define GL_RGB16_EXT                      0x8054
-#define GL_RGBA2_EXT                      0x8055
-#define GL_RGBA4_EXT                      0x8056
-#define GL_RGB5_A1_EXT                    0x8057
-#define GL_RGBA8_EXT                      0x8058
-#define GL_RGB10_A2_EXT                   0x8059
-#define GL_RGBA12_EXT                     0x805A
-#define GL_RGBA16_EXT                     0x805B
-#define GL_TEXTURE_RED_SIZE_EXT           0x805C
-#define GL_TEXTURE_GREEN_SIZE_EXT         0x805D
-#define GL_TEXTURE_BLUE_SIZE_EXT          0x805E
-#define GL_TEXTURE_ALPHA_SIZE_EXT         0x805F
-#define GL_TEXTURE_LUMINANCE_SIZE_EXT     0x8060
-#define GL_TEXTURE_INTENSITY_SIZE_EXT     0x8061
-#define GL_REPLACE_EXT                    0x8062
-#define GL_PROXY_TEXTURE_1D_EXT           0x8063
-#define GL_PROXY_TEXTURE_2D_EXT           0x8064
-#define GL_TEXTURE_TOO_LARGE_EXT          0x8065
-#endif
-/* GL_EXT_texture_compression_s3tc */
-#ifndef GL_EXT_texture_compression_s3tc
-#define GL_EXT_texture_compression_s3tc 1
-#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT   0x83F0
-#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  0x83F1
-#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  0x83F2
-#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  0x83F3
-#endif
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
-/* GL_EXT_stencil_wrap */
-#ifndef GL_EXT_stencil_wrap
-#define GL_EXT_stencil_wrap 1
-#define GL_INCR_WRAP_EXT                  0x8507
-#define GL_DECR_WRAP_EXT                  0x8508
+#define GL_SRGB_EXT                                         0x8c40
+#define GL_SRGB8_EXT                                        0x8c41
+#define GL_SRGB_ALPHA_EXT                                   0x8c42
+#define GL_SRGB8_ALPHA8_EXT                                 0x8c43
+#define GL_SLUMINANCE_ALPHA_EXT                             0x8c44
+#define GL_SLUMINANCE8_ALPHA8_EXT                           0x8c45
+#define GL_SLUMINANCE_EXT                                   0x8c46
+#define GL_SLUMINANCE8_EXT                                  0x8c47
+#define GL_COMPRESSED_SRGB_EXT                              0x8c48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT                        0x8c49
+#define GL_COMPRESSED_SLUMINANCE_EXT                        0x8c4a
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                  0x8c4b
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                    0x8c4c
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT              0x8c4d
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT              0x8c4e
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT              0x8c4f
 #endif
 
-/* GL_ARB_half_float_vertex */
-#ifndef GL_ARB_half_float_vertex
-#define GL_ARB_half_float_vertex
-/* No _ARB, see extension spec */
-#define GL_HALF_FLOAT                     0x140B
+/* GL_NV_depth_clamp */
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+#define GL_DEPTH_CLAMP_NV                                   0x864f
 #endif
-/* GL_NV_half_float */
-#ifndef GL_NV_half_float
-#define GL_NV_half_float 1
-typedef unsigned short GLhalfNV;
-#define GL_HALF_FLOAT_NV                  0x140B
+
+/* GL_NV_fence */
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#define GL_ALL_COMPLETED_NV                                 0x84f2
+#define GL_FENCE_STATUS_NV                                  0x84f3
+#define GL_FENCE_CONDITION_NV                               0x84f4
 #endif
-typedef void (WINE_GLAPI * PGLFNVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEX2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HNVPROC) (GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHNVPROC) (GLhalfNV fog);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHVNVPROC) (const GLhalfNV *fog);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHNVPROC) (GLhalfNV weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNGENFENCESNVPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESNVPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCENVPROC)(GLuint, GLenum);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCENVPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNGETFENCEIVNVPROC)(GLuint, GLenum, GLint *);
 
 /* GL_NV_fog_distance */
 #ifndef GL_NV_fog_distance
 #define GL_NV_fog_distance 1
-#define GL_FOG_DISTANCE_MODE_NV           0x855A
-#define GL_EYE_RADIAL_NV                  0x855B
-#define GL_EYE_PLANE_ABSOLUTE_NV          0x855C
+#define GL_FOG_DISTANCE_MODE_NV                             0x855a
+#define GL_EYE_RADIAL_NV                                    0x855b
+#define GL_EYE_PLANE_ABSOLUTE_NV                            0x855c
 /* reuse GL_EYE_PLANE */
 #endif
-/* GL_NV_texgen_reflection */
-#ifndef GL_NV_texgen_reflection
-#define GL_NV_texgen_reflection 1
-#define GL_NORMAL_MAP_NV                  0x8511
-#define GL_REFLECTION_MAP_NV              0x8512
+
+/* GL_NV_half_float */
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+typedef unsigned short GLhalfNV;
+#define GL_HALF_FLOAT_NV                                    0x140b
 #endif
-/* GL_NV_texture_env_combine4 */
-#ifndef GL_NV_texture_env_combine4
-#define GL_NV_texture_env_combine4 1
-#define GL_COMBINE4_NV                    0x8503
-#define GL_SOURCE3_RGB_NV                 0x8583
-#define GL_SOURCE3_ALPHA_NV               0x858B
-#define GL_OPERAND3_RGB_NV                0x8593
-#define GL_OPERAND3_ALPHA_NV              0x859B
+typedef void (WINE_GLAPI *PGLFNVERTEX2HNVPROC)(GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEX2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HNVPROC)(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HNVPROC)(GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HNVPROC)(GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HNVPROC)(GLenum target, GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHNVPROC)(GLhalfNV fog);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHVNVPROC)(const GLhalfNV *fog);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHNVPROC)(GLhalfNV weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHVNVPROC)(const GLhalfNV *weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HNVPROC)(GLuint index, GLhalfNV x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS1HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS2HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS3HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+
+/* GL_NV_light_max_exponent */
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+#define GL_MAX_SHININESS_NV                                 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV                             0x8505
 #endif
+
 /* GL_NV_register_combiners */
 #ifndef GL_NV_register_combiners
 #define GL_NV_register_combiners 1
-#define GL_REGISTER_COMBINERS_NV          0x8522
-#define GL_VARIABLE_A_NV                  0x8523
-#define GL_VARIABLE_B_NV                  0x8524
-#define GL_VARIABLE_C_NV                  0x8525
-#define GL_VARIABLE_D_NV                  0x8526
-#define GL_VARIABLE_E_NV                  0x8527
-#define GL_VARIABLE_F_NV                  0x8528
-#define GL_VARIABLE_G_NV                  0x8529
-#define GL_CONSTANT_COLOR0_NV             0x852A
-#define GL_CONSTANT_COLOR1_NV             0x852B
-#define GL_PRIMARY_COLOR_NV               0x852C
-#define GL_SECONDARY_COLOR_NV             0x852D
-#define GL_SPARE0_NV                      0x852E
-#define GL_SPARE1_NV                      0x852F
-#define GL_DISCARD_NV                     0x8530
-#define GL_E_TIMES_F_NV                   0x8531
-#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
-#define GL_UNSIGNED_IDENTITY_NV           0x8536
-#define GL_UNSIGNED_INVERT_NV             0x8537
-#define GL_EXPAND_NORMAL_NV               0x8538
-#define GL_EXPAND_NEGATE_NV               0x8539
-#define GL_HALF_BIAS_NORMAL_NV            0x853A
-#define GL_HALF_BIAS_NEGATE_NV            0x853B
-#define GL_SIGNED_IDENTITY_NV             0x853C
-#define GL_SIGNED_NEGATE_NV               0x853D
-#define GL_SCALE_BY_TWO_NV                0x853E
-#define GL_SCALE_BY_FOUR_NV               0x853F
-#define GL_SCALE_BY_ONE_HALF_NV           0x8540
-#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV   0x8541
-#define GL_COMBINER_INPUT_NV              0x8542
-#define GL_COMBINER_MAPPING_NV            0x8543
-#define GL_COMBINER_COMPONENT_USAGE_NV    0x8544
-#define GL_COMBINER_AB_DOT_PRODUCT_NV     0x8545
-#define GL_COMBINER_CD_DOT_PRODUCT_NV     0x8546
-#define GL_COMBINER_MUX_SUM_NV            0x8547
-#define GL_COMBINER_SCALE_NV              0x8548
-#define GL_COMBINER_BIAS_NV               0x8549
-#define GL_COMBINER_AB_OUTPUT_NV          0x854A
-#define GL_COMBINER_CD_OUTPUT_NV          0x854B
-#define GL_COMBINER_SUM_OUTPUT_NV         0x854C
-#define GL_MAX_GENERAL_COMBINERS_NV       0x854D
-#define GL_NUM_GENERAL_COMBINERS_NV       0x854E
-#define GL_COLOR_SUM_CLAMP_NV             0x854F
-#define GL_COMBINER0_NV                   0x8550
-#define GL_COMBINER1_NV                   0x8551
-#define GL_COMBINER2_NV                   0x8552
-#define GL_COMBINER3_NV                   0x8553
-#define GL_COMBINER4_NV                   0x8554
-#define GL_COMBINER5_NV                   0x8555
-#define GL_COMBINER6_NV                   0x8556
-#define GL_COMBINER7_NV                   0x8557
+#define GL_REGISTER_COMBINERS_NV                            0x8522
+#define GL_VARIABLE_A_NV                                    0x8523
+#define GL_VARIABLE_B_NV                                    0x8524
+#define GL_VARIABLE_C_NV                                    0x8525
+#define GL_VARIABLE_D_NV                                    0x8526
+#define GL_VARIABLE_E_NV                                    0x8527
+#define GL_VARIABLE_F_NV                                    0x8528
+#define GL_VARIABLE_G_NV                                    0x8529
+#define GL_CONSTANT_COLOR0_NV                               0x852a
+#define GL_CONSTANT_COLOR1_NV                               0x852b
+#define GL_PRIMARY_COLOR_NV                                 0x852c
+#define GL_SECONDARY_COLOR_NV                               0x852d
+#define GL_SPARE0_NV                                        0x852e
+#define GL_SPARE1_NV                                        0x852f
+#define GL_DISCARD_NV                                       0x8530
+#define GL_E_TIMES_F_NV                                     0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV                   0x8532
+#define GL_UNSIGNED_IDENTITY_NV                             0x8536
+#define GL_UNSIGNED_INVERT_NV                               0x8537
+#define GL_EXPAND_NORMAL_NV                                 0x8538
+#define GL_EXPAND_NEGATE_NV                                 0x8539
+#define GL_HALF_BIAS_NORMAL_NV                              0x853a
+#define GL_HALF_BIAS_NEGATE_NV                              0x853b
+#define GL_SIGNED_IDENTITY_NV                               0x853c
+#define GL_SIGNED_NEGATE_NV                                 0x853d
+#define GL_SCALE_BY_TWO_NV                                  0x853e
+#define GL_SCALE_BY_FOUR_NV                                 0x853f
+#define GL_SCALE_BY_ONE_HALF_NV                             0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV                     0x8541
+#define GL_COMBINER_INPUT_NV                                0x8542
+#define GL_COMBINER_MAPPING_NV                              0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV                      0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV                       0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV                       0x8546
+#define GL_COMBINER_MUX_SUM_NV                              0x8547
+#define GL_COMBINER_SCALE_NV                                0x8548
+#define GL_COMBINER_BIAS_NV                                 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV                            0x854a
+#define GL_COMBINER_CD_OUTPUT_NV                            0x854b
+#define GL_COMBINER_SUM_OUTPUT_NV                           0x854c
+#define GL_MAX_GENERAL_COMBINERS_NV                         0x854d
+#define GL_NUM_GENERAL_COMBINERS_NV                         0x854e
+#define GL_COLOR_SUM_CLAMP_NV                               0x854f
+#define GL_COMBINER0_NV                                     0x8550
+#define GL_COMBINER1_NV                                     0x8551
+#define GL_COMBINER2_NV                                     0x8552
+#define GL_COMBINER3_NV                                     0x8553
+#define GL_COMBINER4_NV                                     0x8554
+#define GL_COMBINER5_NV                                     0x8555
+#define GL_COMBINER6_NV                                     0x8556
+#define GL_COMBINER7_NV                                     0x8557
 /* reuse GL_TEXTURE0_ARB */
 /* reuse GL_TEXTURE1_ARB */
 /* reuse GL_ZERO */
 /* reuse GL_NONE */
 /* reuse GL_FOG */
 #endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
-typedef void (WINE_GLAPI * PGLFNFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFVNVPROC)(GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFNVPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERIVNVPROC)(GLenum pname, const GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERINVPROC)(GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERINPUTNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNCOMBINEROUTPUTNVPROC)(GLenum stage, GLenum portion,
+        GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias,
+        GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (WINE_GLAPI *PGLFNFINALCOMBINERINPUTNVPROC)(GLenum variable, GLenum input,
+        GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+        GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+        GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC)(GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC)(GLenum variable, GLenum pname, GLint *params);
+
 /* GL_NV_register_combiners2 */
 #ifndef GL_NV_register_combiners2
 #define GL_NV_register_combiners2 1
-#define GL_PER_STAGE_CONSTANTS_NV         0x8535
+#define GL_PER_STAGE_CONSTANTS_NV                           0x8535
+#endif
+typedef void (WINE_GLAPI *PGLFNCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, GLfloat *params);
+
+/* GL_NV_texgen_reflection */
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+#define GL_NORMAL_MAP_NV                                    0x8511
+#define GL_REFLECTION_MAP_NV                                0x8512
 #endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);
+
+/* GL_NV_texture_env_combine4 */
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+#define GL_COMBINE4_NV                                      0x8503
+#define GL_SOURCE3_RGB_NV                                   0x8583
+#define GL_SOURCE3_ALPHA_NV                                 0x858b
+#define GL_OPERAND3_RGB_NV                                  0x8593
+#define GL_OPERAND3_ALPHA_NV                                0x859b
+#endif
+
 /* GL_NV_texture_shader */
 #ifndef GL_NV_texture_shader
 #define GL_NV_texture_shader 1
-#define GL_OFFSET_TEXTURE_RECTANGLE_NV    0x864C
-#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
-#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
-#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
-#define GL_UNSIGNED_INT_S8_S8_8_8_NV      0x86DA
-#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV  0x86DB
-#define GL_DSDT_MAG_INTENSITY_NV          0x86DC
-#define GL_SHADER_CONSISTENT_NV           0x86DD
-#define GL_TEXTURE_SHADER_NV              0x86DE
-#define GL_SHADER_OPERATION_NV            0x86DF
-#define GL_CULL_MODES_NV                  0x86E0
-#define GL_OFFSET_TEXTURE_MATRIX_NV       0x86E1
-#define GL_OFFSET_TEXTURE_SCALE_NV        0x86E2
-#define GL_OFFSET_TEXTURE_BIAS_NV         0x86E3
-#define GL_OFFSET_TEXTURE_2D_MATRIX_NV    GL_OFFSET_TEXTURE_MATRIX_NV
-#define GL_OFFSET_TEXTURE_2D_SCALE_NV     GL_OFFSET_TEXTURE_SCALE_NV
-#define GL_OFFSET_TEXTURE_2D_BIAS_NV      GL_OFFSET_TEXTURE_BIAS_NV
-#define GL_PREVIOUS_TEXTURE_INPUT_NV      0x86E4
-#define GL_CONST_EYE_NV                   0x86E5
-#define GL_PASS_THROUGH_NV                0x86E6
-#define GL_CULL_FRAGMENT_NV               0x86E7
-#define GL_OFFSET_TEXTURE_2D_NV           0x86E8
-#define GL_DEPENDENT_AR_TEXTURE_2D_NV     0x86E9
-#define GL_DEPENDENT_GB_TEXTURE_2D_NV     0x86EA
-#define GL_DOT_PRODUCT_NV                 0x86EC
-#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV   0x86ED
-#define GL_DOT_PRODUCT_TEXTURE_2D_NV      0x86EE
-#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
-#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
-#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
-#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
-#define GL_HILO_NV                        0x86F4
-#define GL_DSDT_NV                        0x86F5
-#define GL_DSDT_MAG_NV                    0x86F6
-#define GL_DSDT_MAG_VIB_NV                0x86F7
-#define GL_HILO16_NV                      0x86F8
-#define GL_SIGNED_HILO_NV                 0x86F9
-#define GL_SIGNED_HILO16_NV               0x86FA
-#define GL_SIGNED_RGBA_NV                 0x86FB
-#define GL_SIGNED_RGBA8_NV                0x86FC
-#define GL_SIGNED_RGB_NV                  0x86FE
-#define GL_SIGNED_RGB8_NV                 0x86FF
-#define GL_SIGNED_LUMINANCE_NV            0x8701
-#define GL_SIGNED_LUMINANCE8_NV           0x8702
-#define GL_SIGNED_LUMINANCE_ALPHA_NV      0x8703
-#define GL_SIGNED_LUMINANCE8_ALPHA8_NV    0x8704
-#define GL_SIGNED_ALPHA_NV                0x8705
-#define GL_SIGNED_ALPHA8_NV               0x8706
-#define GL_SIGNED_INTENSITY_NV            0x8707
-#define GL_SIGNED_INTENSITY8_NV           0x8708
-#define GL_DSDT8_NV                       0x8709
-#define GL_DSDT8_MAG8_NV                  0x870A
-#define GL_DSDT8_MAG8_INTENSITY8_NV       0x870B
-#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV   0x870C
-#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
-#define GL_HI_SCALE_NV                    0x870E
-#define GL_LO_SCALE_NV                    0x870F
-#define GL_DS_SCALE_NV                    0x8710
-#define GL_DT_SCALE_NV                    0x8711
-#define GL_MAGNITUDE_SCALE_NV             0x8712
-#define GL_VIBRANCE_SCALE_NV              0x8713
-#define GL_HI_BIAS_NV                     0x8714
-#define GL_LO_BIAS_NV                     0x8715
-#define GL_DS_BIAS_NV                     0x8716
-#define GL_DT_BIAS_NV                     0x8717
-#define GL_MAGNITUDE_BIAS_NV              0x8718
-#define GL_VIBRANCE_BIAS_NV               0x8719
-#define GL_TEXTURE_BORDER_VALUES_NV       0x871A
-#define GL_TEXTURE_HI_SIZE_NV             0x871B
-#define GL_TEXTURE_LO_SIZE_NV             0x871C
-#define GL_TEXTURE_DS_SIZE_NV             0x871D
-#define GL_TEXTURE_DT_SIZE_NV             0x871E
-#define GL_TEXTURE_MAG_SIZE_NV            0x871F
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV                      0x864c
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV                0x864d
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV                 0x864e
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV             0x86d9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV                        0x86da
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV                    0x86db
+#define GL_DSDT_MAG_INTENSITY_NV                            0x86dc
+#define GL_SHADER_CONSISTENT_NV                             0x86dd
+#define GL_TEXTURE_SHADER_NV                                0x86de
+#define GL_SHADER_OPERATION_NV                              0x86df
+#define GL_CULL_MODES_NV                                    0x86e0
+#define GL_OFFSET_TEXTURE_MATRIX_NV                         0x86e1
+#define GL_OFFSET_TEXTURE_SCALE_NV                          0x86e2
+#define GL_OFFSET_TEXTURE_BIAS_NV                           0x86e3
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV                      GL_OFFSET_TEXTURE_MATRIX_NV
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV                       GL_OFFSET_TEXTURE_SCALE_NV
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV                        GL_OFFSET_TEXTURE_BIAS_NV
+#define GL_PREVIOUS_TEXTURE_INPUT_NV                        0x86e4
+#define GL_CONST_EYE_NV                                     0x86e5
+#define GL_PASS_THROUGH_NV                                  0x86e6
+#define GL_CULL_FRAGMENT_NV                                 0x86e7
+#define GL_OFFSET_TEXTURE_2D_NV                             0x86e8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV                       0x86e9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV                       0x86ea
+#define GL_DOT_PRODUCT_NV                                   0x86ec
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV                     0x86ed
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV                        0x86ee
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV                  0x86f0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV                  0x86f1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV                  0x86f2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV        0x86f3
+#define GL_HILO_NV                                          0x86f4
+#define GL_DSDT_NV                                          0x86f5
+#define GL_DSDT_MAG_NV                                      0x86f6
+#define GL_DSDT_MAG_VIB_NV                                  0x86f7
+#define GL_HILO16_NV                                        0x86f8
+#define GL_SIGNED_HILO_NV                                   0x86f9
+#define GL_SIGNED_HILO16_NV                                 0x86fa
+#define GL_SIGNED_RGBA_NV                                   0x86fb
+#define GL_SIGNED_RGBA8_NV                                  0x86fc
+#define GL_SIGNED_RGB_NV                                    0x86fe
+#define GL_SIGNED_RGB8_NV                                   0x86ff
+#define GL_SIGNED_LUMINANCE_NV                              0x8701
+#define GL_SIGNED_LUMINANCE8_NV                             0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV                        0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV                      0x8704
+#define GL_SIGNED_ALPHA_NV                                  0x8705
+#define GL_SIGNED_ALPHA8_NV                                 0x8706
+#define GL_SIGNED_INTENSITY_NV                              0x8707
+#define GL_SIGNED_INTENSITY8_NV                             0x8708
+#define GL_DSDT8_NV                                         0x8709
+#define GL_DSDT8_MAG8_NV                                    0x870a
+#define GL_DSDT8_MAG8_INTENSITY8_NV                         0x870b
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV                     0x870c
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV                   0x870d
+#define GL_HI_SCALE_NV                                      0x870e
+#define GL_LO_SCALE_NV                                      0x870f
+#define GL_DS_SCALE_NV                                      0x8710
+#define GL_DT_SCALE_NV                                      0x8711
+#define GL_MAGNITUDE_SCALE_NV                               0x8712
+#define GL_VIBRANCE_SCALE_NV                                0x8713
+#define GL_HI_BIAS_NV                                       0x8714
+#define GL_LO_BIAS_NV                                       0x8715
+#define GL_DS_BIAS_NV                                       0x8716
+#define GL_DT_BIAS_NV                                       0x8717
+#define GL_MAGNITUDE_BIAS_NV                                0x8718
+#define GL_VIBRANCE_BIAS_NV                                 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV                         0x871a
+#define GL_TEXTURE_HI_SIZE_NV                               0x871b
+#define GL_TEXTURE_LO_SIZE_NV                               0x871c
+#define GL_TEXTURE_DS_SIZE_NV                               0x871d
+#define GL_TEXTURE_DT_SIZE_NV                               0x871e
+#define GL_TEXTURE_MAG_SIZE_NV                              0x871f
 #endif
+
 /* GL_NV_texture_shader2 */
 #ifndef GL_NV_texture_shader2
 #define GL_NV_texture_shader2 1
-#define GL_DOT_PRODUCT_TEXTURE_3D_NV      0x86EF
-#endif
-/* GL_NV_texture_shader3 */
-#ifndef GL_NV_texture_shader3
-#define GL_NV_texture_shader3 1
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
-#define GL_OFFSET_HILO_TEXTURE_2D_NV      0x8854
-#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
-#define GL_DEPENDENT_HILO_TEXTURE_2D_NV   0x8858
-#define GL_DEPENDENT_RGB_TEXTURE_3D_NV    0x8859
-#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
-#define GL_DOT_PRODUCT_PASS_THROUGH_NV    0x885B
-#define GL_DOT_PRODUCT_TEXTURE_1D_NV      0x885C
-#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
-#define GL_HILO8_NV                       0x885E
-#define GL_SIGNED_HILO8_NV                0x885F
-#define GL_FORCE_BLUE_TO_ONE_NV           0x8860
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV                        0x86ef
 #endif
-/* GL_ATI_texture_env_combine3 */
-#ifndef GL_ATI_texture_env_combine3
-#define GL_ATI_texture_env_combine3 1
-#define GL_MODULATE_ADD_ATI               0x8744
-#define GL_MODULATE_SIGNED_ADD_ATI        0x8745
-#define GL_MODULATE_SUBTRACT_ATI          0x8746
-/* #define ONE */
-/* #define ZERO */
-#endif
-
-/**
- * Point sprites
- */
-/* GL_ARB_point_sprite */
-#ifndef GL_ARB_point_sprite
-#define GL_ARB_point_sprite 1
-#define GL_POINT_SPRITE_ARB               0x8861
-#define GL_COORD_REPLACE_ARB              0x8862
-#endif
-/**
- * @TODO: GL_NV_point_sprite
- */
 
-/**
- * Occlusion Queries
- */
-/* GL_ARB_occlusion_query */
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query 1
-#define GL_SAMPLES_PASSED_ARB                             0x8914
-#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
-#define GL_CURRENT_QUERY_ARB                              0x8865
-#define GL_QUERY_RESULT_ARB                               0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENQUERIESARBPROC) (GLsizei n, GLuint *queries);
-typedef void (WINE_GLAPI * PGLFNDELETEQUERIESARBPROC) (GLsizei n, const GLuint *queries);
-typedef GLboolean (WINE_GLAPI * PGLFNISQUERYARBPROC) (GLuint query);
-typedef void (WINE_GLAPI * PGLFNBEGINQUERYARBPROC) (GLenum target, GLuint query);
-typedef void (WINE_GLAPI * PGLFNENDQUERYARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTIVARBPROC) (GLuint query, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTUIVARBPROC) (GLuint query, GLenum pname, GLuint *params);
-/* GL_HP_occlusion_test isn't complete, but it's constants are used by GL_NV_occlusion_query */
-#ifndef GL_HP_occlusion_test
-#define GL_HP_occlusion_test 1
-#define GL_OCCLUSION_TEST_HP                 0x8165
-#define GL_OCCLUSION_TEST_RESULT_HP          0x8165
-#endif
-/*  GL_NV_occlusion_query */
-#ifndef GL_NV_occlusion_query
-#define GL_NV_occlusion_query 1
-#define GL_PIXEL_COUNTER_BITS_NV          0x8864
-#define GL_CURRENT_OCCLUSION_QUERY_ID_NV  0x8865
-#define GL_PIXEL_COUNT_NV                 0x8866
-#define GL_PIXEL_COUNT_AVAILABLE_NV       0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);
-typedef void (WINE_GLAPI * PGLFNDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);
-typedef GLboolean (WINE_GLAPI * PGLFNISOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNENDOCCLUSIONQUERYNVPROC) (void);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);
-/* GL_EXT_stencil_two_side */
-#ifndef GL_EXT_stencil_two_side
-#define GL_EXT_stencil_two_side 1
-#define GL_STENCIL_TEST_TWO_SIDE_EXT      0x8910
-#define GL_ACTIVE_STENCIL_FACE_EXT        0x8911
-#endif
-typedef void (WINE_GLAPI * PGLFNACTIVESTENCILFACEEXTPROC) (GLenum face);
-/* GL_ATI_separate_stencil */
-#ifndef GL_ATI_separate_stencil
-#define GL_ATI_separate_stencil 1
-#define GL_STENCIL_BACK_FUNC_ATI          0x8800
-#define GL_STENCIL_BACK_FAIL_ATI          0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
-#endif
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEATIPROC) (GLenum, GLenum, GLenum, GLenum);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEATIPROC) (GLenum, GLenum, GLint, GLuint);
-/* GL_NV_fence */
-#ifndef GL_NV_fence
-#define GL_NV_fence 1
-#define GL_ALL_COMPLETED_NV                 0x84F2
-#define GL_FENCE_STATUS_NV                  0x84F3
-#define GL_FENCE_CONDITION_NV               0x84F4
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESNVPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESNVPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCENVPROC) (GLuint, GLenum);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCENVPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNGETFENCEIVNVPROC) (GLuint, GLenum, GLint *);
-/* GL_APPLE_fence */
-#ifndef GL_APPLE_fence
-#define GL_APPLE_fence 1
-#define GL_DRAW_PIXELS_APPLE                0x8A0A
-#define GL_FENCE_APPLE                      0x8A0B
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESAPPLEPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESAPPLEPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCEAPPLEPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTOBJECTAPPLEPROC) (GLenum, GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHOBJECTAPPLEPROC) (GLenum, GLuint);
-/* GL_APPLE_client_storage */
-#ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 1
-#define GL_UNPACK_CLIENT_STORAGE_APPLE      0x85B2
+/* GL_NV_vertex_program2_option */
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option 1
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV                 0x88f4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV                        0x88f5
 #endif
-/* GLX_SGI_video_sync */
-typedef int (WINE_GLAPI * PGLXFNGETVIDEOSYNCSGIPROC) (unsigned int *);
-typedef int (WINE_GLAPI * PGLXFNWAITVIDEOSYNCSGIPROC) (int, int, unsigned int *);
 
 /* GL_SGIS_generate_mipmap */
 #ifndef GLX_SGIS_generate_mipmap
-#define GL_GENERATE_MIPMAP_SGIS             0x8191
-#define GL_GENERATE_MIPMAP_HINT_SGIS        0x8192
-#define GLX_SGIS_generate_mipmap
-#endif
-
-/* GL_NV_depth_clamp */
-#ifndef GL_NV_depth_clamp
-#define GL_DEPTH_CLAMP_NV                   0x864F
+#define GLX_SGIS_generate_mipmap 1
+#define GL_GENERATE_MIPMAP_SGIS                             0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS                        0x8192
 #endif
 
-/* GL_APPLE_flush_render */
-typedef void (WINE_GLAPI * PGLFNFLUSHRENDERAPPLEPROC) (void);
-typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void);
-
-/* GL_APPLE_ycbcr_422 */
-#ifndef GL_APPLE_ycbcr_422
-#define GL_APPLE_ycbcr_422
-#define GL_YCBCR_422_APPLE                  0x85B9
-#define UNSIGNED_SHORT_8_8_APPLE            0x85BA
-#define UNSIGNED_SHORT_8_8_REV_APPLE        0x85BB
-#endif
-
-/* GL_ARB_texture_rectangle */
-#ifndef GL_ARB_texture_rectangle
-#define GL_ARB_texture_rectangle
-#define GL_TEXTURE_RECTANGLE_ARB            0x84F5
-#define GL_TEXTURE_BINDING_RECTANGLE_ARB    0x84F6
-#define GL_PROXY_TEXTURE_RECTANGLE_ARB      0x84F7
-#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB   0x84F8
-#define GL_SAMPLER_2D_RECT_ARB              0x8B63
-#define GL_SAMPLER_2D_RECT_SHADOW_ARB       0x8B64
-#endif
-
-/* GL_APPLE_float_pixels */
-#ifndef GL_APPLE_float_pixels
-#define GL_APPLE_float_pixels
-#define GL_HALF_APPLE                       0x140B
-#define GL_COLOR_FLOAT_APPLE                0x8A0F
-#define GL_RGBA_FLOAT32_APPLE               0x8814
-#define GL_RGB_FLOAT32_APPLE                0x8815
-#define GL_ALPHA_FLOAT32_APPLE              0x8816
-#define GL_INTENSITY_FLOAT32_APPLE          0x8817
-#define GL_LUMINANCE_FLOAT32_APPLE          0x8818
-#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE    0x8819
-#define GL_RGBA_FLOAT16_APPLE               0x881A
-#define GL_RGB_FLOAT16_APPLE                0x881B
-#define GL_ALPHA_FLOAT16_APPLE              0x881C
-#define GL_INTENSITY_FLOAT16_APPLE          0x881D
-#define GL_LUMINANCE_FLOAT16_APPLE          0x881E
-#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE    0x881F
-#endif
-
-/* GL_EXT_gpu_program_parameters */
-#ifndef GL_EXT_gpu_program_parameters
-#define GL_EXT_gpu_program_parameters
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-#endif
-
-/* GL_NV_light_max_exponent */
-#ifndef GL_NV_light_max_exponent
-#define GL_NV_light_max_exponent
-#define GL_MAX_SHININESS_NV                 0x8504
-#define GL_MAX_SPOT_EXPONENT_NV             0x8505
-#endif
+/* GLX_SGI_video_sync */
+typedef int (WINE_GLAPI *PGLXFNGETVIDEOSYNCSGIPROC)(unsigned int *);
+typedef int (WINE_GLAPI *PGLXFNWAITVIDEOSYNCSGIPROC)(int, int, unsigned int *);
 
-/* GL_ATI_fragment_shader */
-#ifndef GL_ATI_fragment_shader
-#define GL_ATI_fragment_shader
-typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range);
-typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
-                                                     GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
-                                                     GLuint arg2Mod, GLuint arg3, GLuint arg3Rep,
-                                                     GLuint arg3Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
-                                                     GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
-                                                     GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
-                                                     GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
-typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const GLfloat *value);
-#define GL_FRAGMENT_SHADER_ATI              0x8920
-#define GL_REG_0_ATI                        0x8921
-#define GL_REG_1_ATI                        0x8922
-#define GL_REG_2_ATI                        0x8923
-#define GL_REG_3_ATI                        0x8924
-#define GL_REG_4_ATI                        0x8925
-#define GL_REG_5_ATI                        0x8926
-#define GL_CON_0_ATI                        0x8941
-#define GL_CON_1_ATI                        0x8942
-#define GL_CON_2_ATI                        0x8943
-#define GL_CON_3_ATI                        0x8944
-#define GL_CON_4_ATI                        0x8945
-#define GL_CON_5_ATI                        0x8946
-#define GL_CON_6_ATI                        0x8947
-#define GL_CON_7_ATI                        0x8948
-#define GL_MOV_ATI                          0x8961
-#define GL_ADD_ATI                          0x8963
-#define GL_MUL_ATI                          0x8964
-#define GL_SUB_ATI                          0x8965
-#define GL_DOT3_ATI                         0x8966
-#define GL_DOT4_ATI                         0x8967
-#define GL_MAD_ATI                          0x8968
-#define GL_LERP_ATI                         0x8969
-#define GL_CND_ATI                          0x896A
-#define GL_CND0_ATI                         0x896B
-#define GL_DOT2_ADD_ATI                     0x896C
-#define GL_SECONDARY_INTERPOLATOR_ATI       0x896D
-#define GL_SWIZZLE_STR_ATI                  0x8976
-#define GL_SWIZZLE_STQ_ATI                  0x8977
-#define GL_SWIZZLE_STR_DR_ATI               0x8978
-#define GL_SWIZZLE_STQ_DQ_ATI               0x8979
-#define GL_RED_BIT_ATI                      0x00000001
-#define GL_GREEN_BIT_ATI                    0x00000002
-#define GL_BLUE_BIT_ATI                     0x00000004
-#define GL_2X_BIT_ATI                       0x00000001
-#define GL_4X_BIT_ATI                       0x00000002
-#define GL_8X_BIT_ATI                       0x00000004
-#define GL_HALF_BIT_ATI                     0x00000008
-#define GL_QUARTER_BIT_ATI                  0x00000010
-#define GL_EIGHTH_BIT_ATI                   0x00000020
-#define GL_SATURATE_BIT_ATI                 0x00000040
-#define GL_2X_BIT_ATI                       0x00000001
-#define GL_COMP_BIT_ATI                     0x00000002
-#define GL_NEGATE_BIT_ATI                   0x00000004
-#define GL_BIAS_BIT_ATI                     0x00000008
-#endif
-/* GL_ATI_texture_compression_3dc */
-#ifndef GL_ATI_texture_compression_3dc
-#define GL_ATI_texture_compression_3dc
-#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
-#endif
-/* GL_EXT_texture_compression_rgtc */
-#ifndef GL_EXT_texture_compression_rgtc
-#define GL_EXT_texture_compression_rgtc
-#define GL_COMPRESSED_RED_RGTC1_EXT                       0x8DBB
-#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT                0x8DBC
-#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT                 0x8DBD
-#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT          0x8DBE
-#endif
+/* WGL_ARB_extensions_string */
+typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
 
-/* GL_NV_vertex_program2_option */
-#ifndef GL_NV_vertex_program2_option
-#define GL_NV_vertex_program2_option
-#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV               0x88F4
-#define GL_MAX_PROGRAM_CALL_DEPTH_NV                      0x88F5
+/* WGL_ARB_multisample */
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+#define WGL_SAMPLE_BUFFERS_ARB                              0x2041
+#define WGL_SAMPLES_ARB                                     0x2042
 #endif
 
-/* GL_APPLE_flush_buffer_range */
-#ifndef GL_APPLE_flush_buffer_range
-#define GL_APPLE_flush_buffer_range
-#define GL_BUFFER_SERIALIZED_MODIFY_APPLE                 0x8A12
-#define GL_BUFFER_FLUSHING_UNMAP_APPLE                    0x8A13
-typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE) (GLenum target, GLenum pname, GLint param);
-typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE) (GLenum target, GLintptr offset, GLsizeiptr size);
+/* WGL_ARB_pbuffer */
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+#define WGL_DRAW_TO_PBUFFER_ARB                             0x202d
+#define WGL_MAX_PBUFFER_PIXELS_ARB                          0x202e
+#define WGL_MAX_PBUFFER_WIDTH_ARB                           0x202f
+#define WGL_MAX_PBUFFER_HEIGHT_ARB                          0x2030
+#define WGL_PBUFFER_LARGEST_ARB                             0x2033
+#define WGL_PBUFFER_WIDTH_ARB                               0x2034
+#define WGL_PBUFFER_HEIGHT_ARB                              0x2035
+#define WGL_PBUFFER_LOST_ARB                                0x2036
 #endif
+DECLARE_HANDLE(HPBUFFERARB);
+typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat,
+        int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
+typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
+typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
 
-/* GL_VERSION_2_0 */
-#ifndef GL_VERSION_2_0
-#define GL_VERSION_2_0 1
-#define GL_BLEND_EQUATION_RGB             GL_BLEND_EQUATION
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
-#define GL_CURRENT_VERTEX_ATTRIB          0x8626
-#define GL_VERTEX_PROGRAM_POINT_SIZE      0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE        0x8643
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
-#define GL_STENCIL_BACK_FUNC              0x8800
-#define GL_STENCIL_BACK_FAIL              0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803
-#define GL_MAX_DRAW_BUFFERS               0x8824
-#define GL_DRAW_BUFFER0                   0x8825
-#define GL_DRAW_BUFFER1                   0x8826
-#define GL_DRAW_BUFFER2                   0x8827
-#define GL_DRAW_BUFFER3                   0x8828
-#define GL_DRAW_BUFFER4                   0x8829
-#define GL_DRAW_BUFFER5                   0x882A
-#define GL_DRAW_BUFFER6                   0x882B
-#define GL_DRAW_BUFFER7                   0x882C
-#define GL_DRAW_BUFFER8                   0x882D
-#define GL_DRAW_BUFFER9                   0x882E
-#define GL_DRAW_BUFFER10                  0x882F
-#define GL_DRAW_BUFFER11                  0x8830
-#define GL_DRAW_BUFFER12                  0x8831
-#define GL_DRAW_BUFFER13                  0x8832
-#define GL_DRAW_BUFFER14                  0x8833
-#define GL_DRAW_BUFFER15                  0x8834
-#define GL_BLEND_EQUATION_ALPHA           0x883D
-#define GL_POINT_SPRITE                   0x8861
-#define GL_COORD_REPLACE                  0x8862
-#define GL_MAX_VERTEX_ATTRIBS             0x8869
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
-#define GL_MAX_TEXTURE_COORDS             0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
-#define GL_FRAGMENT_SHADER                0x8B30
-#define GL_VERTEX_SHADER                  0x8B31
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
-#define GL_MAX_VARYING_FLOATS             0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
-#define GL_SHADER_TYPE                    0x8B4F
-#define GL_FLOAT_VEC2                     0x8B50
-#define GL_FLOAT_VEC3                     0x8B51
-#define GL_FLOAT_VEC4                     0x8B52
-#define GL_INT_VEC2                       0x8B53
-#define GL_INT_VEC3                       0x8B54
-#define GL_INT_VEC4                       0x8B55
-#define GL_BOOL                           0x8B56
-#define GL_BOOL_VEC2                      0x8B57
-#define GL_BOOL_VEC3                      0x8B58
-#define GL_BOOL_VEC4                      0x8B59
-#define GL_FLOAT_MAT2                     0x8B5A
-#define GL_FLOAT_MAT3                     0x8B5B
-#define GL_FLOAT_MAT4                     0x8B5C
-#define GL_SAMPLER_1D                     0x8B5D
-#define GL_SAMPLER_2D                     0x8B5E
-#define GL_SAMPLER_3D                     0x8B5F
-#define GL_SAMPLER_CUBE                   0x8B60
-#define GL_SAMPLER_1D_SHADOW              0x8B61
-#define GL_SAMPLER_2D_SHADOW              0x8B62
-#define GL_DELETE_STATUS                  0x8B80
-#define GL_COMPILE_STATUS                 0x8B81
-#define GL_LINK_STATUS                    0x8B82
-#define GL_VALIDATE_STATUS                0x8B83
-#define GL_INFO_LOG_LENGTH                0x8B84
-#define GL_ATTACHED_SHADERS               0x8B85
-#define GL_ACTIVE_UNIFORMS                0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
-#define GL_SHADER_SOURCE_LENGTH           0x8B88
-#define GL_ACTIVE_ATTRIBUTES              0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
-#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
-#define GL_CURRENT_PROGRAM                0x8B8D
-#define GL_POINT_SPRITE_COORD_ORIGIN      0x8CA0
-#define GL_LOWER_LEFT                     0x8CA1
-#define GL_UPPER_LEFT                     0x8CA2
-#define GL_STENCIL_BACK_REF               0x8CA3
-#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4
-#define GL_STENCIL_BACK_WRITEMASK         0x8CA5
-typedef char GLchar;
+/* WGL_ARB_pixel_format */
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+#define WGL_NUMBER_PIXEL_FORMATS_ARB                        0x2000
+#define WGL_DRAW_TO_WINDOW_ARB                              0x2001
+#define WGL_DRAW_TO_BITMAP_ARB                              0x2002
+#define WGL_ACCELERATION_ARB                                0x2003
+#define WGL_NEED_PALETTE_ARB                                0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB                         0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB                          0x2006
+#define WGL_SWAP_METHOD_ARB                                 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB                             0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB                            0x2009
+#define WGL_TRANSPARENT_ARB                                 0x200a
+#define WGL_TRANSPARENT_RED_VALUE_ARB                       0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB                     0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB                      0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB                     0x203a
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB                     0x203b
+#define WGL_SHARE_DEPTH_ARB                                 0x200c
+#define WGL_SHARE_STENCIL_ARB                               0x200d
+#define WGL_SHARE_ACCUM_ARB                                 0x200e
+#define WGL_SUPPORT_GDI_ARB                                 0x200f
+#define WGL_SUPPORT_OPENGL_ARB                              0x2010
+#define WGL_DOUBLE_BUFFER_ARB                               0x2011
+#define WGL_STEREO_ARB                                      0x2012
+#define WGL_PIXEL_TYPE_ARB                                  0x2013
+#define WGL_COLOR_BITS_ARB                                  0x2014
+#define WGL_RED_BITS_ARB                                    0x2015
+#define WGL_RED_SHIFT_ARB                                   0x2016
+#define WGL_GREEN_BITS_ARB                                  0x2017
+#define WGL_GREEN_SHIFT_ARB                                 0x2018
+#define WGL_BLUE_BITS_ARB                                   0x2019
+#define WGL_BLUE_SHIFT_ARB                                  0x201a
+#define WGL_ALPHA_BITS_ARB                                  0x201b
+#define WGL_ALPHA_SHIFT_ARB                                 0x201c
+#define WGL_ACCUM_BITS_ARB                                  0x201d
+#define WGL_ACCUM_RED_BITS_ARB                              0x201e
+#define WGL_ACCUM_GREEN_BITS_ARB                            0x201f
+#define WGL_ACCUM_BLUE_BITS_ARB                             0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB                            0x2021
+#define WGL_DEPTH_BITS_ARB                                  0x2022
+#define WGL_STENCIL_BITS_ARB                                0x2023
+#define WGL_AUX_BUFFERS_ARB                                 0x2024
+#define WGL_NO_ACCELERATION_ARB                             0x2025
+#define WGL_GENERIC_ACCELERATION_ARB                        0x2026
+#define WGL_FULL_ACCELERATION_ARB                           0x2027
+#define WGL_SWAP_EXCHANGE_ARB                               0x2028
+#define WGL_SWAP_COPY_ARB                                   0x2029
+#define WGL_SWAP_UNDEFINED_ARB                              0x202a
+#define WGL_TYPE_RGBA_ARB                                   0x202b
+#define WGL_TYPE_COLORINDEX_ARB                             0x202c
 #endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
-typedef void (WINE_GLAPI * PGLFNDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNATTACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNCOMPILESHADERPROC) (GLuint shader);
-typedef GLuint (WINE_GLAPI * PGLFNCREATEPROGRAMPROC) (void);
-typedef GLuint (WINE_GLAPI * PGLFNCREATESHADERPROC) (GLenum type);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETESHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDETACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
-typedef GLint (WINE_GLAPI * PGLFNGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-typedef GLint (WINE_GLAPI * PGLFNGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMPROC) (GLuint program);
-typedef GLboolean (WINE_GLAPI * PGLFNISSHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNLINKPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);
-typedef void (WINE_GLAPI * PGLFNUSEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNVALIDATEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat,
+        int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat,
+        int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList,
+        const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
 
-
-/****************************************************
- * OpenGL Official Version
- *  defines
- ****************************************************/
-/* GL_VERSION_1_3 */
-#if !defined(GL_DOT3_RGBA)
-# define GL_DOT3_RGBA                     0x8741
-#endif
-#if !defined(GL_SUBTRACT)
-# define GL_SUBTRACT                      0x84E7
+/* WGL_ARB_pixel_format_float */
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+#define WGL_TYPE_RGBA_FLOAT_ARB                             0x21a0
 #endif
 
+/* WGL_WINE_pixel_format_passthrough */
+typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelFormat,
+        const PIXELFORMATDESCRIPTOR *ppfd);
 
-/****************************************************
- * Enumerated types
- ****************************************************/
-#define WINE_DEFAULT_VIDMEM 64*1024*1024
-
-#define MAKEDWORD_VERSION(maj, min)  ((maj & 0x0000FFFF) << 16) | (min & 0x0000FFFF)
-
-/* OpenGL Supported Extensions (ARB and EXT) */
-typedef enum _GL_SupportedExt {
-  WINED3D_GL_EXT_NONE,
-  /* ARB */
-  ARB_COLOR_BUFFER_FLOAT,
-  ARB_DEPTH_BUFFER_FLOAT,
-  ARB_DEPTH_CLAMP,
-  ARB_DEPTH_TEXTURE,
-  ARB_DRAW_BUFFERS,
-  ARB_FRAGMENT_PROGRAM,
-  ARB_FRAGMENT_SHADER,
-  ARB_FRAMEBUFFER_OBJECT,
-  ARB_GEOMETRY_SHADER4,
-  ARB_IMAGING,
-  ARB_MULTISAMPLE,
-  ARB_MULTITEXTURE,
-  ARB_OCCLUSION_QUERY,
-  ARB_POINT_PARAMETERS,
-  ARB_PROVOKING_VERTEX,
-  ARB_PIXEL_BUFFER_OBJECT,
-  ARB_POINT_SPRITE,
-  ARB_TEXTURE_COMPRESSION,
-  ARB_TEXTURE_CUBE_MAP,
-  ARB_TEXTURE_ENV_ADD,
-  ARB_TEXTURE_ENV_COMBINE,
-  ARB_TEXTURE_ENV_DOT3,
-  ARB_TEXTURE_FLOAT,
-  ARB_HALF_FLOAT_PIXEL,
-  ARB_TEXTURE_BORDER_CLAMP,
-  ARB_TEXTURE_MIRRORED_REPEAT,
-  ARB_TEXTURE_NON_POWER_OF_TWO,
-  ARB_TEXTURE_RECTANGLE,
-  ARB_TEXTURE_RG,
-  ARB_VERTEX_PROGRAM,
-  ARB_VERTEX_BLEND,
-  ARB_VERTEX_BUFFER_OBJECT,
-  ARB_VERTEX_SHADER,
-  ARB_SHADER_OBJECTS,
-  ARB_SHADER_TEXTURE_LOD,
-  ARB_HALF_FLOAT_VERTEX,
-  /* EXT */
-  EXT_BLEND_COLOR,
-  EXT_BLEND_MINMAX,
-  EXT_BLEND_EQUATION_SEPARATE,
-  EXT_BLEND_FUNC_SEPARATE,
-  EXT_FOG_COORD,
-  EXT_FRAMEBUFFER_OBJECT,
-  EXT_FRAMEBUFFER_BLIT,
-  EXT_FRAMEBUFFER_MULTISAMPLE,
-  EXT_PACKED_DEPTH_STENCIL,
-  EXT_PALETTED_TEXTURE,
-  EXT_PIXEL_BUFFER_OBJECT,
-  EXT_POINT_PARAMETERS,
-  EXT_PROVOKING_VERTEX,
-  EXT_SECONDARY_COLOR,
-  EXT_STENCIL_TWO_SIDE,
-  EXT_STENCIL_WRAP,
-  EXT_TEXTURE3D,
-  EXT_TEXTURE_COMPRESSION_S3TC,
-  EXT_TEXTURE_COMPRESSION_RGTC,
-  EXT_TEXTURE_FILTER_ANISOTROPIC,
-  EXT_TEXTURE_LOD,
-  EXT_TEXTURE_LOD_BIAS,
-  EXT_TEXTURE_ENV_ADD,
-  EXT_TEXTURE_ENV_COMBINE,
-  EXT_TEXTURE_ENV_DOT3,
-  EXT_TEXTURE_SRGB,
-  EXT_TEXTURE_SWIZZLE,
-  EXT_GPU_PROGRAM_PARAMETERS,
-  EXT_VERTEX_ARRAY_BGRA,
-  /* NVIDIA */
-  NV_HALF_FLOAT,
-  NV_FOG_DISTANCE,
-  NV_FRAGMENT_PROGRAM,
-  NV_FRAGMENT_PROGRAM2,
-  NV_OCCLUSION_QUERY,
-  NV_REGISTER_COMBINERS,
-  NV_REGISTER_COMBINERS2,
-  NV_TEXGEN_REFLECTION,
-  NV_TEXTURE_ENV_COMBINE4,
-  NV_TEXTURE_SHADER,
-  NV_TEXTURE_SHADER2,
-  NV_TEXTURE_SHADER3,
-  NV_VERTEX_PROGRAM,
-  NV_VERTEX_PROGRAM1_1,
-  NV_VERTEX_PROGRAM2,
-  NV_VERTEX_PROGRAM2_OPTION,
-  NV_VERTEX_PROGRAM3,
-  NV_FRAGMENT_PROGRAM_OPTION,
-  NV_FENCE,
-  NV_DEPTH_CLAMP,
-  NV_LIGHT_MAX_EXPONENT,
-  /* ATI */
-  ATI_SEPARATE_STENCIL,
-  ATI_TEXTURE_ENV_COMBINE3,
-  ATI_TEXTURE_MIRROR_ONCE,
-  EXT_VERTEX_SHADER,
-  ATI_FRAGMENT_SHADER,
-  ATI_TEXTURE_COMPRESSION_3DC,
-  /* APPLE */
-  APPLE_FENCE,
-  APPLE_CLIENT_STORAGE,
-  APPLE_FLUSH_RENDER,
-  APPLE_YCBCR_422,
-  APPLE_FLOAT_PIXELS,
-  APPLE_FLUSH_BUFFER_RANGE,
-  /* SGI */
-  SGI_VIDEO_SYNC,
-  SGIS_GENERATE_MIPMAP,
-
-  /* Internally used */
-  WINE_NORMALIZED_TEXRECT,
-
-  /* WGL extensions */
-  WGL_ARB_PBUFFER,
-  WGL_ARB_PIXEL_FORMAT,
-  WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
-
-  WINED3D_GL_EXT_COUNT,
-} GL_SupportedExt;
-
-
-/****************************************************
- * #Defines
- ****************************************************/
 #define GL_EXT_FUNCS_GEN \
-    /** ARB Extensions **/ \
+    /* GL_APPLE_fence */ \
+    USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, \
+            glGenFencesAPPLE,                           APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, \
+            glDeleteFencesAPPLE,                        APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, \
+            glSetFenceAPPLE,                            APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, \
+            glTestFenceAPPLE,                           APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, \
+            glFinishFenceAPPLE,                         APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, \
+            glIsFenceAPPLE,                             APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, \
+            glTestObjectAPPLE,                          APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, \
+            glFinishObjectAPPLE,                        APPLE_FENCE,                    NULL) \
+    /* GL_APPLE_flush_buffer_range */ \
+    USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, \
+            glBufferParameteriAPPLE,                    APPLE_FLUSH_BUFFER_RANGE,       NULL) \
+    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, \
+            glFlushMappedBufferRangeAPPLE,              APPLE_FLUSH_BUFFER_RANGE,       NULL) \
+    /* GL_APPLE_flush_render */ \
+    USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, \
+            glFlushRenderAPPLE,                         APPLE_FLUSH_RENDER,             NULL) \
+    USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, \
+            glFinishRenderAPPLE,                        APPLE_FLUSH_RENDER,             NULL) \
     /* GL_ARB_color_buffer_float */ \
-    USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC,                             glClampColorARB,                            ARB_COLOR_BUFFER_FLOAT, NULL )\
+    USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, \
+            glClampColorARB,                            ARB_COLOR_BUFFER_FLOAT,         NULL) \
     /* GL_ARB_draw_buffers */ \
-    USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC,                            glDrawBuffersARB,                           ARB_DRAW_BUFFERS,       NULL )\
+    USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, \
+            glDrawBuffersARB,                           ARB_DRAW_BUFFERS,               NULL) \
     /* GL_ARB_framebuffer_object */ \
-    USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC,                          glIsRenderbuffer,                           ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC,                        glBindRenderbuffer,                         ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC,                     glDeleteRenderbuffers,                      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC,                        glGenRenderbuffers,                         ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC,                     glRenderbufferStorage,                      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC,            glRenderbufferStorageMultisample,           ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC,              glGetRenderbufferParameteriv,               ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC,                           glIsFramebuffer,                            ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC,                         glBindFramebuffer,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC,                      glDeleteFramebuffers,                       ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC,                         glGenFramebuffers,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC,                  glCheckFramebufferStatus,                   ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC,                    glFramebufferTexture1D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC,                    glFramebufferTexture2D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC,                    glFramebufferTexture3D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC,                 glFramebufferTextureLayer,                  ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC,                 glFramebufferRenderbuffer,                  ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC,     glGetFramebufferAttachmentParameteriv,      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC,                         glBlitFramebuffer,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC,                          glGenerateMipmap,                           ARB_FRAMEBUFFER_OBJECT, NULL )\
+    USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, \
+            glIsRenderbuffer,                           ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, \
+            glBindRenderbuffer,                         ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, \
+            glDeleteRenderbuffers,                      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, \
+            glGenRenderbuffers,                         ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, \
+            glRenderbufferStorage,                      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, \
+            glRenderbufferStorageMultisample,           ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, \
+            glGetRenderbufferParameteriv,               ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, \
+            glIsFramebuffer,                            ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, \
+            glBindFramebuffer,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, \
+            glDeleteFramebuffers,                       ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, \
+            glGenFramebuffers,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, \
+            glCheckFramebufferStatus,                   ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, \
+            glFramebufferTexture1D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, \
+            glFramebufferTexture2D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, \
+            glFramebufferTexture3D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC,     \
+            glFramebufferTextureLayer,                  ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, \
+            glFramebufferRenderbuffer,                  ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, \
+            glGetFramebufferAttachmentParameteriv,      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, \
+            glBlitFramebuffer,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, \
+            glGenerateMipmap,                           ARB_FRAMEBUFFER_OBJECT,         NULL) \
     /* GL_ARB_geometry_shader4 */ \
-    USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC,                      glProgramParameteriARB,                     ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC,                     glFramebufferTextureARB,                    ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC,                glFramebufferTextureLayerARB,               ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC,                 glFramebufferTextureFaceARB,                ARB_GEOMETRY_SHADER4,   NULL ) \
+    USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, \
+            glProgramParameteriARB,                     ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, \
+            glFramebufferTextureARB,                    ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, \
+            glFramebufferTextureLayerARB,               ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, \
+            glFramebufferTextureFaceARB,                ARB_GEOMETRY_SHADER4,           NULL) \
     /* GL_ARB_imaging, GL_EXT_blend_minmax */ \
-    USE_GL_FUNC(PGLFNBLENDCOLORPROC,                                glBlendColorEXT,                            EXT_BLEND_COLOR,        NULL )\
-    USE_GL_FUNC(PGLFNBLENDEQUATIONPROC,                             glBlendEquationEXT,                         EXT_BLEND_MINMAX,       NULL )\
+    USE_GL_FUNC(PGLFNBLENDCOLORPROC, \
+            glBlendColorEXT,                            EXT_BLEND_COLOR,                NULL) \
+    USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, \
+            glBlendEquationEXT,                         EXT_BLEND_MINMAX,               NULL) \
+    /* GL_ARB_map_buffer_range */ \
+    USE_GL_FUNC(PGLFNMAPBUFFERRANGEPROC, \
+            glMapBufferRange,                           ARB_MAP_BUFFER_RANGE,           NULL) \
+    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEPROC, \
+            glFlushMappedBufferRange,                   ARB_MAP_BUFFER_RANGE,           NULL) \
     /* GL_ARB_multisample */ \
-    USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC,                 glSampleCoverageARB,                        ARB_MULTISAMPLE,        NULL )\
+    USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, \
+            glSampleCoverageARB,                        ARB_MULTISAMPLE,                NULL) \
     /* GL_ARB_multitexture */ \
-    USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC,                  glActiveTextureARB,                         ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC,            glClientActiveTextureARB,                   ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC,                glMultiTexCoord1fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC,               glMultiTexCoord1fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC,                glMultiTexCoord2fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC,               glMultiTexCoord2fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC,                glMultiTexCoord3fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC,               glMultiTexCoord3fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC,                glMultiTexCoord4fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC,               glMultiTexCoord4fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC,               glMultiTexCoord2svARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC,               glMultiTexCoord4svARB,                      ARB_MULTITEXTURE,       NULL )\
+    USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, \
+            glActiveTextureARB,                         ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, \
+            glClientActiveTextureARB,                   ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, \
+            glMultiTexCoord1fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, \
+            glMultiTexCoord1fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, \
+            glMultiTexCoord2fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, \
+            glMultiTexCoord2fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, \
+            glMultiTexCoord3fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, \
+            glMultiTexCoord3fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, \
+            glMultiTexCoord4fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, \
+            glMultiTexCoord4fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, \
+            glMultiTexCoord2svARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, \
+            glMultiTexCoord4svARB,                      ARB_MULTITEXTURE,               NULL) \
     /* GL_ARB_occlusion_query */ \
-    USE_GL_FUNC(PGLFNGENQUERIESARBPROC,                             glGenQueriesARB,                            ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC,                          glDeleteQueriesARB,                         ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNBEGINQUERYARBPROC,                             glBeginQueryARB,                            ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNENDQUERYARBPROC,                               glEndQueryARB,                              ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC,                       glGetQueryObjectivARB,                      ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC,                      glGetQueryObjectuivARB,                     ARB_OCCLUSION_QUERY,    NULL )\
+    USE_GL_FUNC(PGLFNGENQUERIESARBPROC, \
+            glGenQueriesARB,                            ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, \
+            glDeleteQueriesARB,                         ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, \
+            glBeginQueryARB,                            ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNENDQUERYARBPROC, \
+            glEndQueryARB,                              ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, \
+            glGetQueryObjectivARB,                      ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, \
+            glGetQueryObjectuivARB,                     ARB_OCCLUSION_QUERY,            NULL) \
     /* GL_ARB_point_parameters */ \
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC,                      glPointParameterfARB,                       ARB_POINT_PARAMETERS,   NULL )\
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC,                     glPointParameterfvARB,                      ARB_POINT_PARAMETERS,   NULL )\
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, \
+            glPointParameterfARB,                       ARB_POINT_PARAMETERS,           NULL) \
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, \
+            glPointParameterfvARB,                      ARB_POINT_PARAMETERS,           NULL) \
     /* GL_ARB_provoking_vertex */ \
-    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC,                         glProvokingVertex,                          ARB_PROVOKING_VERTEX,   NULL)\
+    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, \
+            glProvokingVertex,                          ARB_PROVOKING_VERTEX,           NULL) \
+    /* GL_ARB_shader_objects */ \
+    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, \
+            glGetObjectParameterivARB,                  ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, \
+            glGetObjectParameterfvARB,                  ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, \
+            glGetUniformLocationARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, \
+            glGetActiveUniformARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+            glUniform1iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, \
+            glUniform2iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, \
+            glUniform3iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \
+            glUniform4iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+            glUniform1fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \
+            glUniform2fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, \
+            glUniform3fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, \
+            glUniform4fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, \
+            glUniform1fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, \
+            glUniform2fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, \
+            glUniform3fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, \
+            glUniform4fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, \
+            glUniform1ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, \
+            glUniform2ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, \
+            glUniform3ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, \
+            glUniform4ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, \
+            glUniformMatrix2fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, \
+            glUniformMatrix3fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, \
+            glUniformMatrix4fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, \
+            glGetUniformfvARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, \
+            glGetUniformivARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, \
+            glGetInfoLogARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, \
+            glUseProgramObjectARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, \
+            glCreateShaderObjectARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, \
+            glShaderSourceARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, \
+            glCompileShaderARB,                         ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, \
+            glCreateProgramObjectARB,                   ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, \
+            glAttachObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, \
+            glLinkProgramARB,                           ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, \
+            glDetachObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, \
+            glDeleteObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, \
+            glValidateProgramARB,                       ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, \
+            glGetAttachedObjectsARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, \
+            glGetHandleARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, \
+            glGetShaderSourceARB,                       ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, \
+            glBindAttribLocationARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, \
+            glGetAttribLocationARB,                     ARB_SHADER_OBJECTS,             NULL) \
+    /* GL_ARB_sync */ \
+    USE_GL_FUNC(PGLFNFENCESYNCPROC, \
+            glFenceSync,                                ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNISSYNCPROC, \
+            glIsSync,                                   ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNDELETESYNCPROC, \
+            glDeleteSync,                               ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNCLIENTWAITSYNCPROC, \
+            glClientWaitSync,                           ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNWAITSYNCPROC, \
+            glWaitSync,                                 ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNGETINTEGER64VPROC, \
+            glGetInteger64v,                            ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNGETSYNCIVPROC, \
+            glGetSynciv,                                ARB_SYNC,                       NULL) \
     /* GL_ARB_texture_compression */ \
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC,                      glCompressedTexImage2DARB,                  ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC,                      glCompressedTexImage3DARB,                  ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC,                   glCompressedTexSubImage2DARB,               ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC,                   glCompressedTexSubImage3DARB,               ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC,                     glGetCompressedTexImageARB,                 ARB_TEXTURE_COMPRESSION,NULL )\
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, \
+            glCompressedTexImage2DARB,                  ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, \
+            glCompressedTexImage3DARB,                  ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, \
+            glCompressedTexSubImage2DARB,               ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, \
+            glCompressedTexSubImage3DARB,               ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, \
+            glGetCompressedTexImageARB,                 ARB_TEXTURE_COMPRESSION,        NULL) \
     /* GL_ARB_vertex_blend */ \
-    USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB,                            glWeightPointerARB,                         ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTBV,                                    glWeightbvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTSV,                                    glWeightsvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTIV,                                    glWeightivARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTFV,                                    glWeightfvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTDV,                                    glWeightdvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUBV,                                   glWeightubvARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUSV,                                   glWeightusvARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUIV,                                   glWeightuivARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLVERTEXBLENDARB,                              glVertexBlendARB,                           ARB_VERTEX_BLEND,       NULL )\
+    USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, \
+            glWeightPointerARB,                         ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTBV, \
+            glWeightbvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTSV, \
+            glWeightsvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTIV, \
+            glWeightivARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTFV, \
+            glWeightfvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTDV, \
+            glWeightdvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUBV, \
+            glWeightubvARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUSV, \
+            glWeightusvARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUIV, \
+            glWeightuivARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, \
+            glVertexBlendARB,                           ARB_VERTEX_BLEND,               NULL) \
     /* GL_ARB_vertex_buffer_object */ \
-    USE_GL_FUNC(PGLFNBINDBUFFERARBPROC,                             glBindBufferARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC,                          glDeleteBuffersARB,                         ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGENBUFFERSARBPROC,                             glGenBuffersARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNISBUFFERARBPROC,                               glIsBufferARB,                              ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNBUFFERDATAARBPROC,                             glBufferDataARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC,                          glBufferSubDataARB,                         ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC,                       glGetBufferSubDataARB,                      ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNMAPBUFFERARBPROC,                              glMapBufferARB,                             ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC,                            glUnmapBufferARB,                           ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC,                   glGetBufferParameterivARB,                  ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC,                      glGetBufferPointervARB,                     ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    /** EXT Extensions **/ \
+    USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, \
+            glBindBufferARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, \
+            glDeleteBuffersARB,                         ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, \
+            glGenBuffersARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNISBUFFERARBPROC, \
+            glIsBufferARB,                              ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, \
+            glBufferDataARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, \
+            glBufferSubDataARB,                         ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, \
+            glGetBufferSubDataARB,                      ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, \
+            glMapBufferARB,                             ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, \
+            glUnmapBufferARB,                           ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, \
+            glGetBufferParameterivARB,                  ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, \
+            glGetBufferPointervARB,                     ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    /* GL_ARB_vertex_program */ \
+    USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, \
+            glGenProgramsARB,                           ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, \
+            glBindProgramARB,                           ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, \
+            glProgramStringARB,                         ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, \
+            glDeleteProgramsARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, \
+            glProgramEnvParameter4fvARB,                ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, \
+            glProgramLocalParameter4fvARB,              ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, \
+            glVertexAttribPointerARB,                   ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, \
+            glEnableVertexAttribArrayARB,               ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, \
+            glDisableVertexAttribArrayARB,              ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, \
+            glVertexAttrib1dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, \
+            glVertexAttrib1dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, \
+            glVertexAttrib1fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, \
+            glVertexAttrib1fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, \
+            glVertexAttrib1sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, \
+            glVertexAttrib1svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, \
+            glVertexAttrib2dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, \
+            glVertexAttrib2dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, \
+            glVertexAttrib2fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, \
+            glVertexAttrib2fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, \
+            glVertexAttrib2sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, \
+            glVertexAttrib2svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, \
+            glVertexAttrib3dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, \
+            glVertexAttrib3dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, \
+            glVertexAttrib3fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, \
+            glVertexAttrib3fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, \
+            glVertexAttrib3sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, \
+            glVertexAttrib3svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, \
+            glVertexAttrib4NbvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, \
+            glVertexAttrib4NivARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, \
+            glVertexAttrib4NsvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, \
+            glVertexAttrib4NubARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, \
+            glVertexAttrib4NubvARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, \
+            glVertexAttrib4NuivARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, \
+            glVertexAttrib4NusvARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, \
+            glVertexAttrib4bvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, \
+            glVertexAttrib4dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, \
+            glVertexAttrib4dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, \
+            glVertexAttrib4fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, \
+            glVertexAttrib4fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, \
+            glVertexAttrib4ivARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, \
+            glVertexAttrib4sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, \
+            glVertexAttrib4svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, \
+            glVertexAttrib4ubvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, \
+            glVertexAttrib4uivARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, \
+            glVertexAttrib4usvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, \
+            glGetProgramivARB,                          ARB_VERTEX_PROGRAM,             NULL) \
+    /* GL_ATI_fragment_shader */ \
+    USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, \
+            glGenFragmentShadersATI,                    ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, \
+            glBindFragmentShaderATI,                    ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, \
+            glDeleteFragmentShaderATI,                  ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, \
+            glBeginFragmentShaderATI,                   ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, \
+            glEndFragmentShaderATI,                     ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNPASSTEXCOORDATI, \
+            glPassTexCoordATI,                          ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNSAMPLEMAPATI, \
+            glSampleMapATI,                             ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, \
+            glColorFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, \
+            glColorFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, \
+            glColorFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, \
+            glAlphaFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, \
+            glAlphaFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, \
+            glAlphaFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, \
+            glSetFragmentShaderConstantATI,             ATI_FRAGMENT_SHADER,            NULL) \
+    /* GL_ATI_separate_stencil */ \
+    USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, \
+            glStencilOpSeparateATI,                     ATI_SEPARATE_STENCIL,           NULL) \
+    USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, \
+            glStencilFuncSeparateATI,                   ATI_SEPARATE_STENCIL,           NULL) \
     /* GL_EXT_blend_equation_separate */ \
-    USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC,                      glBlendFuncSeparateEXT,                     EXT_BLEND_FUNC_SEPARATE, NULL)\
+    USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, \
+            glBlendFuncSeparateEXT,                     EXT_BLEND_FUNC_SEPARATE,        NULL) \
     /* GL_EXT_blend_func_separate */ \
-    USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC,                  glBlendEquationSeparateEXT,                 EXT_BLEND_EQUATION_SEPARATE, NULL)\
+    USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \
+            glBlendEquationSeparateEXT,                 EXT_BLEND_EQUATION_SEPARATE,    NULL) \
     /* GL_EXT_fog_coord */ \
-    USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC,                            glFogCoordfEXT,                             EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC,                           glFogCoordfvEXT,                            EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC,                            glFogCoorddEXT,                             EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC,                           glFogCoorddvEXT,                            EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC,                      glFogCoordPointerEXT,                       EXT_FOG_COORD,          NULL )\
-    /* GL_EXT_framebuffer_object */ \
-    USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC,                       glIsRenderbufferEXT,                        EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC,                     glBindRenderbufferEXT,                      EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC,                  glDeleteRenderbuffersEXT,                   EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC,                     glGenRenderbuffersEXT,                      EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC,                  glRenderbufferStorageEXT,                   EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC,                        glIsFramebufferEXT,                         EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC,                      glBindFramebufferEXT,                       EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC,                   glDeleteFramebuffersEXT,                    EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC,                      glGenFramebuffersEXT,                       EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC,               glCheckFramebufferStatusEXT,                EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC,                 glFramebufferTexture1DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC,                 glFramebufferTexture2DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC,                 glFramebufferTexture3DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC,              glFramebufferRenderbufferEXT,               EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC,                       glGenerateMipmapEXT,                        EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC,           glGetRenderbufferParameterivEXT,            EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC,  glGetFramebufferAttachmentParameterivEXT,   EXT_FRAMEBUFFER_OBJECT, NULL )\
+    USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \
+            glFogCoordfEXT,                             EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, \
+            glFogCoordfvEXT,                            EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, \
+            glFogCoorddEXT,                             EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, \
+            glFogCoorddvEXT,                            EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, \
+            glFogCoordPointerEXT,                       EXT_FOG_COORD,                  NULL) \
     /* GL_EXT_framebuffer_blit */ \
-    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC,                      glBlitFramebufferEXT,                       EXT_FRAMEBUFFER_BLIT,   NULL )\
+    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, \
+            glBlitFramebufferEXT,                       EXT_FRAMEBUFFER_BLIT,           NULL) \
     /* GL_EXT_framebuffer_multisample */ \
-    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC,         glRenderbufferStorageMultisampleEXT,        EXT_FRAMEBUFFER_MULTISAMPLE, NULL )\
+    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, \
+            glRenderbufferStorageMultisampleEXT,        EXT_FRAMEBUFFER_MULTISAMPLE,    NULL) \
+    /* GL_EXT_framebuffer_object */ \
+    USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, \
+            glIsRenderbufferEXT,                        EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, \
+            glBindRenderbufferEXT,                      EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, \
+            glDeleteRenderbuffersEXT,                   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, \
+            glGenRenderbuffersEXT,                      EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, \
+            glRenderbufferStorageEXT,                   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, \
+            glIsFramebufferEXT,                         EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, \
+            glBindFramebufferEXT,                       EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, \
+            glDeleteFramebuffersEXT,                    EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, \
+            glGenFramebuffersEXT,                       EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, \
+            glCheckFramebufferStatusEXT,                EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, \
+            glFramebufferTexture1DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, \
+            glFramebufferTexture2DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, \
+            glFramebufferTexture3DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, \
+            glFramebufferRenderbufferEXT,               EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, \
+            glGenerateMipmapEXT,                        EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, \
+            glGetRenderbufferParameterivEXT,            EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, \
+            glGetFramebufferAttachmentParameterivEXT,   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    /* GL_EXT_gpu_program_parameters */ \
+    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, \
+            glProgramEnvParameters4fvEXT,               EXT_GPU_PROGRAM_PARAMETERS,     NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, \
+            glProgramLocalParameters4fvEXT,             EXT_GPU_PROGRAM_PARAMETERS,     NULL) \
+    /* GL_EXT_gpu_shader4 */\
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1IEXTPROC, \
+            glVertexAttribI1iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2IEXTPROC, \
+            glVertexAttribI2iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3IEXTPROC, \
+            glVertexAttribI3iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4IEXTPROC, \
+            glVertexAttribI4iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIEXTPROC, \
+            glVertexAttribI1uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIEXTPROC, \
+            glVertexAttribI2uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIEXTPROC, \
+            glVertexAttribI3uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIEXTPROC, \
+            glVertexAttribI4uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1IVEXTPROC, \
+            glVertexAttribI1ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2IVEXTPROC, \
+            glVertexAttribI2ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3IVEXTPROC, \
+            glVertexAttribI3ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4IVEXTPROC, \
+            glVertexAttribI4ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIVEXTPROC, \
+            glVertexAttribI1uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIVEXTPROC, \
+            glVertexAttribI2uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIVEXTPROC, \
+            glVertexAttribI3uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIVEXTPROC, \
+            glVertexAttribI4uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4BVEXTPROC, \
+            glVertexAttribI4bvEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4SVEXTPROC, \
+            glVertexAttribI4svEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UBVEXTPROC, \
+            glVertexAttribI4ubvEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4USVEXTPROC, \
+            glVertexAttribI4usvEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBIPOINTEREXTPROC, \
+            glVertexAttribIPointerEXT,                  EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETVERTEXATTRIBIIVEXTPROC, \
+            glVertexAttribIivEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETVERTEXATTRIBIUIVEXTPROC, \
+            glVertexAttribIuivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM1UIEXTPROC, \
+            glUniform1uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM2UIEXTPROC, \
+            glUniform2uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM3UIEXTPROC, \
+            glUniform3uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM4UIEXTPROC, \
+            glUniform4uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM1UIVEXTPROC, \
+            glUniform1uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM2UIVEXTPROC, \
+            glUniform2uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM3UIVEXTPROC, \
+            glUniform3uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM4UIVEXTPROC, \
+            glUniform4uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETUNIFORMUIVEXTPROC, \
+            glGetUniformuivEXT,                         EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNBINDFRAGDATALOCATIONEXTPROC, \
+            glBindFragDataLocationEXT,                  EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETFRAGDATALOCATIONEXTPROC, \
+            glGetFragDataLocationEXT,                   EXT_GPU_SHADER4,                NULL) \
     /* GL_EXT_paletted_texture */ \
-    USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC,                           glColorTableEXT,                            EXT_PALETTED_TEXTURE,   NULL )\
+    USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, \
+            glColorTableEXT,                            EXT_PALETTED_TEXTURE,           NULL) \
     /* GL_EXT_point_parameters */ \
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC,                      glPointParameterfEXT,                       EXT_POINT_PARAMETERS,   NULL )\
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC,                     glPointParameterfvEXT,                      EXT_POINT_PARAMETERS,   NULL )\
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, \
+            glPointParameterfEXT,                       EXT_POINT_PARAMETERS,           NULL) \
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, \
+            glPointParameterfvEXT,                      EXT_POINT_PARAMETERS,           NULL) \
     /* GL_EXT_provoking_vertex */ \
-    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC,                      glProvokingVertexEXT,                       EXT_PROVOKING_VERTEX,   NULL)\
+    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC, \
+            glProvokingVertexEXT,                       EXT_PROVOKING_VERTEX,           NULL) \
     /* GL_EXT_secondary_color */ \
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC,                    glSecondaryColor3ubEXT,                     EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC,                   glSecondaryColor3ubvEXT,                    EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC,                     glSecondaryColor3fEXT,                      EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC,                    glSecondaryColor3fvEXT,                     EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC,                glSecondaryColorPointerEXT,                 EXT_SECONDARY_COLOR,    NULL )\
-    /* GL_EXT_texture3D */ \
-    USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC,                           glTexImage3DEXT,                            EXT_TEXTURE3D,          glTexImage3D)\
-    USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC,                        glTexSubImage3DEXT,                         EXT_TEXTURE3D,          glTexSubImage3D)\
-    /* GL_ARB_vertex_program */ \
-    USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC,                            glGenProgramsARB,                           ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC,                            glBindProgramARB,                           ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC,                          glProgramStringARB,                         ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC,                         glDeleteProgramsARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC,                 glProgramEnvParameter4fvARB,                ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC,               glProgramLocalParameter4fvARB,                ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC,                    glVertexAttribPointerARB,                   ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC,                glEnableVertexAttribArrayARB,               ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC,               glDisableVertexAttribArrayARB,              ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC,                         glVertexAttrib1dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC,                        glVertexAttrib1dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC,                         glVertexAttrib1fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC,                        glVertexAttrib1fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC,                         glVertexAttrib1sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC,                        glVertexAttrib1svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC,                         glVertexAttrib2dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC,                        glVertexAttrib2dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC,                         glVertexAttrib2fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC,                        glVertexAttrib2fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC,                         glVertexAttrib2sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC,                        glVertexAttrib2svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC,                         glVertexAttrib3dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC,                        glVertexAttrib3dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC,                         glVertexAttrib3fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC,                        glVertexAttrib3fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC,                         glVertexAttrib3sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC,                        glVertexAttrib3svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC,                       glVertexAttrib4NbvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC,                       glVertexAttrib4NivARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC,                       glVertexAttrib4NsvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC,                       glVertexAttrib4NubARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC,                      glVertexAttrib4NubvARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC,                      glVertexAttrib4NuivARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC,                      glVertexAttrib4NusvARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC,                        glVertexAttrib4bvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC,                         glVertexAttrib4dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC,                        glVertexAttrib4dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC,                         glVertexAttrib4fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC,                        glVertexAttrib4fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC,                        glVertexAttrib4ivARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC,                         glVertexAttrib4sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC,                        glVertexAttrib4svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC,                       glVertexAttrib4ubvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC,                       glVertexAttrib4uivARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC,                       glVertexAttrib4usvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC,                           glGetProgramivARB,                          ARB_VERTEX_PROGRAM,     NULL )\
-    /* GL_ARB_shader_objects */ \
-    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC,           glGetObjectParameterivARB,                  ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC,           glGetObjectParameterfvARB,                  ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC,             glGetUniformLocationARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC,               glGetActiveUniformARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC,                      glUniform1iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC,                      glUniform2iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC,                      glUniform3iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC,                      glUniform4iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC,                      glUniform1fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC,                      glUniform2fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC,                      glUniform3fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC,                      glUniform4fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC,                     glUniform1fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC,                     glUniform2fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC,                     glUniform3fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC,                     glUniform4fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC,                     glUniform1ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC,                     glUniform2ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC,                     glUniform3ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC,                     glUniform4ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC,               glUniformMatrix2fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC,               glUniformMatrix3fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC,               glUniformMatrix4fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC,                   glGetUniformfvARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC,                   glGetUniformivARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC,                     glGetInfoLogARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC,               glUseProgramObjectARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC,             glCreateShaderObjectARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC,                   glShaderSourceARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC,                  glCompileShaderARB,                         ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC,            glCreateProgramObjectARB,                   ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC,                   glAttachObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC,                    glLinkProgramARB,                           ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC,                   glDetachObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC,                   glDeleteObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC,                glValidateProgramARB,                       ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC,             glGetAttachedObjectsARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC,                      glGetHandleARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC,                glGetShaderSourceARB,                       ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC,             glBindAttribLocationARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC,              glGetAttribLocationARB,                     ARB_SHADER_OBJECTS,     NULL )\
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, \
+            glSecondaryColor3ubEXT,                     EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC, \
+            glSecondaryColor3ubvEXT,                    EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, \
+            glSecondaryColor3fEXT,                      EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, \
+            glSecondaryColor3fvEXT,                     EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, \
+            glSecondaryColorPointerEXT,                 EXT_SECONDARY_COLOR,            NULL) \
     /* GL_EXT_stencil_two_side */ \
-    USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC,                      glActiveStencilFaceEXT,                     EXT_STENCIL_TWO_SIDE,   NULL )\
-    /* GL_ATI_separate_stencil */ \
-    USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC,                      glStencilOpSeparateATI,                     ATI_SEPARATE_STENCIL,   NULL )\
-    USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC,                    glStencilFuncSeparateATI,                   ATI_SEPARATE_STENCIL,   NULL )\
+    USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, \
+            glActiveStencilFaceEXT,                     EXT_STENCIL_TWO_SIDE,           NULL) \
+    /* GL_EXT_texture3D */ \
+    USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, \
+            glTexImage3DEXT,                            EXT_TEXTURE3D,                  glTexImage3D) \
+    USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, \
+            glTexSubImage3DEXT,                         EXT_TEXTURE3D,                  glTexSubImage3D) \
+    /* GL_NV_fence */ \
+    USE_GL_FUNC(PGLFNGENFENCESNVPROC, \
+            glGenFencesNV,                              NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, \
+            glDeleteFencesNV,                           NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNSETFENCENVPROC,    \
+            glSetFenceNV,                               NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNTESTFENCENVPROC, \
+            glTestFenceNV,                              NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNFINISHFENCENVPROC, \
+            glFinishFenceNV,                            NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNISFENCENVPROC, \
+            glIsFenceNV,                                NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, \
+            glGetFenceivNV,                             NV_FENCE,                       NULL) \
     /* GL_NV_half_float */ \
-    USE_GL_FUNC(PGLFNVERTEX2HNVPROC,                                glVertex2hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX2HVNVPROC,                               glVertex2hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX3HNVPROC,                                glVertex3hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX3HVNVPROC,                               glVertex3hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX4HNVPROC,                                glVertex4hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX4HVNVPROC,                               glVertex4hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNNORMAL3HNVPROC,                                glNormal3hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNNORMAL3HVNVPROC,                               glNormal3hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR3HNVPROC,                                 glColor3hNV,                                NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR3HVNVPROC,                                glColor3hvNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR4HNVPROC,                                 glColor4hNV,                                NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR4HVNVPROC,                                glColor4hvNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC,                              glTexCoord1hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC,                             glTexCoord1hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC,                              glTexCoord2hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC,                             glTexCoord2hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC,                              glTexCoord3hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC,                             glTexCoord3hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC,                              glTexCoord4hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC,                             glTexCoord4hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC,                         glMultiTexCoord1hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC,                        glMultiTexCoord1hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC,                         glMultiTexCoord2hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC,                        glMultiTexCoord2hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC,                         glMultiTexCoord3hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC,                        glMultiTexCoord3hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC,                         glMultiTexCoord4hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC,                        glMultiTexCoord4hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNFOGCOORDHNVPROC,                               glFogCoordhNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC,                              glFogCoordhvNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC,                        glSecondaryColor3hNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC,                       glSecondaryColor3hvNV,                      NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC,                           glVertexWeighthNV,                          NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC,                          glVertexWeighthvNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC,                          glVertexAttrib1hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC,                         glVertexAttrib1hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC,                          glVertexAttrib2hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC,                         glVertexAttrib2hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC,                          glVertexAttrib3hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC,                         glVertexAttrib3hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC,                          glVertexAttrib4hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC,                         glVertexAttrib4hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC,                        glVertexAttribs1hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC,                        glVertexAttribs2hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC,                        glVertexAttribs3hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC,                        glVertexAttribs4hvNV,                       NV_HALF_FLOAT,          NULL )\
+    USE_GL_FUNC(PGLFNVERTEX2HNVPROC, \
+            glVertex2hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, \
+            glVertex2hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX3HNVPROC, \
+            glVertex3hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, \
+            glVertex3hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX4HNVPROC, \
+            glVertex4hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, \
+            glVertex4hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNNORMAL3HNVPROC, \
+            glNormal3hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, \
+            glNormal3hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR3HNVPROC, \
+            glColor3hNV,                                NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, \
+            glColor3hvNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR4HNVPROC, \
+            glColor4hNV,                                NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, \
+            glColor4hvNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, \
+            glTexCoord1hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, \
+            glTexCoord1hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, \
+            glTexCoord2hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, \
+            glTexCoord2hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, \
+            glTexCoord3hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, \
+            glTexCoord3hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, \
+            glTexCoord4hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, \
+            glTexCoord4hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, \
+            glMultiTexCoord1hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, \
+            glMultiTexCoord1hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, \
+            glMultiTexCoord2hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, \
+            glMultiTexCoord2hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, \
+            glMultiTexCoord3hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, \
+            glMultiTexCoord3hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, \
+            glMultiTexCoord4hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, \
+            glMultiTexCoord4hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, \
+            glFogCoordhNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, \
+            glFogCoordhvNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, \
+            glSecondaryColor3hNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, \
+            glSecondaryColor3hvNV,                      NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, \
+            glVertexWeighthNV,                          NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, \
+            glVertexWeighthvNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, \
+            glVertexAttrib1hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, \
+            glVertexAttrib1hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, \
+            glVertexAttrib2hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, \
+            glVertexAttrib2hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, \
+            glVertexAttrib3hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, \
+            glVertexAttrib3hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, \
+            glVertexAttrib4hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, \
+            glVertexAttrib4hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, \
+            glVertexAttribs1hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, \
+            glVertexAttribs2hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, \
+            glVertexAttribs3hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \
+            glVertexAttribs4hvNV,                       NV_HALF_FLOAT,                  NULL) \
     /* GL_NV_register_combiners */ \
-    USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC,                           glCombinerInputNV,                          NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC,                          glCombinerOutputNV,                         NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC,                      glCombinerParameterfNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC,                     glCombinerParameterfvNV,                    NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC,                      glCombinerParameteriNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC,                     glCombinerParameterivNV,                    NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC,                      glFinalCombinerInputNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    /* GL_NV_fence */ \
-    USE_GL_FUNC(PGLFNGENFENCESNVPROC,                               glGenFencesNV,                              NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNDELETEFENCESNVPROC,                            glDeleteFencesNV,                           NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNSETFENCENVPROC,                                glSetFenceNV,                               NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNTESTFENCENVPROC,                               glTestFenceNV,                              NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNFINISHFENCENVPROC,                             glFinishFenceNV,                            NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNISFENCENVPROC,                                 glIsFenceNV,                                NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNGETFENCEIVNVPROC,                              glGetFenceivNV,                             NV_FENCE,               NULL )\
-    /* GL_APPLE_fence */ \
-    USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC,                            glGenFencesAPPLE,                           APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC,                         glDeleteFencesAPPLE,                        APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC,                             glSetFenceAPPLE,                            APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC,                            glTestFenceAPPLE,                           APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC,                          glFinishFenceAPPLE,                         APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNISFENCEAPPLEPROC,                              glIsFenceAPPLE,                             APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC,                           glTestObjectAPPLE,                          APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC,                         glFinishObjectAPPLE,                        APPLE_FENCE,            NULL )\
+    USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \
+            glCombinerInputNV,                          NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, \
+            glCombinerOutputNV,                         NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, \
+            glCombinerParameterfNV,                     NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, \
+            glCombinerParameterfvNV,                    NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, \
+            glCombinerParameteriNV,                     NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, \
+            glCombinerParameterivNV,                    NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, \
+            glFinalCombinerInputNV,                     NV_REGISTER_COMBINERS,          NULL) \
     /* GLX_SGI_video_sync */ \
-    USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC,                          glXGetVideoSyncSGI,                         SGI_VIDEO_SYNC,         NULL )\
-    USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC,                         glXWaitVideoSyncSGI,                        SGI_VIDEO_SYNC,         NULL )\
-    /* GL_APPLE_flush_render */ \
-    USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC,                          glFlushRenderAPPLE,                         APPLE_FLUSH_RENDER,     NULL )\
-    USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC,                         glFinishRenderAPPLE,                        APPLE_FLUSH_RENDER,     NULL )\
-    /* GL_EXT_gpu_program_parameters */ \
-    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC,                glProgramEnvParameters4fvEXT,            EXT_GPU_PROGRAM_PARAMETERS,NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC,              glProgramLocalParameters4fvEXT,          EXT_GPU_PROGRAM_PARAMETERS,NULL )\
-    /* GL_ATI_fragment_shader */ \
-    USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI,                         glGenFragmentShadersATI,                    ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI,                         glBindFragmentShaderATI,                    ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI,                       glDeleteFragmentShaderATI,                  ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI,                        glBeginFragmentShaderATI,                   ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI,                          glEndFragmentShaderATI,                     ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNPASSTEXCOORDATI,                               glPassTexCoordATI,                          ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNSAMPLEMAPATI,                                  glSampleMapATI,                             ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI,                           glColorFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI,                           glColorFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI,                           glColorFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI,                           glAlphaFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI,                           glAlphaFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI,                           glAlphaFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI,                  glSetFragmentShaderConstantATI,             ATI_FRAGMENT_SHADER,    NULL )\
-    /* GL_APPLE_flush_buffer_range */ \
-    USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE,                         glBufferParameteriAPPLE,                    APPLE_FLUSH_BUFFER_RANGE,NULL)\
-    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE,                   glFlushMappedBufferRangeAPPLE,              APPLE_FLUSH_BUFFER_RANGE,NULL)
-
-
-/****************************************************
- * OpenGL WGL defines and functions pointer
- ****************************************************/
-
-/* WGL_ARB_extensions_string */
-typedef const char * (WINAPI * WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
-/* WGL_ARB_multisample */
-#ifndef WGL_ARB_multisample
-#define WGL_SAMPLE_BUFFERS_ARB         0x2041
-#define WGL_SAMPLES_ARB                0x2042
-#endif
-/* WGL_ARB_pixel_format */
-#ifndef WGL_ARB_pixel_format
-#define WGL_ARB_pixel_format 1
-#define WGL_NUMBER_PIXEL_FORMATS_ARB   0x2000
-#define WGL_DRAW_TO_WINDOW_ARB         0x2001
-#define WGL_DRAW_TO_BITMAP_ARB         0x2002
-#define WGL_ACCELERATION_ARB           0x2003
-#define WGL_NEED_PALETTE_ARB           0x2004
-#define WGL_NEED_SYSTEM_PALETTE_ARB    0x2005
-#define WGL_SWAP_LAYER_BUFFERS_ARB     0x2006
-#define WGL_SWAP_METHOD_ARB            0x2007
-#define WGL_NUMBER_OVERLAYS_ARB        0x2008
-#define WGL_NUMBER_UNDERLAYS_ARB       0x2009
-#define WGL_TRANSPARENT_ARB            0x200A
-#define WGL_TRANSPARENT_RED_VALUE_ARB  0x2037
-#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
-#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
-#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
-#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
-#define WGL_SHARE_DEPTH_ARB            0x200C
-#define WGL_SHARE_STENCIL_ARB          0x200D
-#define WGL_SHARE_ACCUM_ARB            0x200E
-#define WGL_SUPPORT_GDI_ARB            0x200F
-#define WGL_SUPPORT_OPENGL_ARB         0x2010
-#define WGL_DOUBLE_BUFFER_ARB          0x2011
-#define WGL_STEREO_ARB                 0x2012
-#define WGL_PIXEL_TYPE_ARB             0x2013
-#define WGL_COLOR_BITS_ARB             0x2014
-#define WGL_RED_BITS_ARB               0x2015
-#define WGL_RED_SHIFT_ARB              0x2016
-#define WGL_GREEN_BITS_ARB             0x2017
-#define WGL_GREEN_SHIFT_ARB            0x2018
-#define WGL_BLUE_BITS_ARB              0x2019
-#define WGL_BLUE_SHIFT_ARB             0x201A
-#define WGL_ALPHA_BITS_ARB             0x201B
-#define WGL_ALPHA_SHIFT_ARB            0x201C
-#define WGL_ACCUM_BITS_ARB             0x201D
-#define WGL_ACCUM_RED_BITS_ARB         0x201E
-#define WGL_ACCUM_GREEN_BITS_ARB       0x201F
-#define WGL_ACCUM_BLUE_BITS_ARB        0x2020
-#define WGL_ACCUM_ALPHA_BITS_ARB       0x2021
-#define WGL_DEPTH_BITS_ARB             0x2022
-#define WGL_STENCIL_BITS_ARB           0x2023
-#define WGL_AUX_BUFFERS_ARB            0x2024
-#define WGL_NO_ACCELERATION_ARB        0x2025
-#define WGL_GENERIC_ACCELERATION_ARB   0x2026
-#define WGL_FULL_ACCELERATION_ARB      0x2027
-#define WGL_SWAP_EXCHANGE_ARB          0x2028
-#define WGL_SWAP_COPY_ARB              0x2029
-#define WGL_SWAP_UNDEFINED_ARB         0x202A
-#define WGL_TYPE_RGBA_ARB              0x202B
-#define WGL_TYPE_COLORINDEX_ARB        0x202C
-#endif
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
-/* WGL_ARB_make_current_read */
-typedef BOOL (WINAPI * WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETCURRENTREADDCARBPROC) (void);
-/* WGL_ARB_pbuffer */
-#ifndef WGL_ARB_pbuffer
-#define WGL_ARB_pbuffer 1
-#define WGL_DRAW_TO_PBUFFER_ARB        0x202D
-#define WGL_MAX_PBUFFER_PIXELS_ARB     0x202E
-#define WGL_MAX_PBUFFER_WIDTH_ARB      0x202F
-#define WGL_MAX_PBUFFER_HEIGHT_ARB     0x2030
-#define WGL_PBUFFER_LARGEST_ARB        0x2033
-#define WGL_PBUFFER_WIDTH_ARB          0x2034
-#define WGL_PBUFFER_HEIGHT_ARB         0x2035
-#define WGL_PBUFFER_LOST_ARB           0x2036
-#endif
-DECLARE_HANDLE(HPBUFFERARB);
-typedef HPBUFFERARB (WINAPI * WINED3D_PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
-typedef int (WINAPI * WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
-typedef BOOL (WINAPI * WINED3D_PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
-typedef BOOL (WINAPI * WINED3D_PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
-#ifndef WGL_ARB_pixel_format_float
-#define WGL_ARB_pixel_format_float 1
-#define WGL_TYPE_RGBA_FLOAT_ARB        0x21A0
-#endif
-/* WGL_WINE_pixel_format_passthrough */
-typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR* ppfd);
+    USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, \
+            glXGetVideoSyncSGI,                         SGI_VIDEO_SYNC,                 NULL) \
+    USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, \
+            glXWaitVideoSyncSGI,                        SGI_VIDEO_SYNC,                 NULL)
 
 #define WGL_EXT_FUNCS_GEN \
-    USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC, wglMakeContextCurrentARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETCURRENTREADDCARBPROC, wglGetCurrentReadDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
-
-
-/****************************************************
- * Structures
- ****************************************************/
-
-struct wined3d_fbo_ops
-{
-    PGLFNGLISRENDERBUFFERPROC                       glIsRenderbuffer;
-    PGLFNGLBINDRENDERBUFFERPROC                     glBindRenderbuffer;
-    PGLFNGLDELETERENDERBUFFERSPROC                  glDeleteRenderbuffers;
-    PGLFNGLGENRENDERBUFFERSPROC                     glGenRenderbuffers;
-    PGLFNGLRENDERBUFFERSTORAGEPROC                  glRenderbufferStorage;
-    PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC         glRenderbufferStorageMultisample;
-    PGLFNGLGETRENDERBUFFERPARAMETERIVPROC           glGetRenderbufferParameteriv;
-    PGLFNGLISFRAMEBUFFERPROC                        glIsFramebuffer;
-    PGLFNGLBINDFRAMEBUFFERPROC                      glBindFramebuffer;
-    PGLFNGLDELETEFRAMEBUFFERSPROC                   glDeleteFramebuffers;
-    PGLFNGLGENFRAMEBUFFERSPROC                      glGenFramebuffers;
-    PGLFNGLCHECKFRAMEBUFFERSTATUSPROC               glCheckFramebufferStatus;
-    PGLFNGLFRAMEBUFFERTEXTURE1DPROC                 glFramebufferTexture1D;
-    PGLFNGLFRAMEBUFFERTEXTURE2DPROC                 glFramebufferTexture2D;
-    PGLFNGLFRAMEBUFFERTEXTURE3DPROC                 glFramebufferTexture3D;
-    PGLFNGLFRAMEBUFFERRENDERBUFFERPROC              glFramebufferRenderbuffer;
-    PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC  glGetFramebufferAttachmentParameteriv;
-    PGLFNGLBLITFRAMEBUFFERPROC                      glBlitFramebuffer;
-    PGLFNGLGENERATEMIPMAPPROC                       glGenerateMipmap;
-};
-
-struct wined3d_gl_limits
-{
-    UINT buffers;
-    UINT lights;
-    UINT textures;
-    UINT texture_stages;
-    UINT fragment_samplers;
-    UINT vertex_samplers;
-    UINT combined_samplers;
-    UINT sampler_stages;
-    UINT clipplanes;
-    UINT texture_size;
-    UINT texture3d_size;
-    float pointsize_max;
-    float pointsize_min;
-    UINT point_sprite_units;
-    UINT blends;
-    UINT anisotropy;
-    float shininess;
-
-    UINT glsl_varyings;
-    UINT glsl_vs_float_constants;
-    UINT glsl_ps_float_constants;
-
-    UINT arb_vs_float_constants;
-    UINT arb_vs_native_constants;
-    UINT arb_vs_instructions;
-    UINT arb_vs_temps;
-    UINT arb_ps_float_constants;
-    UINT arb_ps_local_constants;
-    UINT arb_ps_native_constants;
-    UINT arb_ps_instructions;
-    UINT arb_ps_temps;
-};
-
-#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
-
-struct wined3d_gl_info
-{
-    UINT vidmem;
-    struct wined3d_gl_limits limits;
-    DWORD reserved_glsl_constants;
-    DWORD quirks;
-    BOOL supported[WINED3D_GL_EXT_COUNT];
-    GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
-
-    struct wined3d_fbo_ops fbo_ops;
-    /* GL function pointers */
-    GL_EXT_FUNCS_GEN
-    /* WGL function pointers */
-    WGL_EXT_FUNCS_GEN
-
-    struct GlPixelFormatDesc *gl_formats;
-};
-
-#undef USE_GL_FUNC
+    USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC,       wglGetExtensionsStringARB,      0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC,    wglGetPixelFormatAttribivARB,   0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC,    wglGetPixelFormatAttribfvARB,   0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC,         wglChoosePixelFormatARB,        0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC,             wglCreatePbufferARB,            0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC,              wglGetPbufferDCARB,             0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC,          wglReleasePbufferDCARB,         0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC,            wglDestroyPbufferARB,           0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC,              wglQueryPbufferARB,             0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE,               wglSetPixelFormatWINE,          0, NULL)
 
 #endif /* __WINE_WINED3D_GL */
index de0bcdc..1d5cd97 100644 (file)
@@ -61,15 +61,16 @@ enum fixup_channel_source
     CHANNEL_SOURCE_Y = 3,
     CHANNEL_SOURCE_Z = 4,
     CHANNEL_SOURCE_W = 5,
-    CHANNEL_SOURCE_YUV0 = 6,
-    CHANNEL_SOURCE_YUV1 = 7,
+    CHANNEL_SOURCE_COMPLEX0 = 6,
+    CHANNEL_SOURCE_COMPLEX1 = 7,
 };
 
-enum yuv_fixup
+enum complex_fixup
 {
-    YUV_FIXUP_YUY2 = 0,
-    YUV_FIXUP_UYVY = 1,
-    YUV_FIXUP_YV12 = 2,
+    COMPLEX_FIXUP_YUY2 = 0,
+    COMPLEX_FIXUP_UYVY = 1,
+    COMPLEX_FIXUP_YV12 = 2,
+    COMPLEX_FIXUP_P8   = 3,
 };
 
 #include <pshpack2.h>
@@ -103,14 +104,14 @@ static inline struct color_fixup_desc create_color_fixup_desc(
     return fixup;
 }
 
-static inline struct color_fixup_desc create_yuv_fixup_desc(enum yuv_fixup yuv_fixup)
+static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup)
 {
     struct color_fixup_desc fixup =
     {
-        0, yuv_fixup & (1 << 0) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 1) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 2) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 3) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
+        0, complex_fixup & (1 << 0) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 1) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 2) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 3) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
     };
     return fixup;
 }
@@ -120,19 +121,19 @@ static inline BOOL is_identity_fixup(struct color_fixup_desc fixup)
     return !memcmp(&fixup, &COLOR_FIXUP_IDENTITY, sizeof(fixup));
 }
 
-static inline BOOL is_yuv_fixup(struct color_fixup_desc fixup)
+static inline BOOL is_complex_fixup(struct color_fixup_desc fixup)
 {
-    return fixup.x_source == CHANNEL_SOURCE_YUV0 || fixup.x_source == CHANNEL_SOURCE_YUV1;
+    return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1;
 }
 
-static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup)
+static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup)
 {
-    enum yuv_fixup yuv_fixup = 0;
-    if (fixup.x_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 0);
-    if (fixup.y_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 1);
-    if (fixup.z_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 2);
-    if (fixup.w_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 3);
-    return yuv_fixup;
+    enum complex_fixup complex_fixup = 0;
+    if (fixup.x_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 0);
+    if (fixup.y_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 1);
+    if (fixup.z_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 2);
+    if (fixup.w_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 3);
+    return complex_fixup;
 }
 
 void *wined3d_rb_alloc(size_t size) DECLSPEC_HIDDEN;
@@ -410,6 +411,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
     WINED3DSIH_CMP,
     WINED3DSIH_CND,
     WINED3DSIH_CRS,
+    WINED3DSIH_CUT,
     WINED3DSIH_DCL,
     WINED3DSIH_DEF,
     WINED3DSIH_DEFB,
@@ -421,20 +423,24 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
     WINED3DSIH_DSX,
     WINED3DSIH_DSY,
     WINED3DSIH_ELSE,
+    WINED3DSIH_EMIT,
     WINED3DSIH_ENDIF,
     WINED3DSIH_ENDLOOP,
     WINED3DSIH_ENDREP,
     WINED3DSIH_EXP,
     WINED3DSIH_EXPP,
     WINED3DSIH_FRC,
+    WINED3DSIH_IADD,
     WINED3DSIH_IF,
     WINED3DSIH_IFC,
+    WINED3DSIH_IGE,
     WINED3DSIH_LABEL,
     WINED3DSIH_LIT,
     WINED3DSIH_LOG,
     WINED3DSIH_LOGP,
     WINED3DSIH_LOOP,
     WINED3DSIH_LRP,
+    WINED3DSIH_LT,
     WINED3DSIH_M3x2,
     WINED3DSIH_M3x3,
     WINED3DSIH_M3x4,
@@ -544,6 +550,7 @@ typedef struct shader_reg_maps
 struct wined3d_shader_context
 {
     IWineD3DBaseShader *shader;
+    const struct wined3d_gl_info *gl_info;
     const struct shader_reg_maps *reg_maps;
     struct wined3d_shader_buffer *buffer;
     void *backend_data;
@@ -619,7 +626,7 @@ struct wined3d_shader_frontend
     void (*shader_read_dst_param)(void *data, const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
             struct wined3d_shader_src_param *dst_rel_addr);
     void (*shader_read_semantic)(const DWORD **ptr, struct wined3d_shader_semantic *semantic);
-    void (*shader_read_comment)(const DWORD **ptr, const char **comment);
+    void (*shader_read_comment)(const DWORD **ptr, const char **comment, UINT *comment_size);
     BOOL (*shader_is_end)(void *data, const DWORD **ptr);
 };
 
@@ -714,7 +721,7 @@ typedef struct {
     HRESULT (*shader_alloc_private)(IWineD3DDevice *iface);
     void (*shader_free_private)(IWineD3DDevice *iface);
     BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface);
-    void (*shader_get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
+    void (*shader_get_caps)(const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
     BOOL (*shader_color_fixup_supported)(struct color_fixup_desc fixup);
     void (*shader_add_instruction_modifiers)(const struct wined3d_shader_instruction *ins);
 } shader_backend_t;
@@ -988,8 +995,10 @@ extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC
 #define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
 
 #define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES))
+#define STATE_IS_MATERIAL(a) ((a) == STATE_MATERIAL)
 
 #define STATE_FRONTFACE (STATE_MATERIAL + 1)
+#define STATE_IS_FRONTFACE(a) ((a) == STATE_FRONTFACE)
 
 #define STATE_HIGHEST (STATE_FRONTFACE)
 
@@ -1008,13 +1017,28 @@ struct wined3d_occlusion_query
     struct wined3d_context *context;
 };
 
+union wined3d_gl_query_object
+{
+    GLuint id;
+    GLsync sync;
+};
+
 struct wined3d_event_query
 {
     struct list entry;
-    GLuint id;
+    union wined3d_gl_query_object object;
     struct wined3d_context *context;
 };
 
+enum wined3d_event_query_result
+{
+    WINED3D_EVENT_QUERY_OK,
+    WINED3D_EVENT_QUERY_WAITING,
+    WINED3D_EVENT_QUERY_NOT_STARTED,
+    WINED3D_EVENT_QUERY_WRONG_THREAD,
+    WINED3D_EVENT_QUERY_ERROR
+};
+
 struct wined3d_context
 {
     const struct wined3d_gl_info *gl_info;
@@ -1084,7 +1108,7 @@ struct wined3d_context
     UINT free_occlusion_query_count;
     struct list occlusion_queries;
 
-    GLuint *free_event_queries;
+    union wined3d_gl_query_object *free_event_queries;
     UINT free_event_query_size;
     UINT free_event_query_count;
     struct list event_queries;
@@ -1122,7 +1146,7 @@ struct fragment_caps
 struct fragment_pipeline
 {
     void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);
-    void (*get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
+    void (*get_caps)(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
     HRESULT (*alloc_private)(IWineD3DDevice *iface);
     void (*free_private)(IWineD3DDevice *iface);
     BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
@@ -1224,7 +1248,7 @@ typedef struct WineD3D_PixelFormat
 {
     int iPixelFormat; /* WGL pixel format */
     int iPixelType; /* WGL pixel type e.g. WGL_TYPE_RGBA_ARB, WGL_TYPE_RGBA_FLOAT_ARB or WGL_TYPE_COLORINDEX_ARB */
-    int redSize, greenSize, blueSize, alphaSize;
+    int redSize, greenSize, blueSize, alphaSize, colorSize;
     int depthSize, stencilSize;
     BOOL windowDrawable;
     BOOL pbufferDrawable;
@@ -1233,13 +1257,23 @@ typedef struct WineD3D_PixelFormat
     int numSamples;
 } WineD3D_PixelFormat;
 
+enum wined3d_gl_vendor
+{
+    GL_VENDOR_WINE,
+    GL_VENDOR_APPLE,
+    GL_VENDOR_ATI,
+    GL_VENDOR_INTEL,
+    GL_VENDOR_MESA,
+    GL_VENDOR_NVIDIA,
+};
+
+
 enum wined3d_pci_vendor
 {
-    VENDOR_WINE                     = 0x0000,
-    VENDOR_MESA                     = 0x0001,
-    VENDOR_ATI                      = 0x1002,
-    VENDOR_NVIDIA                   = 0x10de,
-    VENDOR_INTEL                    = 0x8086,
+    HW_VENDOR_WINE                     = 0x0000,
+    HW_VENDOR_ATI                      = 0x1002,
+    HW_VENDOR_NVIDIA                   = 0x10de,
+    HW_VENDOR_INTEL                    = 0x8086,
 };
 
 enum wined3d_pci_device
@@ -1323,6 +1357,85 @@ enum wined3d_pci_device
     CARD_INTEL_X3100                = 0x2a02, /* Found in Macs. Same as GMA 965? */
 };
 
+struct wined3d_fbo_ops
+{
+    PGLFNGLISRENDERBUFFERPROC                       glIsRenderbuffer;
+    PGLFNGLBINDRENDERBUFFERPROC                     glBindRenderbuffer;
+    PGLFNGLDELETERENDERBUFFERSPROC                  glDeleteRenderbuffers;
+    PGLFNGLGENRENDERBUFFERSPROC                     glGenRenderbuffers;
+    PGLFNGLRENDERBUFFERSTORAGEPROC                  glRenderbufferStorage;
+    PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC         glRenderbufferStorageMultisample;
+    PGLFNGLGETRENDERBUFFERPARAMETERIVPROC           glGetRenderbufferParameteriv;
+    PGLFNGLISFRAMEBUFFERPROC                        glIsFramebuffer;
+    PGLFNGLBINDFRAMEBUFFERPROC                      glBindFramebuffer;
+    PGLFNGLDELETEFRAMEBUFFERSPROC                   glDeleteFramebuffers;
+    PGLFNGLGENFRAMEBUFFERSPROC                      glGenFramebuffers;
+    PGLFNGLCHECKFRAMEBUFFERSTATUSPROC               glCheckFramebufferStatus;
+    PGLFNGLFRAMEBUFFERTEXTURE1DPROC                 glFramebufferTexture1D;
+    PGLFNGLFRAMEBUFFERTEXTURE2DPROC                 glFramebufferTexture2D;
+    PGLFNGLFRAMEBUFFERTEXTURE3DPROC                 glFramebufferTexture3D;
+    PGLFNGLFRAMEBUFFERRENDERBUFFERPROC              glFramebufferRenderbuffer;
+    PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC  glGetFramebufferAttachmentParameteriv;
+    PGLFNGLBLITFRAMEBUFFERPROC                      glBlitFramebuffer;
+    PGLFNGLGENERATEMIPMAPPROC                       glGenerateMipmap;
+};
+
+struct wined3d_gl_limits
+{
+    UINT buffers;
+    UINT lights;
+    UINT textures;
+    UINT texture_stages;
+    UINT fragment_samplers;
+    UINT vertex_samplers;
+    UINT combined_samplers;
+    UINT general_combiners;
+    UINT sampler_stages;
+    UINT clipplanes;
+    UINT texture_size;
+    UINT texture3d_size;
+    float pointsize_max;
+    float pointsize_min;
+    UINT point_sprite_units;
+    UINT blends;
+    UINT anisotropy;
+    float shininess;
+
+    UINT glsl_varyings;
+    UINT glsl_vs_float_constants;
+    UINT glsl_ps_float_constants;
+
+    UINT arb_vs_float_constants;
+    UINT arb_vs_native_constants;
+    UINT arb_vs_instructions;
+    UINT arb_vs_temps;
+    UINT arb_ps_float_constants;
+    UINT arb_ps_local_constants;
+    UINT arb_ps_native_constants;
+    UINT arb_ps_instructions;
+    UINT arb_ps_temps;
+};
+
+struct wined3d_gl_info
+{
+    UINT vidmem;
+    struct wined3d_gl_limits limits;
+    DWORD reserved_glsl_constants;
+    DWORD quirks;
+    BOOL supported[WINED3D_GL_EXT_COUNT];
+    GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
+
+    struct wined3d_fbo_ops fbo_ops;
+#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
+    /* GL function pointers */
+    GL_EXT_FUNCS_GEN
+    /* WGL function pointers */
+    WGL_EXT_FUNCS_GEN
+#undef USE_GL_FUNC
+
+    struct GlPixelFormatDesc *gl_formats;
+};
+
 struct wined3d_driver_info
 {
     enum wined3d_pci_vendor vendor;
@@ -1348,6 +1461,10 @@ struct wined3d_adapter
     unsigned int            TextureRam; /* Amount of texture memory both video ram + AGP/TurboCache/HyperMemory/.. */
     unsigned int            UsedTextureRam;
     LUID luid;
+
+    const struct fragment_pipeline *fragment_pipe;
+    const shader_backend_t *shader_backend;
+    const struct blit_shader *blitter;
 };
 
 BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
@@ -1497,7 +1614,7 @@ struct IWineD3DDeviceImpl
     const struct fragment_pipeline *frag_pipe;
     const struct blit_shader *blitter;
 
-    unsigned int max_ffp_textures, max_ffp_texture_stages;
+    unsigned int max_ffp_textures;
     DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
     DWORD vs_clipping;
 
@@ -1547,7 +1664,6 @@ struct IWineD3DDeviceImpl
     UINT                    NumberOfPalettes;
     PALETTEENTRY            **palettes;
     UINT                    currentPalette;
-    UINT                    paletteConversionShader;
 
     /* For rendering to a texture using glCopyTexImage */
     GLenum                  *draw_buffers;
@@ -1602,14 +1718,14 @@ struct IWineD3DDeviceImpl
 HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
         UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags,
         IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN;
+void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
 LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
         UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
 void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
 void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
 void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
         BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN;
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
-        const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN;
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
 HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
         const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN;
 void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN;
@@ -1745,6 +1861,7 @@ typedef struct IWineD3DBaseTextureClass
 void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
 BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
 BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN;
 
 typedef struct IWineD3DBaseTextureImpl
 {
@@ -2342,9 +2459,8 @@ typedef struct IWineD3DQueryImpl
     void                     *extendedData;
 } IWineD3DQueryImpl;
 
-extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl DECLSPEC_HIDDEN;
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+        WINED3DQUERYTYPE type, IUnknown *parent) DECLSPEC_HIDDEN;
 
 /* IWineD3DBuffer */
 
@@ -2495,6 +2611,7 @@ const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN;
 const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN;
 const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN;
+const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
 const char *debug_d3dtexturestate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) DECLSPEC_HIDDEN;
@@ -2552,12 +2669,6 @@ void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED
 UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN;
 unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN;
 
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
 void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) DECLSPEC_HIDDEN;
 
 typedef struct local_constant {
@@ -2601,8 +2712,6 @@ int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_li
 extern BOOL vshader_get_input(IWineD3DVertexShader *iface,
         BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN;
 
-extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) DECLSPEC_HIDDEN;
-
 /*****************************************************************************
  * IDirect3DBaseShader implementation structure
  */
@@ -2651,7 +2760,6 @@ typedef struct IWineD3DBaseShaderImpl {
 void shader_buffer_clear(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
 BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
 void shader_buffer_free(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
-void shader_cleanup(IWineD3DBaseShader *iface) DECLSPEC_HIDDEN;
 void shader_dump_src_param(const struct wined3d_shader_src_param *param,
         const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN;
 void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
@@ -2659,16 +2767,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
 unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) DECLSPEC_HIDDEN;
 void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
         const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) DECLSPEC_HIDDEN;
-HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
-        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
-        struct wined3d_shader_signature_element *output_signature,
-        const DWORD *byte_code, DWORD constf_size) DECLSPEC_HIDDEN;
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
-        IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
 BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) DECLSPEC_HIDDEN;
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) DECLSPEC_HIDDEN;
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) DECLSPEC_HIDDEN;
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *semantic_name) DECLSPEC_HIDDEN;
 
 static inline BOOL shader_is_pshader_version(enum wined3d_shader_type type)
 {
index cb26f59..b677544 100644 (file)
@@ -5,6 +5,9 @@
 
 #define __WINE_CONFIG_H
 
+/* Define to a function attribute for Microsoft hotpatch assembly prefix. */
+#define DECLSPEC_HOTPATCH
+
 /* Specifies the compiler flag that forces a short wchar_t */
 #define CC_FLAG_SHORT_WCHAR "-fshort-wchar"
 
index 252c6e3..ac4ee89 100644 (file)
@@ -26,6 +26,7 @@
 import "unknwn.idl";
 
 cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
 
 typedef struct _RGNDATAHEADER
 {
@@ -134,6 +135,10 @@ typedef enum _WINED3DDEGREETYPE
     WINED3DDEGREE_FORCE_DWORD               = 0x7fffffff
 } WINED3DDEGREETYPE;
 
+#define WINEMAKEFOURCC(ch0, ch1, ch2, ch3) \
+        ((unsigned long)(unsigned char)(ch0) | ((unsigned long)(unsigned char)(ch1) << 8) | \
+        ((unsigned long)(unsigned char)(ch2) << 16) | ((unsigned long)(unsigned char)(ch3) << 24))
+
 typedef enum _WINED3DFORMAT
 {
     WINED3DFMT_UNKNOWN,
@@ -253,21 +258,21 @@ typedef enum _WINED3DFORMAT
     WINED3DFMT_B8G8R8A8_UNORM,
     WINED3DFMT_B8G8R8X8_UNORM,
     /* FOURCC formats. */
-    WINED3DFMT_UYVY                         = 0x59565955, /* UYVY */
-    WINED3DFMT_YUY2                         = 0x32595559, /* YUY2 */
-    WINED3DFMT_YV12                         = 0x32315659, /* YV12 */
-    WINED3DFMT_DXT1                         = 0x31545844, /* DXT1 */
-    WINED3DFMT_DXT2                         = 0x32545844, /* DXT2 */
-    WINED3DFMT_DXT3                         = 0x33545844, /* DXT3 */
-    WINED3DFMT_DXT4                         = 0x34545844, /* DXT4 */
-    WINED3DFMT_DXT5                         = 0x35545844, /* DXT5 */
-    WINED3DFMT_MULTI2_ARGB8                 = 0x3154454d, /* MET1 */
-    WINED3DFMT_G8R8_G8B8                    = 0x42475247, /* GRGB */
-    WINED3DFMT_R8G8_B8G8                    = 0x47424752, /* RGBG */
-    WINED3DFMT_ATI2N                        = 0x32495441, /* ATI2 */
-    WINED3DFMT_INST                         = 0x54534e49, /* INST */
-    WINED3DFMT_NVHU                         = 0x5548564e, /* NVHU */
-    WINED3DFMT_NVHS                         = 0x5348564e, /* NVHS */
+    WINED3DFMT_UYVY                         = WINEMAKEFOURCC('U','Y','V','Y'),
+    WINED3DFMT_YUY2                         = WINEMAKEFOURCC('Y','U','Y','2'),
+    WINED3DFMT_YV12                         = WINEMAKEFOURCC('Y','V','1','2'),
+    WINED3DFMT_DXT1                         = WINEMAKEFOURCC('D','X','T','1'),
+    WINED3DFMT_DXT2                         = WINEMAKEFOURCC('D','X','T','2'),
+    WINED3DFMT_DXT3                         = WINEMAKEFOURCC('D','X','T','3'),
+    WINED3DFMT_DXT4                         = WINEMAKEFOURCC('D','X','T','4'),
+    WINED3DFMT_DXT5                         = WINEMAKEFOURCC('D','X','T','5'),
+    WINED3DFMT_MULTI2_ARGB8                 = WINEMAKEFOURCC('M','E','T','1'),
+    WINED3DFMT_G8R8_G8B8                    = WINEMAKEFOURCC('G','R','G','B'),
+    WINED3DFMT_R8G8_B8G8                    = WINEMAKEFOURCC('R','G','B','G'),
+    WINED3DFMT_ATI2N                        = WINEMAKEFOURCC('A','T','I','2'),
+    WINED3DFMT_INST                         = WINEMAKEFOURCC('I','N','S','T'),
+    WINED3DFMT_NVHU                         = WINEMAKEFOURCC('N','V','H','U'),
+    WINED3DFMT_NVHS                         = WINEMAKEFOURCC('N','V','H','S'),
 
     WINED3DFMT_FORCE_DWORD = 0xffffffff
 } WINED3DFORMAT;