/* nothing to do */
}
-IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
+IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) {
IDirect3D8Impl* object;
TRACE("SDKVersion = %x\n", SDKVersion);
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;
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;
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 */
return hr;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hr;
/* 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;
return (IDirect3D9*) object;
}
-HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
+HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
IDirect3D9 *ret;
IDirect3D9Impl* object;
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,
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 */
LPDIRECT3DDEVICE9EX parentDevice;
} IDirect3DStateBlock9Impl;
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+ D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) DECLSPEC_HIDDEN;
/* --------------------------- */
/* IDirect3DVertexDeclaration9 */
LPDIRECT3DDEVICE9EX parentDevice;
} IDirect3DQuery9Impl;
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device,
+ D3DQUERYTYPE type) DECLSPEC_HIDDEN;
+
#endif /* __WINE_D3D9_PRIVATE_H */
return ref;
}
-static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
+static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
ULONG ref;
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;
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;
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;
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
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;
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;
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;
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)
{
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)
{
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)
{
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;
}
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;
}
}
/* 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;
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;
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;
return hr;
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
{
IDirect3DDeviceImpl *This = device_from_device3(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);
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);
}
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");
}
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);
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);
* Arguments, return values: See DDRAW_Create
*
***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
DirectDrawCreate(GUID *GUID,
LPDIRECTDRAW *DD,
IUnknown *UnkOuter)
* Arguments, return values: See DDRAW_Create
*
***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
DirectDrawCreateEx(GUID *GUID,
LPVOID *DD,
REFIID iid,
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
- HRESULT hr;
- FIXME("(void): stub\n");
-
- EnterCriticalSection(&ddraw_cs);
- hr = S_FALSE;
- LeaveCriticalSection(&ddraw_cs);
-
- return hr;
+ return S_FALSE;
}
/*******************************************************************************
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)
{
}
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;
}
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");
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");
#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)
{
{
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;
}
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);
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;
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];
/* 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");
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;
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;
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;
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];
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];
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
{
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
{
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
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
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 */
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 */
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
HeapFree(GetProcessHeap(), 0, shader_data);
- This->baseShader.backend_data = NULL;
+ baseShader->baseShader.backend_data = NULL;
}
}
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);
/* 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])
{
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;
/* 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,
/* 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,
}
}
-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 |
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
{
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) {
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 {
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;
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);
}
break;
- case YUV_FIXUP_YV12:
+ case COMPLEX_FIXUP_YV12:
if (!gen_yv12_read(&buffer, textype, &luminance_component))
{
shader_buffer_free(&buffer);
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
{
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;
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);
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)");
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);
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))
{
}
/* 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;
}
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 |
+++ /dev/null
-/*
- * 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, ¶m_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 *)®->immconst_data[0], *(const float *)®->immconst_data[1],
- *(const float *)®->immconst_data[2], *(const float *)®->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(¶m->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(¶m->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, ¶m_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, ¶m_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,
-};
* 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
}
}
- 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;
}
{
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])
{
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
* 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,
/* 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;
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);
{
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)
{
}
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);
}
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)
}
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++)
{
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).
}
/* 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;
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
}
- if (update_minfilter || update_magfilter || force_preload)
+ if (update_minfilter || update_magfilter)
{
GLenum target, bind_target;
GLint old_binding;
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);
}
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)
{
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);
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)
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;
}
}
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;
}
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)
struct fbo_entry *entry, *entry2;
HGLRC restore_ctx;
HDC restore_dc;
+ unsigned int i;
restore_ctx = pwglGetCurrentContext();
restore_dc = pwglGetCurrentDC();
{
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;
}
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");
}
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);
}
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)
{
/* 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;
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;
}
}
- /* 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;
+ }
+ }
}
}
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;
{
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;
}
}
+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
**********************************************************/
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)
{
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;
}
}
}
- /* 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);
}
}
-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;
}
}
-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;
{
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);
}
}
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) {
}
}
-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);
/*
* -> 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) {
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;
}
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);
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
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));
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
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);
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);
checkGLcall("glClear");
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
}
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;
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);
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;
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;
}
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
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);
return hr;
}
- device->blitter = select_blit_implementation(adapter, device_type);
+ device->blitter = adapter->blitter;
return WINED3D_OK;
}
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 } };
/* 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 },
{"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 },
{"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 },
{"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 },
{"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 },
}
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;
}
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)
{
}
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
* 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. */
}
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.
/* 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];
}
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;
{
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)
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;
};
* 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. */
};
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";
}
}
- 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.
* 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;
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
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;
{
LEAVE_GL();
ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
- HeapFree(GetProcessHeap(), 0, gl_renderer);
return FALSE;
}
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");
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])
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);
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;
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);
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])
{
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). */
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)
}
}
- fixup_extensions(gl_info, gl_renderer, vendor, 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;
}
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));
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:
/* 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;
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)
{
/* 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;
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;
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)
{
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;
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);
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;
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);
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;
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;
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
}
}
- 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++;
}
}
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;
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;
/* Finished updating the screen, restore lock */
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
TRACE("Done all gl drawing\n");
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;
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)
}
}
+/* 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
*/
}
}
+ shader_addline(buffer, "const float FLT_MAX = 1e38;\n");
+
/* Start the main program */
shader_addline(buffer, "void main() {\n");
if(pshader && reg_maps->vpos) {
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;
}
}
-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;
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;
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";
}
}
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;
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;
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;
}
/* 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;
{
/* 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);
}
}
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);
}
}
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;
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))
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);
}
}
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);
}
}
********************************************/
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;
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;
{
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;
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);
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);
{
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;
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.
* 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;
*
* 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)
* 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;
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;
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");
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;
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");
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);
* 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;
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");
* 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;
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");
*/
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;
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);
* 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];
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);
}
* 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];
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);
}
* 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,
*/
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);
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;
/* 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);
* 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');
}
}
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
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
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;
}
}
} 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;
}
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++) {
}
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++) {
}
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);
}
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
}
/* We support everything except YUV conversions. */
- if (!is_yuv_fixup(fixup))
+ if (!is_complex_fixup(fixup))
{
TRACE("[OK]\n");
return TRUE;
/* 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,
/* 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,
/* 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,
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 |
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;
#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
******************************************* */
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;
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;
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);
return This->type;
}
-
static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
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)
{
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,
IWineD3DEventQueryImpl_Issue
};
-const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
{
/*** IUnknown methods ***/
IWineD3DQueryImpl_QueryInterface,
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;
+}
#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, ¶m_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 *)®->immconst_data[0], *(const float *)®->immconst_data[1],
+ *(const float *)®->immconst_data[2], *(const float *)®->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(¶m->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(¶m->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, ¶m_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, ¶m_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)
{
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)
{
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)
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,
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},
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;
}
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)"); }
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);
}
} 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);
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 */
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;
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)
{
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;
}
}
/* 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 |
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;
}
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)
}
}
+ prune_invalid_states(StateTable, gl_info);
+ validate_state_table(StateTable);
+
return WINED3D_OK;
out_of_mem:
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;
* 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)
{
*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;
* 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);
/* Rebind the texture because it isn't bound anymore */
glBindTexture(This->texture_target, This->texture_name);
-
LEAVE_GL();
}
}
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);
}
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();
checkGLcall("glBindTexture");
LEAVE_GL();
-
- if (context) context_release(context);
}
}
}
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
/* 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);
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) {
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 {
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;
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);
{
/* 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 */,
}
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) {
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;
}
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);
}
/* 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);
}
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 :-) */
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;
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 */
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])
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);
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},
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},
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},
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},
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;
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;
}
}
+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
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);
}
}
-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;
}
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;
-}
<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>
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
#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;
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
#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,
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
#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 */
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>
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;
}
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;
WINED3DSIH_CMP,
WINED3DSIH_CND,
WINED3DSIH_CRS,
+ WINED3DSIH_CUT,
WINED3DSIH_DCL,
WINED3DSIH_DEF,
WINED3DSIH_DEFB,
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,
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;
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);
};
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;
#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)
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;
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;
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);
{
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;
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
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;
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;
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;
UINT NumberOfPalettes;
PALETTEENTRY **palettes;
UINT currentPalette;
- UINT paletteConversionShader;
/* For rendering to a texture using glCopyTexImage */
GLenum *draw_buffers;
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;
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
{
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 */
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;
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 {
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
*/
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,
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)
{
#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"
import "unknwn.idl";
cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
typedef struct _RGNDATAHEADER
{
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,
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;