mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[WINED3D|DDRAW|D3D8|D3D9]
Sync to Wine 1.3.37. svn path=/trunk/; revision=55951
This commit is contained in:
@@ -17,10 +17,16 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "d3d8_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
|
||||
|
||||
static inline IDirect3DVertexBuffer8Impl *impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexBuffer8Impl, IDirect3DVertexBuffer8_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -42,7 +48,7 @@ static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *i
|
||||
|
||||
static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface;
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
ULONG refcount = InterlockedIncrement(&buffer->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -60,7 +66,7 @@ static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface)
|
||||
|
||||
static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface;
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
ULONG refcount = InterlockedDecrement(&buffer->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -80,11 +86,14 @@ static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface, IDirect3DDevice8 **device)
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface,
|
||||
IDirect3DDevice8 **device)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice8 *)((IDirect3DVertexBuffer8Impl *)iface)->parentDevice;
|
||||
*device = buffer->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -95,14 +104,16 @@ static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface,
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer8 *iface,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_set_private_data(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer,
|
||||
guid, data, data_size, flags);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -111,14 +122,16 @@ static HRESULT WINAPI d3d8_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer8 *i
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer8 *iface,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_get_private_data(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer,
|
||||
guid, data, data_size);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -126,12 +139,15 @@ static HRESULT WINAPI d3d8_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer8 *i
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer8 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_free_private_data(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, guid);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -139,12 +155,13 @@ static HRESULT WINAPI d3d8_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer8 *
|
||||
|
||||
static DWORD WINAPI d3d8_vertexbuffer_SetPriority(IDirect3DVertexBuffer8 *iface, DWORD priority)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
DWORD previous;
|
||||
|
||||
TRACE("iface %p, priority %u.\n", iface, priority);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
previous = wined3d_buffer_set_priority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, priority);
|
||||
previous = wined3d_buffer_set_priority(buffer->wineD3DVertexBuffer, priority);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return previous;
|
||||
@@ -152,12 +169,13 @@ static DWORD WINAPI d3d8_vertexbuffer_SetPriority(IDirect3DVertexBuffer8 *iface,
|
||||
|
||||
static DWORD WINAPI d3d8_vertexbuffer_GetPriority(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
DWORD priority;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
priority = wined3d_buffer_get_priority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer);
|
||||
priority = wined3d_buffer_get_priority(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return priority;
|
||||
@@ -165,10 +183,12 @@ static DWORD WINAPI d3d8_vertexbuffer_GetPriority(IDirect3DVertexBuffer8 *iface)
|
||||
|
||||
static void WINAPI d3d8_vertexbuffer_PreLoad(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_preload(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer);
|
||||
wined3d_buffer_preload(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
@@ -179,17 +199,17 @@ static D3DRESOURCETYPE WINAPI d3d8_vertexbuffer_GetType(IDirect3DVertexBuffer8 *
|
||||
return D3DRTYPE_VERTEXBUFFER;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface,
|
||||
UINT offset, UINT size, BYTE **data, DWORD flags)
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface, UINT offset, UINT size,
|
||||
BYTE **data, DWORD flags)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n",
|
||||
iface, offset, size, data, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_map(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer,
|
||||
offset, size, data, flags);
|
||||
hr = wined3d_buffer_map(buffer->wineD3DVertexBuffer, offset, size, data, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -197,18 +217,21 @@ static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface,
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_Unlock(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_unmap(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer);
|
||||
wined3d_buffer_unmap(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface, D3DVERTEXBUFFER_DESC *desc)
|
||||
static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface,
|
||||
D3DVERTEXBUFFER_DESC *desc)
|
||||
{
|
||||
IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface;
|
||||
IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -220,7 +243,7 @@ static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface, D
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
desc->Type = D3DRTYPE_VERTEXBUFFER;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->FVF = buffer->fvf;
|
||||
@@ -265,13 +288,13 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Im
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
buffer->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
|
||||
buffer->IDirect3DVertexBuffer8_iface.lpVtbl = &Direct3DVertexBuffer8_Vtbl;
|
||||
buffer->ref = 1;
|
||||
buffer->fvf = fvf;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_create_vb(device->wined3d_device, size, usage & WINED3DUSAGE_MASK,
|
||||
(WINED3DPOOL)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
|
||||
(enum wined3d_pool)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -285,6 +308,20 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Im
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DVertexBuffer8Impl *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &Direct3DVertexBuffer8_Vtbl);
|
||||
|
||||
return impl_from_IDirect3DVertexBuffer8(iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DIndexBuffer8Impl *impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DIndexBuffer8Impl, IDirect3DIndexBuffer8_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -306,7 +343,7 @@ static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *ifa
|
||||
|
||||
static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface;
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
ULONG refcount = InterlockedIncrement(&buffer->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -324,7 +361,7 @@ static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface)
|
||||
|
||||
static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface;
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
ULONG refcount = InterlockedDecrement(&buffer->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -344,11 +381,14 @@ static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface, IDirect3DDevice8 **device)
|
||||
static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface,
|
||||
IDirect3DDevice8 **device)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice8 *)((IDirect3DIndexBuffer8Impl *)iface)->parentDevice;
|
||||
*device = buffer->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -359,14 +399,16 @@ static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface, I
|
||||
static HRESULT WINAPI d3d8_indexbuffer_SetPrivateData(IDirect3DIndexBuffer8 *iface,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_set_private_data(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer,
|
||||
guid, data, data_size, flags);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -375,14 +417,16 @@ static HRESULT WINAPI d3d8_indexbuffer_SetPrivateData(IDirect3DIndexBuffer8 *ifa
|
||||
static HRESULT WINAPI d3d8_indexbuffer_GetPrivateData(IDirect3DIndexBuffer8 *iface,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_get_private_data(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer,
|
||||
guid, data, data_size);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -390,12 +434,15 @@ static HRESULT WINAPI d3d8_indexbuffer_GetPrivateData(IDirect3DIndexBuffer8 *ifa
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_FreePrivateData(IDirect3DIndexBuffer8 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_free_private_data(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, guid);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -403,12 +450,13 @@ static HRESULT WINAPI d3d8_indexbuffer_FreePrivateData(IDirect3DIndexBuffer8 *if
|
||||
|
||||
static DWORD WINAPI d3d8_indexbuffer_SetPriority(IDirect3DIndexBuffer8 *iface, DWORD priority)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
DWORD previous;
|
||||
|
||||
TRACE("iface %p, priority %u.\n", iface, priority);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
previous = wined3d_buffer_set_priority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, priority);
|
||||
previous = wined3d_buffer_set_priority(buffer->wineD3DIndexBuffer, priority);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return previous;
|
||||
@@ -416,12 +464,13 @@ static DWORD WINAPI d3d8_indexbuffer_SetPriority(IDirect3DIndexBuffer8 *iface, D
|
||||
|
||||
static DWORD WINAPI d3d8_indexbuffer_GetPriority(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
DWORD priority;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
priority = wined3d_buffer_get_priority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer);
|
||||
priority = wined3d_buffer_get_priority(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return priority;
|
||||
@@ -429,10 +478,12 @@ static DWORD WINAPI d3d8_indexbuffer_GetPriority(IDirect3DIndexBuffer8 *iface)
|
||||
|
||||
static void WINAPI d3d8_indexbuffer_PreLoad(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_preload(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer);
|
||||
wined3d_buffer_preload(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
@@ -443,17 +494,17 @@ static D3DRESOURCETYPE WINAPI d3d8_indexbuffer_GetType(IDirect3DIndexBuffer8 *if
|
||||
return D3DRTYPE_INDEXBUFFER;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface,
|
||||
UINT offset, UINT size, BYTE **data, DWORD flags)
|
||||
static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface, UINT offset, UINT size,
|
||||
BYTE **data, DWORD flags)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n",
|
||||
iface, offset, size, data, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_map(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer,
|
||||
offset, size, data, flags);
|
||||
hr = wined3d_buffer_map(buffer->wineD3DIndexBuffer, offset, size, data, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -461,18 +512,21 @@ static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface,
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_Unlock(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_unmap(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer);
|
||||
wined3d_buffer_unmap(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface, D3DINDEXBUFFER_DESC *desc)
|
||||
static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface,
|
||||
D3DINDEXBUFFER_DESC *desc)
|
||||
{
|
||||
IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface;
|
||||
IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -485,7 +539,7 @@ static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface, D3D
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(buffer->format);
|
||||
desc->Type = D3DRTYPE_INDEXBUFFER;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
|
||||
@@ -528,13 +582,13 @@ HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
buffer->lpVtbl = &d3d8_indexbuffer_vtbl;
|
||||
buffer->IDirect3DIndexBuffer8_iface.lpVtbl = &d3d8_indexbuffer_vtbl;
|
||||
buffer->ref = 1;
|
||||
buffer->format = wined3dformat_from_d3dformat(format);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_create_ib(device->wined3d_device, size, usage & WINED3DUSAGE_MASK,
|
||||
(WINED3DPOOL)pool, buffer, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer);
|
||||
(enum wined3d_pool)pool, buffer, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -547,3 +601,12 @@ HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DIndexBuffer8Impl *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d8_indexbuffer_vtbl);
|
||||
|
||||
return impl_from_IDirect3DIndexBuffer8(iface);
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetDevice(IDirect3DCubeTexture8
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice8 *)This->parentDevice;
|
||||
*device = This->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -109,13 +109,15 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_SetPrivateData(IDirect3DCubeText
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DCubeTexture8Impl *This = impl_from_IDirect3DCubeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -125,13 +127,15 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetPrivateData(IDirect3DCubeText
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DCubeTexture8Impl *This = impl_from_IDirect3DCubeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -141,12 +145,14 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_FreePrivateData(IDirect3DCubeTex
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DCubeTexture8Impl *This = impl_from_IDirect3DCubeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -194,16 +200,9 @@ static void WINAPI IDirect3DCubeTexture8Impl_PreLoad(IDirect3DCubeTexture8 *ifac
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture8Impl_GetType(IDirect3DCubeTexture8 *iface)
|
||||
{
|
||||
IDirect3DCubeTexture8Impl *This = impl_from_IDirect3DCubeTexture8(iface);
|
||||
D3DRESOURCETYPE type;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
type = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return type;
|
||||
return D3DRTYPE_CUBETEXTURE;
|
||||
}
|
||||
|
||||
/* IDirect3DCubeTexture8 IDirect3DBaseTexture8 Interface follow: */
|
||||
@@ -269,7 +268,7 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetLevelDesc(IDirect3DCubeTextur
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
@@ -364,14 +363,14 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_AddDirtyRect(IDirect3DCubeTextur
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
|
||||
else
|
||||
{
|
||||
WINED3DBOX dirty_region;
|
||||
struct wined3d_box dirty_region;
|
||||
|
||||
dirty_region.Left = dirty_rect->left;
|
||||
dirty_region.Top = dirty_rect->top;
|
||||
dirty_region.Right = dirty_rect->right;
|
||||
dirty_region.Bottom = dirty_rect->bottom;
|
||||
dirty_region.Front = 0;
|
||||
dirty_region.Back = 1;
|
||||
dirty_region.left = dirty_rect->left;
|
||||
dirty_region.top = dirty_rect->top;
|
||||
dirty_region.right = dirty_rect->right;
|
||||
dirty_region.bottom = dirty_rect->bottom;
|
||||
dirty_region.front = 0;
|
||||
dirty_region.back = 1;
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
|
||||
}
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
@@ -45,7 +45,7 @@ IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) {
|
||||
|
||||
object->IDirect3D8_iface.lpVtbl = &Direct3D8_Vtbl;
|
||||
object->ref = 1;
|
||||
object->WineD3D = wined3d_create(8, &object->IDirect3D8_iface);
|
||||
object->WineD3D = wined3d_create(8, WINED3D_LEGACY_DEPTH_BIAS, &object->IDirect3D8_iface);
|
||||
|
||||
TRACE("Created Direct3D object @ %p, WineObj @ %p\n", object, object->WineD3D);
|
||||
|
||||
|
||||
@@ -177,7 +177,8 @@ struct IDirect3DDevice8Impl
|
||||
IDirect3DDevice8 IDirect3DDevice8_iface;
|
||||
struct wined3d_device_parent device_parent;
|
||||
LONG ref;
|
||||
struct wined3d_device *wined3d_device;
|
||||
struct wined3d_device *wined3d_device;
|
||||
IDirect3D8 *d3d_parent;
|
||||
struct d3d8_handle_table handle_table;
|
||||
|
||||
/* FVF management */
|
||||
@@ -189,7 +190,7 @@ struct IDirect3DDevice8Impl
|
||||
BOOL lost;
|
||||
};
|
||||
|
||||
HRESULT device_init(IDirect3DDevice8Impl *device, struct wined3d *wined3d, UINT adapter,
|
||||
HRESULT device_init(IDirect3DDevice8Impl *device, IDirect3D8Impl *parent, struct wined3d *wined3d, UINT adapter,
|
||||
D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ---------------- */
|
||||
@@ -209,7 +210,7 @@ struct IDirect3DVolume8Impl
|
||||
};
|
||||
|
||||
HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ------------------- */
|
||||
/* IDirect3DSwapChain8 */
|
||||
@@ -239,9 +240,8 @@ HRESULT swapchain_init(IDirect3DSwapChain8Impl *swapchain, IDirect3DDevice8Impl
|
||||
*/
|
||||
struct IDirect3DSurface8Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DSurface8Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
IDirect3DSurface8 IDirect3DSurface8_iface;
|
||||
LONG ref;
|
||||
struct wined3d_surface *wined3d_surface;
|
||||
IDirect3DDevice8 *parentDevice;
|
||||
|
||||
@@ -255,6 +255,7 @@ struct IDirect3DSurface8Impl
|
||||
HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *device,
|
||||
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;
|
||||
IDirect3DSurface8Impl *unsafe_impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ---------------------- */
|
||||
/* IDirect3DVertexBuffer8 */
|
||||
@@ -265,10 +266,8 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
|
||||
*/
|
||||
struct IDirect3DVertexBuffer8Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DVertexBuffer8Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
IDirect3DVertexBuffer8 IDirect3DVertexBuffer8_iface;
|
||||
LONG ref;
|
||||
struct wined3d_buffer *wineD3DVertexBuffer;
|
||||
IDirect3DDevice8 *parentDevice;
|
||||
DWORD fvf;
|
||||
@@ -276,6 +275,7 @@ struct IDirect3DVertexBuffer8Impl
|
||||
|
||||
HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device,
|
||||
UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexBuffer8Impl *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------------- */
|
||||
/* IDirect3DIndexBuffer8 */
|
||||
@@ -286,10 +286,8 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Im
|
||||
*/
|
||||
struct IDirect3DIndexBuffer8Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DIndexBuffer8Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
IDirect3DIndexBuffer8 IDirect3DIndexBuffer8_iface;
|
||||
LONG ref;
|
||||
struct wined3d_buffer *wineD3DIndexBuffer;
|
||||
IDirect3DDevice8 *parentDevice;
|
||||
enum wined3d_format_id format;
|
||||
@@ -297,6 +295,7 @@ struct IDirect3DIndexBuffer8Impl
|
||||
|
||||
HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device,
|
||||
UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
IDirect3DIndexBuffer8Impl *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------------- */
|
||||
/* IDirect3DBaseTexture8 */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -123,7 +123,7 @@ static HRESULT WINAPI IDirect3D8Impl_GetAdapterIdentifier(LPDIRECT3D8 iface, UIN
|
||||
DWORD Flags, D3DADAPTER_IDENTIFIER8 *pIdentifier)
|
||||
{
|
||||
IDirect3D8Impl *This = impl_from_IDirect3D8(iface);
|
||||
WINED3DADAPTER_IDENTIFIER adapter_id;
|
||||
struct wined3d_adapter_identifier adapter_id;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, adapter %u, flags %#x, identifier %p.\n",
|
||||
@@ -175,7 +175,8 @@ static HRESULT WINAPI IDirect3D8Impl_EnumAdapterModes(LPDIRECT3D8 iface, UINT Ad
|
||||
iface, Adapter, Mode, pMode);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_enum_adapter_modes(This->WineD3D, Adapter, WINED3DFMT_UNKNOWN, Mode, (WINED3DDISPLAYMODE *)pMode);
|
||||
hr = wined3d_enum_adapter_modes(This->WineD3D, Adapter, WINED3DFMT_UNKNOWN,
|
||||
Mode, (struct wined3d_display_mode *)pMode);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
|
||||
@@ -193,7 +194,7 @@ static HRESULT WINAPI IDirect3D8Impl_GetAdapterDisplayMode(LPDIRECT3D8 iface, UI
|
||||
iface, Adapter, pMode);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_get_adapter_display_mode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *)pMode);
|
||||
hr = wined3d_get_adapter_display_mode(This->WineD3D, Adapter, (struct wined3d_display_mode *)pMode);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
|
||||
@@ -223,34 +224,26 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat(LPDIRECT3D8 iface, UINT A
|
||||
D3DFORMAT CheckFormat)
|
||||
{
|
||||
IDirect3D8Impl *This = impl_from_IDirect3D8(iface);
|
||||
enum wined3d_resource_type wined3d_rtype;
|
||||
HRESULT hr;
|
||||
WINED3DRESOURCETYPE WineD3DRType;
|
||||
|
||||
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
|
||||
iface, Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat);
|
||||
|
||||
if(CheckFormat == D3DFMT_R8G8B8)
|
||||
{
|
||||
/* See comment in dlls/d3d9/directx.c, IDirect3D9Impl_CheckDeviceFormat for details */
|
||||
WARN("D3DFMT_R8G8B8 is not available on windows, returning D3DERR_NOTAVAILABLE\n");
|
||||
return D3DERR_NOTAVAILABLE;
|
||||
}
|
||||
|
||||
|
||||
switch(RType) {
|
||||
case D3DRTYPE_VERTEXBUFFER:
|
||||
case D3DRTYPE_INDEXBUFFER:
|
||||
WineD3DRType = WINED3DRTYPE_BUFFER;
|
||||
wined3d_rtype = WINED3D_RTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
default:
|
||||
WineD3DRType = RType;
|
||||
wined3d_rtype = RType;
|
||||
break;
|
||||
}
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_check_device_format(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(AdapterFormat),
|
||||
Usage, WineD3DRType, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
|
||||
Usage, wined3d_rtype, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -268,7 +261,8 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(IDirect3D8 *ifac
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_check_device_multisample_type(This->WineD3D, Adapter, DeviceType,
|
||||
wined3dformat_from_d3dformat(SurfaceFormat), Windowed, (WINED3DMULTISAMPLE_TYPE)MultiSampleType, NULL);
|
||||
wined3dformat_from_d3dformat(SurfaceFormat), Windowed,
|
||||
(enum wined3d_multisample_type)MultiSampleType, NULL);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -296,12 +290,14 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDepthStencilMatch(IDirect3D8 *iface, U
|
||||
void fixup_caps(WINED3DCAPS *caps)
|
||||
{
|
||||
/* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */
|
||||
if (caps->PixelShaderVersion > D3DPS_VERSION(1,4)) {
|
||||
if (caps->PixelShaderVersion)
|
||||
caps->PixelShaderVersion = D3DPS_VERSION(1,4);
|
||||
}
|
||||
if (caps->VertexShaderVersion > D3DVS_VERSION(1,1)) {
|
||||
else
|
||||
caps->PixelShaderVersion = D3DPS_VERSION(0,0);
|
||||
if (caps->VertexShaderVersion)
|
||||
caps->VertexShaderVersion = D3DVS_VERSION(1,1);
|
||||
}
|
||||
else
|
||||
caps->VertexShaderVersion = D3DVS_VERSION(0,0);
|
||||
caps->MaxVertexShaderConst = min(D3D8_MAX_VERTEX_SHADER_CONSTANTF, caps->MaxVertexShaderConst);
|
||||
|
||||
caps->StencilCaps &= ~WINED3DSTENCILCAPS_TWOSIDED;
|
||||
@@ -368,7 +364,7 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(IDirect3D8 *iface, UINT adapte
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = device_init(object, This->WineD3D, adapter, device_type, focus_window, flags, parameters);
|
||||
hr = device_init(object, This, This->WineD3D, adapter, device_type, focus_window, flags, parameters);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize device, hr %#x.\n", hr);
|
||||
|
||||
@@ -177,7 +177,7 @@ HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Im
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_create_vs(device->wined3d_device, byte_code, NULL /* output signature */,
|
||||
shader, &d3d8_vertexshader_wined3d_parent_ops, &shader->wined3d_shader);
|
||||
shader, &d3d8_vertexshader_wined3d_parent_ops, &shader->wined3d_shader, 1);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -278,7 +278,7 @@ HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_create_ps(device->wined3d_device, byte_code, NULL, shader,
|
||||
&d3d8_pixelshader_wined3d_parent_ops, &shader->wined3d_shader);
|
||||
&d3d8_pixelshader_wined3d_parent_ops, &shader->wined3d_shader, 1);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
|
||||
@@ -19,13 +19,21 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "d3d8_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
|
||||
|
||||
static inline IDirect3DSurface8Impl *impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DSurface8Impl, IDirect3DSurface8_iface);
|
||||
}
|
||||
|
||||
/* IDirect3DSurface8 IUnknown parts follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface, REFIID riid, LPVOID *ppobj) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(IDirect3DSurface8 *iface, REFIID riid,
|
||||
void **ppobj)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
|
||||
|
||||
@@ -42,8 +50,9 @@ static HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 if
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DSurface8Impl_AddRef(LPDIRECT3DSURFACE8 iface) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static ULONG WINAPI IDirect3DSurface8Impl_AddRef(IDirect3DSurface8 *iface)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
@@ -69,8 +78,9 @@ static ULONG WINAPI IDirect3DSurface8Impl_AddRef(LPDIRECT3DSURFACE8 iface) {
|
||||
}
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static ULONG WINAPI IDirect3DSurface8Impl_Release(IDirect3DSurface8 *iface)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
@@ -100,9 +110,10 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) {
|
||||
}
|
||||
|
||||
/* IDirect3DSurface8 IDirect3DResource8 Interface follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(IDirect3DSurface8 *iface, IDirect3DDevice8 **device)
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(IDirect3DSurface8 *iface,
|
||||
IDirect3DDevice8 **device)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
@@ -123,7 +134,7 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(IDirect3DSurface8 *iface,
|
||||
return hr;
|
||||
}
|
||||
|
||||
*device = (IDirect3DDevice8 *)This->parentDevice;
|
||||
*device = This->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -131,50 +142,63 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(IDirect3DSurface8 *iface,
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void *pData, DWORD SizeOfData, DWORD Flags) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(IDirect3DSurface8 *iface, REFGUID guid,
|
||||
const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DSurface8Impl *surface = impl_from_IDirect3DSurface8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_set_private_data(This->wined3d_surface, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(IDirect3DSurface8 *iface, REFGUID guid,
|
||||
void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DSurface8Impl *surface = impl_from_IDirect3DSurface8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_get_private_data(This->wined3d_surface, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(IDirect3DSurface8 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DSurface8Impl *surface = impl_from_IDirect3DSurface8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_free_private_data(This->wined3d_surface, refguid);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* IDirect3DSurface8 Interface follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void **ppContainer) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(IDirect3DSurface8 *iface, REFIID riid,
|
||||
void **ppContainer)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
HRESULT res;
|
||||
|
||||
TRACE("iface %p, riid %s, container %p.\n", iface, debugstr_guid(riid), ppContainer);
|
||||
@@ -189,7 +213,7 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 ifac
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(IDirect3DSurface8 *iface, D3DSURFACE_DESC *desc)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -202,7 +226,7 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(IDirect3DSurface8 *iface, D3
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
@@ -212,8 +236,10 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(IDirect3DSurface8 *iface, D3
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(IDirect3DSurface8 *iface,
|
||||
D3DLOCKED_RECT *pLockedRect, const RECT *pRect, DWORD Flags)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, locked_rect %p, rect %p, flags %#x.\n", iface, pLockedRect, pRect, Flags);
|
||||
@@ -236,14 +262,15 @@ static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D
|
||||
}
|
||||
}
|
||||
|
||||
hr = wined3d_surface_map(This->wined3d_surface, (WINED3DLOCKED_RECT *)pLockedRect, pRect, Flags);
|
||||
hr = wined3d_surface_map(This->wined3d_surface, (struct wined3d_mapped_rect *)pLockedRect, pRect, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
||||
IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(IDirect3DSurface8 *iface)
|
||||
{
|
||||
IDirect3DSurface8Impl *This = impl_from_IDirect3DSurface8(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
@@ -291,9 +318,10 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
|
||||
UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
|
||||
DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality)
|
||||
{
|
||||
DWORD flags = 0;
|
||||
HRESULT hr;
|
||||
|
||||
surface->lpVtbl = &Direct3DSurface8_Vtbl;
|
||||
surface->IDirect3DSurface8_iface.lpVtbl = &Direct3DSurface8_Vtbl;
|
||||
surface->ref = 1;
|
||||
|
||||
/* FIXME: Check MAX bounds of MultisampleQuality. */
|
||||
@@ -303,10 +331,15 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
|
||||
multisample_quality = 0;
|
||||
}
|
||||
|
||||
if (lockable)
|
||||
flags |= WINED3D_SURFACE_MAPPABLE;
|
||||
if (discard)
|
||||
flags |= WINED3D_SURFACE_DISCARD;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_create(device->wined3d_device, width, height, wined3dformat_from_d3dformat(format),
|
||||
lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type,
|
||||
multisample_quality, SURFACE_OPENGL, surface, &d3d8_surface_wined3d_parent_ops, &surface->wined3d_surface);
|
||||
level, usage & WINED3DUSAGE_MASK, (enum wined3d_pool)pool, multisample_type, multisample_quality,
|
||||
SURFACE_OPENGL, flags, surface, &d3d8_surface_wined3d_parent_ops, &surface->wined3d_surface);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -319,3 +352,12 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DSurface8Impl *unsafe_impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &Direct3DSurface8_Vtbl);
|
||||
|
||||
return impl_from_IDirect3DSurface8(iface);
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ static HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(IDirect3DSwapChain8
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain,
|
||||
iBackBuffer, (WINED3DBACKBUFFER_TYPE)Type, &wined3d_surface);
|
||||
iBackBuffer, (enum wined3d_backbuffer_type)Type, &wined3d_surface);
|
||||
if (SUCCEEDED(hr) && wined3d_surface)
|
||||
{
|
||||
*ppBackBuffer = wined3d_surface_get_parent(wined3d_surface);
|
||||
@@ -151,47 +151,47 @@ static const struct wined3d_parent_ops d3d8_swapchain_wined3d_parent_ops =
|
||||
HRESULT swapchain_init(IDirect3DSwapChain8Impl *swapchain, IDirect3DDevice8Impl *device,
|
||||
D3DPRESENT_PARAMETERS *present_parameters)
|
||||
{
|
||||
WINED3DPRESENT_PARAMETERS wined3d_parameters;
|
||||
struct wined3d_swapchain_desc desc;
|
||||
HRESULT hr;
|
||||
|
||||
swapchain->ref = 1;
|
||||
swapchain->IDirect3DSwapChain8_iface.lpVtbl = &Direct3DSwapChain8_Vtbl;
|
||||
|
||||
wined3d_parameters.BackBufferWidth = present_parameters->BackBufferWidth;
|
||||
wined3d_parameters.BackBufferHeight = present_parameters->BackBufferHeight;
|
||||
wined3d_parameters.BackBufferFormat = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
|
||||
wined3d_parameters.BackBufferCount = max(1, present_parameters->BackBufferCount);
|
||||
wined3d_parameters.MultiSampleType = present_parameters->MultiSampleType;
|
||||
wined3d_parameters.MultiSampleQuality = 0; /* d3d9 only */
|
||||
wined3d_parameters.SwapEffect = present_parameters->SwapEffect;
|
||||
wined3d_parameters.hDeviceWindow = present_parameters->hDeviceWindow;
|
||||
wined3d_parameters.Windowed = present_parameters->Windowed;
|
||||
wined3d_parameters.EnableAutoDepthStencil = present_parameters->EnableAutoDepthStencil;
|
||||
wined3d_parameters.AutoDepthStencilFormat = wined3dformat_from_d3dformat(present_parameters->AutoDepthStencilFormat);
|
||||
wined3d_parameters.Flags = present_parameters->Flags;
|
||||
wined3d_parameters.FullScreen_RefreshRateInHz = present_parameters->FullScreen_RefreshRateInHz;
|
||||
wined3d_parameters.PresentationInterval = present_parameters->FullScreen_PresentationInterval;
|
||||
wined3d_parameters.AutoRestoreDisplayMode = TRUE;
|
||||
desc.backbuffer_width = present_parameters->BackBufferWidth;
|
||||
desc.backbuffer_height = present_parameters->BackBufferHeight;
|
||||
desc.backbuffer_format = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
|
||||
desc.backbuffer_count = max(1, present_parameters->BackBufferCount);
|
||||
desc.multisample_type = present_parameters->MultiSampleType;
|
||||
desc.multisample_quality = 0; /* d3d9 only */
|
||||
desc.swap_effect = present_parameters->SwapEffect;
|
||||
desc.device_window = present_parameters->hDeviceWindow;
|
||||
desc.windowed = present_parameters->Windowed;
|
||||
desc.enable_auto_depth_stencil = present_parameters->EnableAutoDepthStencil;
|
||||
desc.auto_depth_stencil_format = wined3dformat_from_d3dformat(present_parameters->AutoDepthStencilFormat);
|
||||
desc.flags = present_parameters->Flags;
|
||||
desc.refresh_rate = present_parameters->FullScreen_RefreshRateInHz;
|
||||
desc.swap_interval = present_parameters->FullScreen_PresentationInterval;
|
||||
desc.auto_restore_display_mode = TRUE;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_create(device->wined3d_device, &wined3d_parameters,
|
||||
hr = wined3d_swapchain_create(device->wined3d_device, &desc,
|
||||
SURFACE_OPENGL, swapchain, &d3d8_swapchain_wined3d_parent_ops,
|
||||
&swapchain->wined3d_swapchain);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
present_parameters->BackBufferWidth = wined3d_parameters.BackBufferWidth;
|
||||
present_parameters->BackBufferHeight = wined3d_parameters.BackBufferHeight;
|
||||
present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(wined3d_parameters.BackBufferFormat);
|
||||
present_parameters->BackBufferCount = wined3d_parameters.BackBufferCount;
|
||||
present_parameters->MultiSampleType = wined3d_parameters.MultiSampleType;
|
||||
present_parameters->SwapEffect = wined3d_parameters.SwapEffect;
|
||||
present_parameters->hDeviceWindow = wined3d_parameters.hDeviceWindow;
|
||||
present_parameters->Windowed = wined3d_parameters.Windowed;
|
||||
present_parameters->EnableAutoDepthStencil = wined3d_parameters.EnableAutoDepthStencil;
|
||||
present_parameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(wined3d_parameters.AutoDepthStencilFormat);
|
||||
present_parameters->Flags = wined3d_parameters.Flags;
|
||||
present_parameters->FullScreen_RefreshRateInHz = wined3d_parameters.FullScreen_RefreshRateInHz;
|
||||
present_parameters->FullScreen_PresentationInterval = wined3d_parameters.PresentationInterval;
|
||||
present_parameters->BackBufferWidth = desc.backbuffer_width;
|
||||
present_parameters->BackBufferHeight = desc.backbuffer_height;
|
||||
present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(desc.backbuffer_format);
|
||||
present_parameters->BackBufferCount = desc.backbuffer_count;
|
||||
present_parameters->MultiSampleType = desc.multisample_type;
|
||||
present_parameters->SwapEffect = desc.swap_effect;
|
||||
present_parameters->hDeviceWindow = desc.device_window;
|
||||
present_parameters->Windowed = desc.windowed;
|
||||
present_parameters->EnableAutoDepthStencil = desc.enable_auto_depth_stencil;
|
||||
present_parameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(desc.auto_depth_stencil_format);
|
||||
present_parameters->Flags = desc.flags;
|
||||
present_parameters->FullScreen_RefreshRateInHz = desc.refresh_rate;
|
||||
present_parameters->FullScreen_PresentationInterval = desc.swap_interval;
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
|
||||
@@ -96,7 +96,7 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetDevice(IDirect3DTexture8 *iface,
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice8 *)This->parentDevice;
|
||||
*device = This->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -108,13 +108,15 @@ static HRESULT WINAPI IDirect3DTexture8Impl_SetPrivateData(IDirect3DTexture8 *if
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -124,13 +126,15 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetPrivateData(IDirect3DTexture8 *if
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -140,12 +144,14 @@ static HRESULT WINAPI IDirect3DTexture8Impl_FreePrivateData(IDirect3DTexture8 *i
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -192,16 +198,9 @@ static void WINAPI IDirect3DTexture8Impl_PreLoad(IDirect3DTexture8 *iface)
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DTexture8Impl_GetType(IDirect3DTexture8 *iface)
|
||||
{
|
||||
IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
|
||||
D3DRESOURCETYPE type;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
type = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return type;
|
||||
return D3DRTYPE_TEXTURE;
|
||||
}
|
||||
|
||||
/* IDirect3DTexture8 IDirect3DBaseTexture8 Interface follow: */
|
||||
@@ -266,7 +265,7 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(IDirect3DTexture8 *ifac
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
@@ -352,14 +351,14 @@ static HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(IDirect3DTexture8 *ifac
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
|
||||
else
|
||||
{
|
||||
WINED3DBOX dirty_region;
|
||||
struct wined3d_box dirty_region;
|
||||
|
||||
dirty_region.Left = dirty_rect->left;
|
||||
dirty_region.Top = dirty_rect->top;
|
||||
dirty_region.Right = dirty_rect->right;
|
||||
dirty_region.Bottom = dirty_rect->bottom;
|
||||
dirty_region.Front = 0;
|
||||
dirty_region.Back = 1;
|
||||
dirty_region.left = dirty_rect->left;
|
||||
dirty_region.top = dirty_rect->top;
|
||||
dirty_region.right = dirty_rect->right;
|
||||
dirty_region.bottom = dirty_rect->bottom;
|
||||
dirty_region.front = 0;
|
||||
dirty_region.back = 1;
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
|
||||
}
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
@@ -193,7 +193,7 @@ size_t parse_token(const DWORD* pToken)
|
||||
|
||||
default:
|
||||
TRACE(" 0x%08x UNKNOWN\n", token);
|
||||
/* argg error */
|
||||
/* arg error */
|
||||
}
|
||||
|
||||
return tokenlen;
|
||||
@@ -303,10 +303,10 @@ static const wined3d_usage_t wined3d_usage_lookup[] = {
|
||||
|
||||
/* TODO: find out where rhw (or positionT) is for declaration8 */
|
||||
static UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size,
|
||||
WINED3DVERTEXELEMENT **wined3d_elements)
|
||||
struct wined3d_vertex_element **wined3d_elements)
|
||||
{
|
||||
struct wined3d_vertex_element *element;
|
||||
const DWORD *token = d3d8_elements;
|
||||
WINED3DVERTEXELEMENT *element;
|
||||
D3DVSD_TOKENTYPE token_type;
|
||||
unsigned int element_count = 0;
|
||||
WORD stream = 0;
|
||||
@@ -315,7 +315,7 @@ static UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3
|
||||
TRACE("d3d8_elements %p, wined3d_elements %p\n", d3d8_elements, wined3d_elements);
|
||||
|
||||
/* 128 should be enough for anyone... */
|
||||
*wined3d_elements = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 128 * sizeof(WINED3DVERTEXELEMENT));
|
||||
*wined3d_elements = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 128 * sizeof(**wined3d_elements));
|
||||
while (D3DVSD_END() != *token)
|
||||
{
|
||||
token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT);
|
||||
@@ -380,7 +380,7 @@ static const struct wined3d_parent_ops d3d8_vertexdeclaration_wined3d_parent_ops
|
||||
HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration8Impl *declaration,
|
||||
IDirect3DDevice8Impl *device, const DWORD *elements, DWORD shader_handle)
|
||||
{
|
||||
WINED3DVERTEXELEMENT *wined3d_elements;
|
||||
struct wined3d_vertex_element *wined3d_elements;
|
||||
UINT wined3d_element_count;
|
||||
HRESULT hr;
|
||||
|
||||
|
||||
@@ -126,13 +126,15 @@ static HRESULT WINAPI IDirect3DVolume8Impl_SetPrivateData(IDirect3DVolume8 *ifac
|
||||
const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DVolume8Impl *This = impl_from_IDirect3DVolume8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_set_private_data(This->wined3d_volume, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -142,13 +144,15 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetPrivateData(IDirect3DVolume8 *ifac
|
||||
void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DVolume8Impl *This = impl_from_IDirect3DVolume8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_get_private_data(This->wined3d_volume, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -157,12 +161,14 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetPrivateData(IDirect3DVolume8 *ifac
|
||||
static HRESULT WINAPI IDirect3DVolume8Impl_FreePrivateData(IDirect3DVolume8 *iface, REFGUID refguid)
|
||||
{
|
||||
IDirect3DVolume8Impl *This = impl_from_IDirect3DVolume8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_free_private_data(This->wined3d_volume, refguid);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -201,7 +207,7 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(IDirect3DVolume8 *iface, D3DV
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->Width = wined3d_desc.width;
|
||||
@@ -221,8 +227,8 @@ static HRESULT WINAPI IDirect3DVolume8Impl_LockBox(IDirect3DVolume8 *iface,
|
||||
iface, pLockedVolume, pBox, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_map(This->wined3d_volume, (WINED3DLOCKED_BOX *)pLockedVolume,
|
||||
(const WINED3DBOX *)pBox, Flags);
|
||||
hr = wined3d_volume_map(This->wined3d_volume, (struct wined3d_mapped_box *)pLockedVolume,
|
||||
(const struct wined3d_box *)pBox, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -270,7 +276,7 @@ static const struct wined3d_parent_ops d3d8_volume_wined3d_parent_ops =
|
||||
};
|
||||
|
||||
HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool)
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetDevice(IDirect3DVolumeTextu
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice8 *)This->parentDevice;
|
||||
*device = This->parentDevice;
|
||||
IDirect3DDevice8_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -107,13 +107,15 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(IDirect3DVolume
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -123,13 +125,15 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetPrivateData(IDirect3DVolume
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -139,12 +143,14 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_FreePrivateData(IDirect3DVolum
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -192,16 +198,9 @@ static void WINAPI IDirect3DVolumeTexture8Impl_PreLoad(IDirect3DVolumeTexture8 *
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(IDirect3DVolumeTexture8 *iface)
|
||||
{
|
||||
IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
|
||||
D3DRESOURCETYPE type;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
type = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return type;
|
||||
return D3DRTYPE_VOLUMETEXTURE;
|
||||
}
|
||||
|
||||
/* IDirect3DVolumeTexture8 IDirect3DBaseTexture8 Interface follow: */
|
||||
@@ -266,7 +265,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(IDirect3DVolumeTe
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->Width = wined3d_desc.width;
|
||||
@@ -349,7 +348,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(IDirect3DVolumeTex
|
||||
TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const WINED3DBOX *)dirty_box);
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
|
||||
@@ -19,10 +19,16 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "d3d9_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
|
||||
|
||||
static inline IDirect3DVertexBuffer9Impl *impl_from_IDirect3DVertexBuffer9(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexBuffer9Impl, IDirect3DVertexBuffer9_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_QueryInterface(IDirect3DVertexBuffer9 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -44,7 +50,7 @@ static HRESULT WINAPI d3d9_vertexbuffer_QueryInterface(IDirect3DVertexBuffer9 *i
|
||||
|
||||
static ULONG WINAPI d3d9_vertexbuffer_AddRef(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface;
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
ULONG refcount = InterlockedIncrement(&buffer->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -62,7 +68,7 @@ static ULONG WINAPI d3d9_vertexbuffer_AddRef(IDirect3DVertexBuffer9 *iface)
|
||||
|
||||
static ULONG WINAPI d3d9_vertexbuffer_Release(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface;
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
ULONG refcount = InterlockedDecrement(&buffer->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -82,11 +88,14 @@ static ULONG WINAPI d3d9_vertexbuffer_Release(IDirect3DVertexBuffer9 *iface)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_GetDevice(IDirect3DVertexBuffer9 *iface, IDirect3DDevice9 **device)
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_GetDevice(IDirect3DVertexBuffer9 *iface,
|
||||
IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)((IDirect3DVertexBuffer9Impl *)iface)->parentDevice;
|
||||
*device = (IDirect3DDevice9 *)buffer->parentDevice;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -97,14 +106,16 @@ static HRESULT WINAPI d3d9_vertexbuffer_GetDevice(IDirect3DVertexBuffer9 *iface,
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer9 *iface,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_set_private_data(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer,
|
||||
guid, data, data_size, flags);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -113,14 +124,16 @@ static HRESULT WINAPI d3d9_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer9 *i
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer9 *iface,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_get_private_data(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer,
|
||||
guid, data, data_size);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -128,12 +141,15 @@ static HRESULT WINAPI d3d9_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer9 *i
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer9 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_free_private_data(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, guid);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -141,12 +157,13 @@ static HRESULT WINAPI d3d9_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer9 *
|
||||
|
||||
static DWORD WINAPI d3d9_vertexbuffer_SetPriority(IDirect3DVertexBuffer9 *iface, DWORD priority)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
DWORD previous;
|
||||
|
||||
TRACE("iface %p, priority %u.\n", iface, priority);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
previous = wined3d_buffer_set_priority(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, priority);
|
||||
previous = wined3d_buffer_set_priority(buffer->wineD3DVertexBuffer, priority);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return previous;
|
||||
@@ -154,12 +171,13 @@ static DWORD WINAPI d3d9_vertexbuffer_SetPriority(IDirect3DVertexBuffer9 *iface,
|
||||
|
||||
static DWORD WINAPI d3d9_vertexbuffer_GetPriority(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
DWORD priority;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
priority = wined3d_buffer_get_priority(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer);
|
||||
priority = wined3d_buffer_get_priority(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return priority;
|
||||
@@ -167,10 +185,12 @@ static DWORD WINAPI d3d9_vertexbuffer_GetPriority(IDirect3DVertexBuffer9 *iface)
|
||||
|
||||
static void WINAPI d3d9_vertexbuffer_PreLoad(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_preload(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer);
|
||||
wined3d_buffer_preload(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
@@ -181,17 +201,17 @@ static D3DRESOURCETYPE WINAPI d3d9_vertexbuffer_GetType(IDirect3DVertexBuffer9 *
|
||||
return D3DRTYPE_VERTEXBUFFER;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_Lock(IDirect3DVertexBuffer9 *iface,
|
||||
UINT offset, UINT size, void **data, DWORD flags)
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_Lock(IDirect3DVertexBuffer9 *iface, UINT offset, UINT size,
|
||||
void **data, DWORD flags)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n",
|
||||
iface, offset, size, data, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_map(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer,
|
||||
offset, size, (BYTE **)data, flags);
|
||||
hr = wined3d_buffer_map(buffer->wineD3DVertexBuffer, offset, size, (BYTE **)data, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -199,18 +219,21 @@ static HRESULT WINAPI d3d9_vertexbuffer_Lock(IDirect3DVertexBuffer9 *iface,
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_Unlock(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_unmap(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer);
|
||||
wined3d_buffer_unmap(buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_GetDesc(IDirect3DVertexBuffer9 *iface, D3DVERTEXBUFFER_DESC *desc)
|
||||
static HRESULT WINAPI d3d9_vertexbuffer_GetDesc(IDirect3DVertexBuffer9 *iface,
|
||||
D3DVERTEXBUFFER_DESC *desc)
|
||||
{
|
||||
IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface;
|
||||
IDirect3DVertexBuffer9Impl *buffer = impl_from_IDirect3DVertexBuffer9(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -222,7 +245,7 @@ static HRESULT WINAPI d3d9_vertexbuffer_GetDesc(IDirect3DVertexBuffer9 *iface, D
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
desc->Format = D3DFMT_VERTEXDATA;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->Type = D3DRTYPE_VERTEXBUFFER;
|
||||
@@ -267,13 +290,13 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Im
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
buffer->lpVtbl = &d3d9_vertexbuffer_vtbl;
|
||||
buffer->IDirect3DVertexBuffer9_iface.lpVtbl = &d3d9_vertexbuffer_vtbl;
|
||||
buffer->ref = 1;
|
||||
buffer->fvf = fvf;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_create_vb(device->wined3d_device, size, usage & WINED3DUSAGE_MASK,
|
||||
(WINED3DPOOL)pool, buffer, &d3d9_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
|
||||
(enum wined3d_pool)pool, buffer, &d3d9_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -287,6 +310,20 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Im
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DVertexBuffer9Impl *unsafe_impl_from_IDirect3DVertexBuffer9(IDirect3DVertexBuffer9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d9_vertexbuffer_vtbl);
|
||||
|
||||
return impl_from_IDirect3DVertexBuffer9(iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DIndexBuffer9Impl *impl_from_IDirect3DIndexBuffer9(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DIndexBuffer9Impl, IDirect3DIndexBuffer9_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_indexbuffer_QueryInterface(IDirect3DIndexBuffer9 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -308,7 +345,7 @@ static HRESULT WINAPI d3d9_indexbuffer_QueryInterface(IDirect3DIndexBuffer9 *ifa
|
||||
|
||||
static ULONG WINAPI d3d9_indexbuffer_AddRef(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface;
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
ULONG refcount = InterlockedIncrement(&buffer->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -326,7 +363,7 @@ static ULONG WINAPI d3d9_indexbuffer_AddRef(IDirect3DIndexBuffer9 *iface)
|
||||
|
||||
static ULONG WINAPI d3d9_indexbuffer_Release(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface;
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
ULONG refcount = InterlockedDecrement(&buffer->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -346,11 +383,14 @@ static ULONG WINAPI d3d9_indexbuffer_Release(IDirect3DIndexBuffer9 *iface)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_indexbuffer_GetDevice(IDirect3DIndexBuffer9 *iface, IDirect3DDevice9 **device)
|
||||
static HRESULT WINAPI d3d9_indexbuffer_GetDevice(IDirect3DIndexBuffer9 *iface,
|
||||
IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)((IDirect3DIndexBuffer9Impl *)iface)->parentDevice;
|
||||
*device = (IDirect3DDevice9 *)buffer->parentDevice;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -361,14 +401,16 @@ static HRESULT WINAPI d3d9_indexbuffer_GetDevice(IDirect3DIndexBuffer9 *iface, I
|
||||
static HRESULT WINAPI d3d9_indexbuffer_SetPrivateData(IDirect3DIndexBuffer9 *iface,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_set_private_data(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer,
|
||||
guid, data, data_size, flags);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -377,14 +419,16 @@ static HRESULT WINAPI d3d9_indexbuffer_SetPrivateData(IDirect3DIndexBuffer9 *ifa
|
||||
static HRESULT WINAPI d3d9_indexbuffer_GetPrivateData(IDirect3DIndexBuffer9 *iface,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_get_private_data(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer,
|
||||
guid, data, data_size);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -392,12 +436,15 @@ static HRESULT WINAPI d3d9_indexbuffer_GetPrivateData(IDirect3DIndexBuffer9 *ifa
|
||||
|
||||
static HRESULT WINAPI d3d9_indexbuffer_FreePrivateData(IDirect3DIndexBuffer9 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_free_private_data(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, guid);
|
||||
resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -405,12 +452,13 @@ static HRESULT WINAPI d3d9_indexbuffer_FreePrivateData(IDirect3DIndexBuffer9 *if
|
||||
|
||||
static DWORD WINAPI d3d9_indexbuffer_SetPriority(IDirect3DIndexBuffer9 *iface, DWORD priority)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
DWORD previous;
|
||||
|
||||
TRACE("iface %p, priority %u.\n", iface, priority);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
previous = wined3d_buffer_set_priority(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, priority);
|
||||
previous = wined3d_buffer_set_priority(buffer->wineD3DIndexBuffer, priority);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return previous;
|
||||
@@ -418,12 +466,13 @@ static DWORD WINAPI d3d9_indexbuffer_SetPriority(IDirect3DIndexBuffer9 *iface, D
|
||||
|
||||
static DWORD WINAPI d3d9_indexbuffer_GetPriority(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
DWORD priority;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
priority = wined3d_buffer_get_priority(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer);
|
||||
priority = wined3d_buffer_get_priority(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return priority;
|
||||
@@ -431,10 +480,12 @@ static DWORD WINAPI d3d9_indexbuffer_GetPriority(IDirect3DIndexBuffer9 *iface)
|
||||
|
||||
static void WINAPI d3d9_indexbuffer_PreLoad(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_preload(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer);
|
||||
wined3d_buffer_preload(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
@@ -448,14 +499,14 @@ static D3DRESOURCETYPE WINAPI d3d9_indexbuffer_GetType(IDirect3DIndexBuffer9 *if
|
||||
static HRESULT WINAPI d3d9_indexbuffer_Lock(IDirect3DIndexBuffer9 *iface,
|
||||
UINT offset, UINT size, void **data, DWORD flags)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n",
|
||||
iface, offset, size, data, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_map(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer,
|
||||
offset, size, (BYTE **)data, flags);
|
||||
hr = wined3d_buffer_map(buffer->wineD3DIndexBuffer, offset, size, (BYTE **)data, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -463,18 +514,21 @@ static HRESULT WINAPI d3d9_indexbuffer_Lock(IDirect3DIndexBuffer9 *iface,
|
||||
|
||||
static HRESULT WINAPI d3d9_indexbuffer_Unlock(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_unmap(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer);
|
||||
wined3d_buffer_unmap(buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_indexbuffer_GetDesc(IDirect3DIndexBuffer9 *iface, D3DINDEXBUFFER_DESC *desc)
|
||||
static HRESULT WINAPI d3d9_indexbuffer_GetDesc(IDirect3DIndexBuffer9 *iface,
|
||||
D3DINDEXBUFFER_DESC *desc)
|
||||
{
|
||||
IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface;
|
||||
IDirect3DIndexBuffer9Impl *buffer = impl_from_IDirect3DIndexBuffer9(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -486,7 +540,7 @@ static HRESULT WINAPI d3d9_indexbuffer_GetDesc(IDirect3DIndexBuffer9 *iface, D3D
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(buffer->format);
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Size = wined3d_desc.size;
|
||||
desc->Type = D3DRTYPE_INDEXBUFFER;
|
||||
@@ -530,13 +584,13 @@ HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
buffer->lpVtbl = &d3d9_indexbuffer_vtbl;
|
||||
buffer->IDirect3DIndexBuffer9_iface.lpVtbl = &d3d9_indexbuffer_vtbl;
|
||||
buffer->ref = 1;
|
||||
buffer->format = wined3dformat_from_d3dformat(format);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_buffer_create_ib(device->wined3d_device, size, usage & WINED3DUSAGE_MASK,
|
||||
(WINED3DPOOL)pool, buffer, &d3d9_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer);
|
||||
(enum wined3d_pool)pool, buffer, &d3d9_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -549,3 +603,12 @@ HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DIndexBuffer9Impl *unsafe_impl_from_IDirect3DIndexBuffer9(IDirect3DIndexBuffer9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d9_indexbuffer_vtbl);
|
||||
|
||||
return impl_from_IDirect3DIndexBuffer9(iface);
|
||||
}
|
||||
|
||||
@@ -112,13 +112,15 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetPrivateData(IDirect3DCubeText
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -128,13 +130,15 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetPrivateData(IDirect3DCubeText
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -144,12 +148,14 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_FreePrivateData(IDirect3DCubeTex
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -197,16 +203,9 @@ static void WINAPI IDirect3DCubeTexture9Impl_PreLoad(IDirect3DCubeTexture9 *ifac
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(IDirect3DCubeTexture9 *iface)
|
||||
{
|
||||
IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
|
||||
D3DRESOURCETYPE ret;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
ret = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return ret;
|
||||
return D3DRTYPE_CUBETEXTURE;
|
||||
}
|
||||
|
||||
/* IDirect3DCubeTexture9 IDirect3DBaseTexture9 Interface follow: */
|
||||
@@ -261,7 +260,7 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetAutoGenFilterType(IDirect3DCu
|
||||
TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (WINED3DTEXTUREFILTERTYPE)FilterType);
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -312,7 +311,7 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(IDirect3DCubeTextur
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
desc->MultiSampleQuality = wined3d_desc.multisample_quality;
|
||||
@@ -407,14 +406,14 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_AddDirtyRect(IDirect3DCubeTextu
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
|
||||
else
|
||||
{
|
||||
WINED3DBOX dirty_region;
|
||||
struct wined3d_box dirty_region;
|
||||
|
||||
dirty_region.Left = dirty_rect->left;
|
||||
dirty_region.Top = dirty_rect->top;
|
||||
dirty_region.Right = dirty_rect->right;
|
||||
dirty_region.Bottom = dirty_rect->bottom;
|
||||
dirty_region.Front = 0;
|
||||
dirty_region.Back = 1;
|
||||
dirty_region.left = dirty_rect->left;
|
||||
dirty_region.top = dirty_rect->top;
|
||||
dirty_region.right = dirty_rect->right;
|
||||
dirty_region.bottom = dirty_rect->bottom;
|
||||
dirty_region.front = 0;
|
||||
dirty_region.back = 1;
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
|
||||
}
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
@@ -40,7 +40,7 @@ IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) {
|
||||
object->ref = 1;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
object->WineD3D = wined3d_create(9, object);
|
||||
object->WineD3D = wined3d_create(9, 0, object);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D);
|
||||
|
||||
@@ -111,16 +111,15 @@ enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_H
|
||||
_pD3D9Caps->DeclTypes = _pWineCaps->DeclTypes; \
|
||||
_pD3D9Caps->NumSimultaneousRTs = _pWineCaps->NumSimultaneousRTs; \
|
||||
_pD3D9Caps->StretchRectFilterCaps = _pWineCaps->StretchRectFilterCaps; \
|
||||
_pD3D9Caps->VS20Caps.Caps = _pWineCaps->VS20Caps.Caps; \
|
||||
_pD3D9Caps->VS20Caps.DynamicFlowControlDepth = _pWineCaps->VS20Caps.DynamicFlowControlDepth; \
|
||||
_pD3D9Caps->VS20Caps.NumTemps = _pWineCaps->VS20Caps.NumTemps; \
|
||||
_pD3D9Caps->VS20Caps.NumTemps = _pWineCaps->VS20Caps.NumTemps; \
|
||||
_pD3D9Caps->VS20Caps.StaticFlowControlDepth = _pWineCaps->VS20Caps.StaticFlowControlDepth; \
|
||||
_pD3D9Caps->PS20Caps.Caps = _pWineCaps->PS20Caps.Caps; \
|
||||
_pD3D9Caps->PS20Caps.DynamicFlowControlDepth = _pWineCaps->PS20Caps.DynamicFlowControlDepth; \
|
||||
_pD3D9Caps->PS20Caps.NumTemps = _pWineCaps->PS20Caps.NumTemps; \
|
||||
_pD3D9Caps->PS20Caps.StaticFlowControlDepth = _pWineCaps->PS20Caps.StaticFlowControlDepth; \
|
||||
_pD3D9Caps->PS20Caps.NumInstructionSlots = _pWineCaps->PS20Caps.NumInstructionSlots; \
|
||||
_pD3D9Caps->VS20Caps.Caps = _pWineCaps->VS20Caps.caps; \
|
||||
_pD3D9Caps->VS20Caps.DynamicFlowControlDepth = _pWineCaps->VS20Caps.dynamic_flow_control_depth; \
|
||||
_pD3D9Caps->VS20Caps.NumTemps = _pWineCaps->VS20Caps.temp_count; \
|
||||
_pD3D9Caps->VS20Caps.StaticFlowControlDepth = _pWineCaps->VS20Caps.static_flow_control_depth; \
|
||||
_pD3D9Caps->PS20Caps.Caps = _pWineCaps->PS20Caps.caps; \
|
||||
_pD3D9Caps->PS20Caps.DynamicFlowControlDepth = _pWineCaps->PS20Caps.dynamic_flow_control_depth; \
|
||||
_pD3D9Caps->PS20Caps.NumTemps = _pWineCaps->PS20Caps.temp_count; \
|
||||
_pD3D9Caps->PS20Caps.StaticFlowControlDepth = _pWineCaps->PS20Caps.static_flow_control_depth; \
|
||||
_pD3D9Caps->PS20Caps.NumInstructionSlots = _pWineCaps->PS20Caps.instruction_slot_count; \
|
||||
_pD3D9Caps->VertexTextureFilterCaps = _pWineCaps->VertexTextureFilterCaps; \
|
||||
_pD3D9Caps->MaxVShaderInstructionsExecuted = _pWineCaps->MaxVShaderInstructionsExecuted; \
|
||||
_pD3D9Caps->MaxPShaderInstructionsExecuted = _pWineCaps->MaxPShaderInstructionsExecuted; \
|
||||
@@ -166,6 +165,7 @@ typedef struct IDirect3DDevice9Impl
|
||||
struct wined3d_device_parent device_parent;
|
||||
LONG ref;
|
||||
struct wined3d_device *wined3d_device;
|
||||
IDirect3D9Ex *d3d_parent;
|
||||
/* Avoids recursion with nested ReleaseRef to 0 */
|
||||
BOOL inDestruction;
|
||||
|
||||
@@ -175,7 +175,7 @@ typedef struct IDirect3DDevice9Impl
|
||||
BOOL notreset;
|
||||
} IDirect3DDevice9Impl;
|
||||
|
||||
HRESULT device_init(IDirect3DDevice9Impl *device, struct wined3d *wined3d, UINT adapter, D3DDEVTYPE device_type,
|
||||
HRESULT device_init(IDirect3DDevice9Impl *device, IDirect3D9Impl *parent, struct wined3d *wined3d, UINT adapter, D3DDEVTYPE device_type,
|
||||
HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode) DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -192,7 +192,7 @@ typedef struct IDirect3DVolume9Impl
|
||||
} IDirect3DVolume9Impl;
|
||||
|
||||
HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ------------------- */
|
||||
/* IDirect3DSwapChain9 */
|
||||
@@ -222,9 +222,8 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
|
||||
*/
|
||||
typedef struct IDirect3DSurface9Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DSurface9Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
IDirect3DSurface9 IDirect3DSurface9_iface;
|
||||
LONG ref;
|
||||
struct wined3d_surface *wined3d_surface;
|
||||
IDirect3DDevice9Ex *parentDevice;
|
||||
|
||||
@@ -240,6 +239,7 @@ typedef struct IDirect3DSurface9Impl
|
||||
HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *device,
|
||||
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;
|
||||
IDirect3DSurface9Impl *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ---------------------- */
|
||||
/* IDirect3DVertexBuffer9 */
|
||||
@@ -250,10 +250,8 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
|
||||
*/
|
||||
typedef struct IDirect3DVertexBuffer9Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DVertexBuffer9Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
IDirect3DVertexBuffer9 IDirect3DVertexBuffer9_iface;
|
||||
LONG ref;
|
||||
struct wined3d_buffer *wineD3DVertexBuffer;
|
||||
IDirect3DDevice9Ex *parentDevice;
|
||||
DWORD fvf;
|
||||
@@ -261,6 +259,7 @@ typedef struct IDirect3DVertexBuffer9Impl
|
||||
|
||||
HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device,
|
||||
UINT size, UINT usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexBuffer9Impl *unsafe_impl_from_IDirect3DVertexBuffer9(IDirect3DVertexBuffer9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------------- */
|
||||
/* IDirect3DIndexBuffer9 */
|
||||
@@ -271,10 +270,8 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Im
|
||||
*/
|
||||
typedef struct IDirect3DIndexBuffer9Impl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirect3DIndexBuffer9Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
IDirect3DIndexBuffer9 IDirect3DIndexBuffer9_iface;
|
||||
LONG ref;
|
||||
struct wined3d_buffer *wineD3DIndexBuffer;
|
||||
IDirect3DDevice9Ex *parentDevice;
|
||||
enum wined3d_format_id format;
|
||||
@@ -282,6 +279,7 @@ typedef struct IDirect3DIndexBuffer9Impl
|
||||
|
||||
HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device,
|
||||
UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN;
|
||||
IDirect3DIndexBuffer9Impl *unsafe_impl_from_IDirect3DIndexBuffer9(IDirect3DIndexBuffer9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------------- */
|
||||
/* IDirect3DBaseTexture9 */
|
||||
@@ -407,8 +405,7 @@ HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration,
|
||||
* IDirect3DVertexShader implementation structure
|
||||
*/
|
||||
typedef struct IDirect3DVertexShader9Impl {
|
||||
/* IUnknown fields */
|
||||
const IDirect3DVertexShader9Vtbl *lpVtbl;
|
||||
IDirect3DVertexShader9 IDirect3DVertexShader9_iface;
|
||||
LONG ref;
|
||||
struct wined3d_shader *wined3d_shader;
|
||||
IDirect3DDevice9Ex *parentDevice;
|
||||
@@ -416,6 +413,7 @@ typedef struct IDirect3DVertexShader9Impl {
|
||||
|
||||
HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader,
|
||||
IDirect3DDevice9Impl *device, const DWORD *byte_code) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexShader9Impl *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
#define D3D9_MAX_VERTEX_SHADER_CONSTANTF 256
|
||||
#define D3D9_MAX_SIMULTANEOUS_RENDERTARGETS 4
|
||||
@@ -428,15 +426,15 @@ HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader,
|
||||
* IDirect3DPixelShader implementation structure
|
||||
*/
|
||||
typedef struct IDirect3DPixelShader9Impl {
|
||||
/* IUnknown fields */
|
||||
const IDirect3DPixelShader9Vtbl *lpVtbl;
|
||||
LONG ref;
|
||||
IDirect3DPixelShader9 IDirect3DPixelShader9_iface;
|
||||
LONG ref;
|
||||
struct wined3d_shader *wined3d_shader;
|
||||
IDirect3DDevice9Ex *parentDevice;
|
||||
} IDirect3DPixelShader9Impl;
|
||||
|
||||
HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader,
|
||||
IDirect3DDevice9Impl *device, const DWORD *byte_code) DECLSPEC_HIDDEN;
|
||||
IDirect3DPixelShader9Impl *unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------- */
|
||||
/* IDirect3DQuery9 */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -103,25 +103,25 @@ static HRESULT WINAPI IDirect3D9Impl_RegisterSoftwareDevice(IDirect3D9Ex *ifac
|
||||
return hr;
|
||||
}
|
||||
|
||||
static UINT WINAPI IDirect3D9Impl_GetAdapterCount(IDirect3D9Ex *iface)
|
||||
static UINT WINAPI IDirect3D9Impl_GetAdapterCount(IDirect3D9Ex *iface)
|
||||
{
|
||||
IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface);
|
||||
HRESULT hr;
|
||||
UINT ret;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_get_adapter_count(This->WineD3D);
|
||||
ret = wined3d_get_adapter_count(This->WineD3D);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(IDirect3D9Ex *iface, UINT Adapter,
|
||||
DWORD Flags, D3DADAPTER_IDENTIFIER9 *pIdentifier)
|
||||
{
|
||||
IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface);
|
||||
WINED3DADAPTER_IDENTIFIER adapter_id;
|
||||
struct wined3d_adapter_identifier adapter_id;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, adapter %u, flags %#x, identifier %p.\n",
|
||||
@@ -153,7 +153,7 @@ static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(IDirect3D9Ex *iface, UINT
|
||||
D3DFORMAT Format)
|
||||
{
|
||||
IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface);
|
||||
HRESULT hr;
|
||||
UINT ret;
|
||||
|
||||
TRACE("iface %p, adapter %u, format %#x.\n", iface, Adapter, Format);
|
||||
|
||||
@@ -163,10 +163,10 @@ static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(IDirect3D9Ex *iface, UINT
|
||||
}
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_get_adapter_mode_count(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format));
|
||||
ret = wined3d_get_adapter_mode_count(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format));
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(IDirect3D9Ex *iface, UINT Adapter,
|
||||
@@ -185,7 +185,7 @@ static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(IDirect3D9Ex *iface, UINT
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_enum_adapter_modes(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format),
|
||||
Mode, (WINED3DDISPLAYMODE *) pMode);
|
||||
Mode, (struct wined3d_display_mode *)pMode);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
|
||||
@@ -202,7 +202,7 @@ static HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(IDirect3D9Ex *iface,
|
||||
TRACE("iface %p, adapter %u, mode %p.\n", iface, Adapter, pMode);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_get_adapter_display_mode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *)pMode);
|
||||
hr = wined3d_get_adapter_display_mode(This->WineD3D, Adapter, (struct wined3d_display_mode *)pMode);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
|
||||
@@ -232,38 +232,26 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(IDirect3D9Ex *iface, UINT
|
||||
D3DFORMAT CheckFormat)
|
||||
{
|
||||
IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface);
|
||||
enum wined3d_resource_type wined3d_rtype;
|
||||
HRESULT hr;
|
||||
WINED3DRESOURCETYPE WineD3DRType;
|
||||
|
||||
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
|
||||
iface, Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat);
|
||||
|
||||
/* This format is nothing special and it is supported perfectly.
|
||||
* However, ati and nvidia driver on windows do not mark this format as
|
||||
* supported (tested with the dxCapsViewer) and pretending to
|
||||
* support this format uncovers a bug in Battlefield 1942 (fonts are missing)
|
||||
* So do the same as Windows drivers and pretend not to support it on dx8 and 9
|
||||
*/
|
||||
if(CheckFormat == D3DFMT_R8G8B8)
|
||||
{
|
||||
WARN("D3DFMT_R8G8B8 is not available on windows, returning D3DERR_NOTAVAILABLE\n");
|
||||
return D3DERR_NOTAVAILABLE;
|
||||
}
|
||||
|
||||
switch(RType) {
|
||||
case D3DRTYPE_VERTEXBUFFER:
|
||||
case D3DRTYPE_INDEXBUFFER:
|
||||
WineD3DRType = WINED3DRTYPE_BUFFER;
|
||||
wined3d_rtype = WINED3D_RTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
default:
|
||||
WineD3DRType = RType;
|
||||
wined3d_rtype = RType;
|
||||
break;
|
||||
}
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_check_device_format(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(AdapterFormat),
|
||||
Usage, WineD3DRType, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
|
||||
Usage, wined3d_rtype, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -325,7 +313,8 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(IDirect3D9Ex *i
|
||||
|
||||
void filter_caps(D3DCAPS9* pCaps)
|
||||
{
|
||||
|
||||
DWORD ps_minor_version[] = {0, 4, 0, 0};
|
||||
DWORD vs_minor_version[] = {0, 1, 0, 0};
|
||||
DWORD textureFilterCaps =
|
||||
D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC |
|
||||
D3DPTFILTERCAPS_MINFPYRAMIDALQUAD | D3DPTFILTERCAPS_MINFGAUSSIANQUAD|
|
||||
@@ -381,6 +370,22 @@ void filter_caps(D3DCAPS9* pCaps)
|
||||
|
||||
pCaps->MaxVertexShaderConst = min(D3D9_MAX_VERTEX_SHADER_CONSTANTF, pCaps->MaxVertexShaderConst);
|
||||
pCaps->NumSimultaneousRTs = min(D3D9_MAX_SIMULTANEOUS_RENDERTARGETS, pCaps->NumSimultaneousRTs);
|
||||
|
||||
if (pCaps->PixelShaderVersion > 3)
|
||||
pCaps->PixelShaderVersion = D3DPS_VERSION(3,0);
|
||||
else
|
||||
{
|
||||
DWORD major = pCaps->PixelShaderVersion;
|
||||
pCaps->PixelShaderVersion = D3DPS_VERSION(major,ps_minor_version[major]);
|
||||
}
|
||||
|
||||
if (pCaps->VertexShaderVersion > 3)
|
||||
pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
|
||||
else
|
||||
{
|
||||
DWORD major = pCaps->VertexShaderVersion;
|
||||
pCaps->VertexShaderVersion = D3DVS_VERSION(major,vs_minor_version[major]);
|
||||
}
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(IDirect3D9Ex *iface, UINT Adapter,
|
||||
@@ -449,7 +454,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = device_init(object, This->WineD3D, adapter, device_type, focus_window, flags, parameters, NULL);
|
||||
hr = device_init(object, This, This->WineD3D, adapter, device_type, focus_window, flags, parameters, NULL);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize device, hr %#x.\n", hr);
|
||||
@@ -468,7 +473,7 @@ static UINT WINAPI IDirect3D9ExImpl_GetAdapterModeCountEx(IDirect3D9Ex *iface,
|
||||
{
|
||||
FIXME("iface %p, adapter %u, filter %p stub!\n", iface, adapter, filter);
|
||||
|
||||
return E_NOTIMPL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3D9ExImpl_EnumAdapterModesEx(IDirect3D9Ex *iface,
|
||||
@@ -507,7 +512,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = device_init(object, d3d9->WineD3D, adapter, device_type, focus_window, flags, parameters, mode);
|
||||
hr = device_init(object, d3d9, d3d9->WineD3D, adapter, device_type, focus_window, flags, parameters, mode);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize device, hr %#x.\n", hr);
|
||||
@@ -524,7 +529,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3
|
||||
static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterLUID(IDirect3D9Ex *iface, UINT adapter, LUID *luid)
|
||||
{
|
||||
IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface);
|
||||
WINED3DADAPTER_IDENTIFIER adapter_id;
|
||||
struct wined3d_adapter_identifier adapter_id;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, adapter %u, luid %p.\n", iface, adapter, luid);
|
||||
|
||||
@@ -18,10 +18,16 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "d3d9_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
|
||||
|
||||
static inline IDirect3DVertexShader9Impl *impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexShader9Impl, IDirect3DVertexShader9_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -42,7 +48,7 @@ static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *i
|
||||
|
||||
static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface)
|
||||
{
|
||||
IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface;
|
||||
IDirect3DVertexShader9Impl *shader = impl_from_IDirect3DVertexShader9(iface);
|
||||
ULONG refcount = InterlockedIncrement(&shader->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -60,7 +66,7 @@ static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface)
|
||||
|
||||
static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface)
|
||||
{
|
||||
IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface;
|
||||
IDirect3DVertexShader9Impl *shader = impl_from_IDirect3DVertexShader9(iface);
|
||||
ULONG refcount = InterlockedDecrement(&shader->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -82,9 +88,11 @@ static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface)
|
||||
|
||||
static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DVertexShader9Impl *shader = impl_from_IDirect3DVertexShader9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)((IDirect3DVertexShader9Impl *)iface)->parentDevice;
|
||||
*device = (IDirect3DDevice9 *)shader->parentDevice;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -95,12 +103,13 @@ static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface,
|
||||
static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *iface,
|
||||
void *data, UINT *data_size)
|
||||
{
|
||||
IDirect3DVertexShader9Impl *shader = impl_from_IDirect3DVertexShader9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_get_byte_code(((IDirect3DVertexShader9Impl *)iface)->wined3d_shader, data, data_size);
|
||||
hr = wined3d_shader_get_byte_code(shader->wined3d_shader, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -132,11 +141,11 @@ HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Im
|
||||
HRESULT hr;
|
||||
|
||||
shader->ref = 1;
|
||||
shader->lpVtbl = &d3d9_vertexshader_vtbl;
|
||||
shader->IDirect3DVertexShader9_iface.lpVtbl = &d3d9_vertexshader_vtbl;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_create_vs(device->wined3d_device, byte_code, NULL,
|
||||
shader, &d3d9_vertexshader_wined3d_parent_ops, &shader->wined3d_shader);
|
||||
shader, &d3d9_vertexshader_wined3d_parent_ops, &shader->wined3d_shader, 3);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -150,6 +159,20 @@ HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Im
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DVertexShader9Impl *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d9_vertexshader_vtbl);
|
||||
|
||||
return impl_from_IDirect3DVertexShader9(iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DPixelShader9Impl *impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DPixelShader9Impl, IDirect3DPixelShader9_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *iface, REFIID riid, void **object)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||
@@ -170,7 +193,7 @@ static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *ifa
|
||||
|
||||
static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface)
|
||||
{
|
||||
IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface;
|
||||
IDirect3DPixelShader9Impl *shader = impl_from_IDirect3DPixelShader9(iface);
|
||||
ULONG refcount = InterlockedIncrement(&shader->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
@@ -188,7 +211,7 @@ static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface)
|
||||
|
||||
static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface)
|
||||
{
|
||||
IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface;
|
||||
IDirect3DPixelShader9Impl *shader = impl_from_IDirect3DPixelShader9(iface);
|
||||
ULONG refcount = InterlockedDecrement(&shader->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
@@ -208,11 +231,14 @@ static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device)
|
||||
static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface,
|
||||
IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DPixelShader9Impl *shader = impl_from_IDirect3DPixelShader9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)((IDirect3DPixelShader9Impl *)iface)->parentDevice;
|
||||
*device = (IDirect3DDevice9 *)shader->parentDevice;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
@@ -220,14 +246,16 @@ static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, I
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data, UINT *data_size)
|
||||
static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data,
|
||||
UINT *data_size)
|
||||
{
|
||||
IDirect3DPixelShader9Impl *shader = impl_from_IDirect3DPixelShader9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_get_byte_code(((IDirect3DPixelShader9Impl *)iface)->wined3d_shader, data, data_size);
|
||||
hr = wined3d_shader_get_byte_code(shader->wined3d_shader, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -259,11 +287,11 @@ HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl
|
||||
HRESULT hr;
|
||||
|
||||
shader->ref = 1;
|
||||
shader->lpVtbl = &d3d9_pixelshader_vtbl;
|
||||
shader->IDirect3DPixelShader9_iface.lpVtbl = &d3d9_pixelshader_vtbl;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_shader_create_ps(device->wined3d_device, byte_code, NULL, shader,
|
||||
&d3d9_pixelshader_wined3d_parent_ops, &shader->wined3d_shader);
|
||||
&d3d9_pixelshader_wined3d_parent_ops, &shader->wined3d_shader, 3);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -276,3 +304,12 @@ HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DPixelShader9Impl *unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d9_pixelshader_vtbl);
|
||||
|
||||
return impl_from_IDirect3DPixelShader9(iface);
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Im
|
||||
{
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_stateblock_create(device->wined3d_device,
|
||||
(WINED3DSTATEBLOCKTYPE)type, &stateblock->wined3d_stateblock);
|
||||
(enum wined3d_stateblock_type)type, &stateblock->wined3d_stateblock);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
|
||||
@@ -20,13 +20,21 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "d3d9_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
|
||||
|
||||
static inline IDirect3DSurface9Impl *impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DSurface9Impl, IDirect3DSurface9_iface);
|
||||
}
|
||||
|
||||
/* IDirect3DSurface9 IUnknown parts follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_QueryInterface(LPDIRECT3DSURFACE9 iface, REFIID riid, LPVOID* ppobj) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_QueryInterface(IDirect3DSurface9 *iface, REFIID riid,
|
||||
void **ppobj)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
|
||||
|
||||
@@ -43,8 +51,9 @@ static HRESULT WINAPI IDirect3DSurface9Impl_QueryInterface(LPDIRECT3DSURFACE9 if
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DSurface9Impl_AddRef(LPDIRECT3DSURFACE9 iface) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static ULONG WINAPI IDirect3DSurface9Impl_AddRef(IDirect3DSurface9 *iface)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
@@ -71,8 +80,9 @@ static ULONG WINAPI IDirect3DSurface9Impl_AddRef(LPDIRECT3DSURFACE9 iface) {
|
||||
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DSurface9Impl_Release(LPDIRECT3DSURFACE9 iface) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static ULONG WINAPI IDirect3DSurface9Impl_Release(IDirect3DSurface9 *iface)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
@@ -102,9 +112,10 @@ static ULONG WINAPI IDirect3DSurface9Impl_Release(LPDIRECT3DSURFACE9 iface) {
|
||||
}
|
||||
|
||||
/* IDirect3DSurface9 IDirect3DResource9 Interface follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(IDirect3DSurface9 *iface, IDirect3DDevice9 **device)
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(IDirect3DSurface9 *iface,
|
||||
IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
@@ -133,49 +144,61 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(IDirect3DSurface9 *iface,
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_SetPrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_SetPrivateData(IDirect3DSurface9 *iface, REFGUID guid,
|
||||
const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
IDirect3DSurface9Impl *surface = impl_from_IDirect3DSurface9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
iface, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_set_private_data(This->wined3d_surface, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetPrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetPrivateData(IDirect3DSurface9 *iface, REFGUID guid,
|
||||
void *data, DWORD *data_size)
|
||||
{
|
||||
IDirect3DSurface9Impl *surface = impl_from_IDirect3DSurface9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
iface, debugstr_guid(guid), data, data_size);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_get_private_data(This->wined3d_surface, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_FreePrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_FreePrivateData(IDirect3DSurface9 *iface, REFGUID guid)
|
||||
{
|
||||
IDirect3DSurface9Impl *surface = impl_from_IDirect3DSurface9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_free_private_data(This->wined3d_surface, refguid);
|
||||
resource = wined3d_surface_get_resource(surface->wined3d_surface);
|
||||
hr = wined3d_resource_free_private_data(resource, guid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static DWORD WINAPI IDirect3DSurface9Impl_SetPriority(LPDIRECT3DSURFACE9 iface, DWORD PriorityNew) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static DWORD WINAPI IDirect3DSurface9Impl_SetPriority(IDirect3DSurface9 *iface, DWORD PriorityNew)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, priority %u.\n", iface, PriorityNew);
|
||||
@@ -187,8 +210,9 @@ static DWORD WINAPI IDirect3DSurface9Impl_SetPriority(LPDIRECT3DSURFACE9 iface,
|
||||
return hr;
|
||||
}
|
||||
|
||||
static DWORD WINAPI IDirect3DSurface9Impl_GetPriority(LPDIRECT3DSURFACE9 iface) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static DWORD WINAPI IDirect3DSurface9Impl_GetPriority(IDirect3DSurface9 *iface)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
@@ -200,8 +224,9 @@ static DWORD WINAPI IDirect3DSurface9Impl_GetPriority(LPDIRECT3DSURFACE9 iface)
|
||||
return hr;
|
||||
}
|
||||
|
||||
static void WINAPI IDirect3DSurface9Impl_PreLoad(LPDIRECT3DSURFACE9 iface) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static void WINAPI IDirect3DSurface9Impl_PreLoad(IDirect3DSurface9 *iface)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
@@ -218,8 +243,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DSurface9Impl_GetType(IDirect3DSurface9 *i
|
||||
}
|
||||
|
||||
/* IDirect3DSurface9 Interface follow: */
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(LPDIRECT3DSURFACE9 iface, REFIID riid, void** ppContainer) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(IDirect3DSurface9 *iface, REFIID riid,
|
||||
void **ppContainer)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT res;
|
||||
|
||||
TRACE("iface %p, riid %s, container %p.\n", iface, debugstr_guid(riid), ppContainer);
|
||||
@@ -235,7 +262,7 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(LPDIRECT3DSURFACE9 ifac
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(IDirect3DSurface9 *iface, D3DSURFACE_DESC *desc)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -248,7 +275,7 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(IDirect3DSurface9 *iface, D3
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
desc->MultiSampleQuality = wined3d_desc.multisample_quality;
|
||||
@@ -258,21 +285,24 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(IDirect3DSurface9 *iface, D3
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_LockRect(LPDIRECT3DSURFACE9 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_LockRect(IDirect3DSurface9 *iface,
|
||||
D3DLOCKED_RECT *pLockedRect, const RECT *pRect, DWORD Flags)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, locked_rect %p, rect %p, flags %#x.\n", iface, pLockedRect, pRect, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_map(This->wined3d_surface, (WINED3DLOCKED_RECT *)pLockedRect, pRect, Flags);
|
||||
hr = wined3d_surface_map(This->wined3d_surface, (struct wined3d_mapped_rect *)pLockedRect, pRect, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_UnlockRect(LPDIRECT3DSURFACE9 iface) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_UnlockRect(IDirect3DSurface9 *iface)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
@@ -288,8 +318,9 @@ static HRESULT WINAPI IDirect3DSurface9Impl_UnlockRect(LPDIRECT3DSURFACE9 iface)
|
||||
}
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(LPDIRECT3DSURFACE9 iface, HDC* phdc) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(IDirect3DSurface9 *iface, HDC* phdc)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, hdc %p.\n", iface, phdc);
|
||||
@@ -308,8 +339,9 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(LPDIRECT3DSURFACE9 iface, HDC*
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(LPDIRECT3DSURFACE9 iface, HDC hdc) {
|
||||
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
|
||||
static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(IDirect3DSurface9 *iface, HDC hdc)
|
||||
{
|
||||
IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, hdc %p.\n", iface, hdc);
|
||||
@@ -363,9 +395,10 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
|
||||
UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
|
||||
DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality)
|
||||
{
|
||||
DWORD flags = 0;
|
||||
HRESULT hr;
|
||||
|
||||
surface->lpVtbl = &Direct3DSurface9_Vtbl;
|
||||
surface->IDirect3DSurface9_iface.lpVtbl = &Direct3DSurface9_Vtbl;
|
||||
surface->ref = 1;
|
||||
|
||||
switch (format)
|
||||
@@ -391,10 +424,15 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
|
||||
multisample_quality = 0;
|
||||
}
|
||||
|
||||
if (lockable)
|
||||
flags |= WINED3D_SURFACE_MAPPABLE;
|
||||
if (discard)
|
||||
flags |= WINED3D_SURFACE_DISCARD;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_surface_create(device->wined3d_device, width, height, wined3dformat_from_d3dformat(format),
|
||||
lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type,
|
||||
multisample_quality, SURFACE_OPENGL, surface, &d3d9_surface_wined3d_parent_ops, &surface->wined3d_surface);
|
||||
level, usage & WINED3DUSAGE_MASK, (enum wined3d_pool)pool, multisample_type, multisample_quality,
|
||||
SURFACE_OPENGL, flags, surface, &d3d9_surface_wined3d_parent_ops, &surface->wined3d_surface);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -407,3 +445,12 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DSurface9Impl *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &Direct3DSurface9_Vtbl);
|
||||
|
||||
return impl_from_IDirect3DSurface9(iface);
|
||||
}
|
||||
|
||||
@@ -98,15 +98,17 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface) {
|
||||
static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(IDirect3DSwapChain9 *iface,
|
||||
IDirect3DSurface9 *pDestSurface)
|
||||
{
|
||||
IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
|
||||
IDirect3DSurface9Impl *dst = unsafe_impl_from_IDirect3DSurface9(pDestSurface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, surface %p.\n", iface, pDestSurface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_front_buffer_data(This->wined3d_swapchain,
|
||||
((IDirect3DSurface9Impl *)pDestSurface)->wined3d_surface);
|
||||
hr = wined3d_swapchain_get_front_buffer_data(This->wined3d_swapchain, dst->wined3d_surface);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -124,7 +126,7 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(IDirect3DSwapChain9
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain,
|
||||
iBackBuffer, (WINED3DBACKBUFFER_TYPE)Type, &wined3d_surface);
|
||||
iBackBuffer, (enum wined3d_backbuffer_type)Type, &wined3d_surface);
|
||||
if (SUCCEEDED(hr) && wined3d_surface)
|
||||
{
|
||||
*ppBackBuffer = wined3d_surface_get_parent(wined3d_surface);
|
||||
@@ -144,7 +146,7 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAI
|
||||
TRACE("iface %p, raster_status %p.\n", iface, pRasterStatus);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_raster_status(This->wined3d_swapchain, (WINED3DRASTER_STATUS *)pRasterStatus);
|
||||
hr = wined3d_swapchain_get_raster_status(This->wined3d_swapchain, (struct wined3d_raster_status *)pRasterStatus);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -157,7 +159,7 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN
|
||||
TRACE("iface %p, mode %p.\n", iface, pMode);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_display_mode(This->wined3d_swapchain, (WINED3DDISPLAYMODE *)pMode);
|
||||
hr = wined3d_swapchain_get_display_mode(This->wined3d_swapchain, (struct wined3d_display_mode *)pMode);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
|
||||
@@ -179,31 +181,33 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(IDirect3DSwapChain9 *ifa
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(LPDIRECT3DSWAPCHAIN9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
|
||||
static HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(IDirect3DSwapChain9 *iface,
|
||||
D3DPRESENT_PARAMETERS *pPresentationParameters)
|
||||
{
|
||||
IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
|
||||
WINED3DPRESENT_PARAMETERS winePresentParameters;
|
||||
struct wined3d_swapchain_desc desc;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, parameters %p.\n", iface, pPresentationParameters);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_get_present_parameters(This->wined3d_swapchain, &winePresentParameters);
|
||||
hr = wined3d_swapchain_get_desc(This->wined3d_swapchain, &desc);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
pPresentationParameters->BackBufferWidth = winePresentParameters.BackBufferWidth;
|
||||
pPresentationParameters->BackBufferHeight = winePresentParameters.BackBufferHeight;
|
||||
pPresentationParameters->BackBufferFormat = d3dformat_from_wined3dformat(winePresentParameters.BackBufferFormat);
|
||||
pPresentationParameters->BackBufferCount = winePresentParameters.BackBufferCount;
|
||||
pPresentationParameters->MultiSampleType = winePresentParameters.MultiSampleType;
|
||||
pPresentationParameters->MultiSampleQuality = winePresentParameters.MultiSampleQuality;
|
||||
pPresentationParameters->SwapEffect = winePresentParameters.SwapEffect;
|
||||
pPresentationParameters->hDeviceWindow = winePresentParameters.hDeviceWindow;
|
||||
pPresentationParameters->Windowed = winePresentParameters.Windowed;
|
||||
pPresentationParameters->EnableAutoDepthStencil = winePresentParameters.EnableAutoDepthStencil;
|
||||
pPresentationParameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(winePresentParameters.AutoDepthStencilFormat);
|
||||
pPresentationParameters->Flags = winePresentParameters.Flags;
|
||||
pPresentationParameters->FullScreen_RefreshRateInHz = winePresentParameters.FullScreen_RefreshRateInHz;
|
||||
pPresentationParameters->PresentationInterval = winePresentParameters.PresentationInterval;
|
||||
pPresentationParameters->BackBufferWidth = desc.backbuffer_width;
|
||||
pPresentationParameters->BackBufferHeight = desc.backbuffer_height;
|
||||
pPresentationParameters->BackBufferFormat = d3dformat_from_wined3dformat(desc.backbuffer_format);
|
||||
pPresentationParameters->BackBufferCount = desc.backbuffer_count;
|
||||
pPresentationParameters->MultiSampleType = desc.multisample_type;
|
||||
pPresentationParameters->MultiSampleQuality = desc.multisample_quality;
|
||||
pPresentationParameters->SwapEffect = desc.swap_effect;
|
||||
pPresentationParameters->hDeviceWindow = desc.device_window;
|
||||
pPresentationParameters->Windowed = desc.windowed;
|
||||
pPresentationParameters->EnableAutoDepthStencil = desc.enable_auto_depth_stencil;
|
||||
pPresentationParameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(desc.auto_depth_stencil_format);
|
||||
pPresentationParameters->Flags = desc.flags;
|
||||
pPresentationParameters->FullScreen_RefreshRateInHz = desc.refresh_rate;
|
||||
pPresentationParameters->PresentationInterval = desc.swap_interval;
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -236,48 +240,48 @@ static const struct wined3d_parent_ops d3d9_swapchain_wined3d_parent_ops =
|
||||
HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl *device,
|
||||
D3DPRESENT_PARAMETERS *present_parameters)
|
||||
{
|
||||
WINED3DPRESENT_PARAMETERS wined3d_parameters;
|
||||
struct wined3d_swapchain_desc desc;
|
||||
HRESULT hr;
|
||||
|
||||
swapchain->ref = 1;
|
||||
swapchain->lpVtbl = &Direct3DSwapChain9_Vtbl;
|
||||
|
||||
wined3d_parameters.BackBufferWidth = present_parameters->BackBufferWidth;
|
||||
wined3d_parameters.BackBufferHeight = present_parameters->BackBufferHeight;
|
||||
wined3d_parameters.BackBufferFormat = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
|
||||
wined3d_parameters.BackBufferCount = max(1, present_parameters->BackBufferCount);
|
||||
wined3d_parameters.MultiSampleType = present_parameters->MultiSampleType;
|
||||
wined3d_parameters.MultiSampleQuality = present_parameters->MultiSampleQuality;
|
||||
wined3d_parameters.SwapEffect = present_parameters->SwapEffect;
|
||||
wined3d_parameters.hDeviceWindow = present_parameters->hDeviceWindow;
|
||||
wined3d_parameters.Windowed = present_parameters->Windowed;
|
||||
wined3d_parameters.EnableAutoDepthStencil = present_parameters->EnableAutoDepthStencil;
|
||||
wined3d_parameters.AutoDepthStencilFormat = wined3dformat_from_d3dformat(present_parameters->AutoDepthStencilFormat);
|
||||
wined3d_parameters.Flags = present_parameters->Flags;
|
||||
wined3d_parameters.FullScreen_RefreshRateInHz = present_parameters->FullScreen_RefreshRateInHz;
|
||||
wined3d_parameters.PresentationInterval = present_parameters->PresentationInterval;
|
||||
wined3d_parameters.AutoRestoreDisplayMode = TRUE;
|
||||
desc.backbuffer_width = present_parameters->BackBufferWidth;
|
||||
desc.backbuffer_height = present_parameters->BackBufferHeight;
|
||||
desc.backbuffer_format = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
|
||||
desc.backbuffer_count = max(1, present_parameters->BackBufferCount);
|
||||
desc.multisample_type = present_parameters->MultiSampleType;
|
||||
desc.multisample_quality = present_parameters->MultiSampleQuality;
|
||||
desc.swap_effect = present_parameters->SwapEffect;
|
||||
desc.device_window = present_parameters->hDeviceWindow;
|
||||
desc.windowed = present_parameters->Windowed;
|
||||
desc.enable_auto_depth_stencil = present_parameters->EnableAutoDepthStencil;
|
||||
desc.auto_depth_stencil_format = wined3dformat_from_d3dformat(present_parameters->AutoDepthStencilFormat);
|
||||
desc.flags = present_parameters->Flags;
|
||||
desc.refresh_rate = present_parameters->FullScreen_RefreshRateInHz;
|
||||
desc.swap_interval = present_parameters->PresentationInterval;
|
||||
desc.auto_restore_display_mode = TRUE;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_swapchain_create(device->wined3d_device, &wined3d_parameters,
|
||||
hr = wined3d_swapchain_create(device->wined3d_device, &desc,
|
||||
SURFACE_OPENGL, swapchain, &d3d9_swapchain_wined3d_parent_ops,
|
||||
&swapchain->wined3d_swapchain);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
present_parameters->BackBufferWidth = wined3d_parameters.BackBufferWidth;
|
||||
present_parameters->BackBufferHeight = wined3d_parameters.BackBufferHeight;
|
||||
present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(wined3d_parameters.BackBufferFormat);
|
||||
present_parameters->BackBufferCount = wined3d_parameters.BackBufferCount;
|
||||
present_parameters->MultiSampleType = wined3d_parameters.MultiSampleType;
|
||||
present_parameters->MultiSampleQuality = wined3d_parameters.MultiSampleQuality;
|
||||
present_parameters->SwapEffect = wined3d_parameters.SwapEffect;
|
||||
present_parameters->hDeviceWindow = wined3d_parameters.hDeviceWindow;
|
||||
present_parameters->Windowed = wined3d_parameters.Windowed;
|
||||
present_parameters->EnableAutoDepthStencil = wined3d_parameters.EnableAutoDepthStencil;
|
||||
present_parameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(wined3d_parameters.AutoDepthStencilFormat);
|
||||
present_parameters->Flags = wined3d_parameters.Flags;
|
||||
present_parameters->FullScreen_RefreshRateInHz = wined3d_parameters.FullScreen_RefreshRateInHz;
|
||||
present_parameters->PresentationInterval = wined3d_parameters.PresentationInterval;
|
||||
present_parameters->BackBufferWidth = desc.backbuffer_width;
|
||||
present_parameters->BackBufferHeight = desc.backbuffer_height;
|
||||
present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(desc.backbuffer_format);
|
||||
present_parameters->BackBufferCount = desc.backbuffer_count;
|
||||
present_parameters->MultiSampleType = desc.multisample_type;
|
||||
present_parameters->MultiSampleQuality = desc.multisample_quality;
|
||||
present_parameters->SwapEffect = desc.swap_effect;
|
||||
present_parameters->hDeviceWindow = desc.device_window;
|
||||
present_parameters->Windowed = desc.windowed;
|
||||
present_parameters->EnableAutoDepthStencil = desc.enable_auto_depth_stencil;
|
||||
present_parameters->AutoDepthStencilFormat = d3dformat_from_wined3dformat(desc.auto_depth_stencil_format);
|
||||
present_parameters->Flags = desc.flags;
|
||||
present_parameters->FullScreen_RefreshRateInHz = desc.refresh_rate;
|
||||
present_parameters->PresentationInterval = desc.swap_interval;
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
|
||||
@@ -108,13 +108,15 @@ static HRESULT WINAPI IDirect3DTexture9Impl_SetPrivateData(IDirect3DTexture9 *if
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -124,13 +126,15 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetPrivateData(IDirect3DTexture9 *if
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -140,12 +144,14 @@ static HRESULT WINAPI IDirect3DTexture9Impl_FreePrivateData(IDirect3DTexture9 *i
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -192,16 +198,9 @@ static void WINAPI IDirect3DTexture9Impl_PreLoad(IDirect3DTexture9 *iface)
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DTexture9Impl_GetType(IDirect3DTexture9 *iface)
|
||||
{
|
||||
IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
|
||||
HRESULT ret;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
ret = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return ret;
|
||||
return D3DRTYPE_TEXTURE;
|
||||
}
|
||||
|
||||
/* IDirect3DTexture9 IDirect3DBaseTexture9 Interface follow: */
|
||||
@@ -256,7 +255,7 @@ static HRESULT WINAPI IDirect3DTexture9Impl_SetAutoGenFilterType(IDirect3DTextur
|
||||
TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (WINED3DTEXTUREFILTERTYPE)FilterType);
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -306,7 +305,7 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(IDirect3DTexture9 *ifac
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->MultiSampleType = wined3d_desc.multisample_type;
|
||||
desc->MultiSampleQuality = wined3d_desc.multisample_quality;
|
||||
@@ -393,14 +392,14 @@ static HRESULT WINAPI IDirect3DTexture9Impl_AddDirtyRect(IDirect3DTexture9 *ifac
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
|
||||
else
|
||||
{
|
||||
WINED3DBOX dirty_region;
|
||||
struct wined3d_box dirty_region;
|
||||
|
||||
dirty_region.Left = dirty_rect->left;
|
||||
dirty_region.Top = dirty_rect->top;
|
||||
dirty_region.Right = dirty_rect->right;
|
||||
dirty_region.Bottom = dirty_rect->bottom;
|
||||
dirty_region.Front = 0;
|
||||
dirty_region.Back = 1;
|
||||
dirty_region.left = dirty_rect->left;
|
||||
dirty_region.top = dirty_rect->top;
|
||||
dirty_region.right = dirty_rect->right;
|
||||
dirty_region.bottom = dirty_rect->bottom;
|
||||
dirty_region.front = 0;
|
||||
dirty_region.back = 1;
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
|
||||
}
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
@@ -320,8 +320,8 @@ static const struct wined3d_parent_ops d3d9_vertexdeclaration_wined3d_parent_ops
|
||||
d3d9_vertexdeclaration_wined3d_object_destroyed,
|
||||
};
|
||||
|
||||
static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elements,
|
||||
WINED3DVERTEXELEMENT **wined3d_elements, UINT *element_count)
|
||||
static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elements,
|
||||
struct wined3d_vertex_element **wined3d_elements, UINT *element_count)
|
||||
{
|
||||
const D3DVERTEXELEMENT9* element;
|
||||
UINT count = 1;
|
||||
@@ -337,7 +337,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elem
|
||||
/* Skip the END element */
|
||||
--count;
|
||||
|
||||
*wined3d_elements = HeapAlloc(GetProcessHeap(), 0, count * sizeof(WINED3DVERTEXELEMENT));
|
||||
*wined3d_elements = HeapAlloc(GetProcessHeap(), 0, count * sizeof(**wined3d_elements));
|
||||
if (!*wined3d_elements) {
|
||||
FIXME("Memory allocation failed\n");
|
||||
return D3DERR_OUTOFVIDEOMEMORY;
|
||||
@@ -368,7 +368,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elem
|
||||
HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration,
|
||||
IDirect3DDevice9Impl *device, const D3DVERTEXELEMENT9 *elements)
|
||||
{
|
||||
WINED3DVERTEXELEMENT *wined3d_elements;
|
||||
struct wined3d_vertex_element *wined3d_elements;
|
||||
UINT wined3d_element_count;
|
||||
UINT element_count;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -126,13 +126,15 @@ static HRESULT WINAPI IDirect3DVolume9Impl_SetPrivateData(IDirect3DVolume9 *ifac
|
||||
const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DVolume9Impl *This = impl_from_IDirect3DVolume9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_set_private_data(This->wined3d_volume, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -142,13 +144,15 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetPrivateData(IDirect3DVolume9 *ifac
|
||||
void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DVolume9Impl *This = impl_from_IDirect3DVolume9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_get_private_data(This->wined3d_volume, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -157,12 +161,14 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetPrivateData(IDirect3DVolume9 *ifac
|
||||
static HRESULT WINAPI IDirect3DVolume9Impl_FreePrivateData(IDirect3DVolume9 *iface, REFGUID refguid)
|
||||
{
|
||||
IDirect3DVolume9Impl *This = impl_from_IDirect3DVolume9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_free_private_data(This->wined3d_volume, refguid);
|
||||
resource = wined3d_volume_get_resource(This->wined3d_volume);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -200,7 +206,7 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetDesc(IDirect3DVolume9 *iface, D3DV
|
||||
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Width = wined3d_desc.width;
|
||||
desc->Height = wined3d_desc.height;
|
||||
@@ -219,8 +225,8 @@ static HRESULT WINAPI IDirect3DVolume9Impl_LockBox(IDirect3DVolume9 *iface,
|
||||
iface, pLockedVolume, pBox, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_volume_map(This->wined3d_volume, (WINED3DLOCKED_BOX *)pLockedVolume,
|
||||
(const WINED3DBOX *)pBox, Flags);
|
||||
hr = wined3d_volume_map(This->wined3d_volume, (struct wined3d_mapped_box *)pLockedVolume,
|
||||
(const struct wined3d_box *)pBox, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -268,7 +274,7 @@ static const struct wined3d_parent_ops d3d9_volume_wined3d_parent_ops =
|
||||
};
|
||||
|
||||
HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool)
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format, enum wined3d_pool pool)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
|
||||
@@ -107,13 +107,15 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetPrivateData(IDirect3DVolume
|
||||
REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
|
||||
{
|
||||
IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
|
||||
iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -123,13 +125,15 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetPrivateData(IDirect3DVolume
|
||||
REFGUID refguid, void *pData, DWORD *pSizeOfData)
|
||||
{
|
||||
IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s, data %p, data_size %p.\n",
|
||||
iface, debugstr_guid(refguid), pData, pSizeOfData);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -139,12 +143,14 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_FreePrivateData(IDirect3DVolum
|
||||
REFGUID refguid)
|
||||
{
|
||||
IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface);
|
||||
struct wined3d_resource *resource;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
|
||||
resource = wined3d_texture_get_resource(This->wined3d_texture);
|
||||
hr = wined3d_resource_free_private_data(resource, refguid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -192,16 +198,9 @@ static void WINAPI IDirect3DVolumeTexture9Impl_PreLoad(IDirect3DVolumeTexture9 *
|
||||
|
||||
static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture9Impl_GetType(IDirect3DVolumeTexture9 *iface)
|
||||
{
|
||||
IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface);
|
||||
D3DRESOURCETYPE type;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
type = wined3d_texture_get_type(This->wined3d_texture);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return type;
|
||||
return D3DRTYPE_VOLUMETEXTURE;
|
||||
}
|
||||
|
||||
static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetLOD(IDirect3DVolumeTexture9 *iface, DWORD LODNew)
|
||||
@@ -255,7 +254,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetAutoGenFilterType(IDirect3D
|
||||
TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (WINED3DTEXTUREFILTERTYPE)FilterType);
|
||||
hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
@@ -305,7 +304,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(IDirect3DVolumeTe
|
||||
wined3d_resource_get_desc(sub_resource, &wined3d_desc);
|
||||
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
|
||||
desc->Type = wined3d_desc.resource_type;
|
||||
desc->Usage = wined3d_desc.usage;
|
||||
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
|
||||
desc->Pool = wined3d_desc.pool;
|
||||
desc->Width = wined3d_desc.width;
|
||||
desc->Height = wined3d_desc.height;
|
||||
@@ -387,7 +386,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_AddDirtyBox(IDirect3DVolumeTex
|
||||
TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const WINED3DBOX *)dirty_box);
|
||||
hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
|
||||
@@ -16,19 +16,18 @@ spec2def(ddraw.dll ddraw.spec)
|
||||
list(APPEND SOURCE
|
||||
clipper.c
|
||||
ddraw.c
|
||||
ddraw.rc
|
||||
device.c
|
||||
executebuffer.c
|
||||
light.c
|
||||
main.c
|
||||
material.c
|
||||
palette.c
|
||||
regsvr.c
|
||||
stubs.c
|
||||
surface.c
|
||||
utils.c
|
||||
vertexbuffer.c
|
||||
viewport.c
|
||||
version.rc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ddraw_stubs.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ddraw.def)
|
||||
|
||||
|
||||
@@ -26,114 +26,102 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown methods
|
||||
*****************************************************************************/
|
||||
static inline struct ddraw_clipper *impl_from_IDirectDrawClipper(IDirectDrawClipper *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct ddraw_clipper, IDirectDrawClipper_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::QueryInterface
|
||||
*
|
||||
* Can query the IUnknown and IDirectDrawClipper interface from a
|
||||
* Clipper object. The IUnknown Interface is equal to the IDirectDrawClipper
|
||||
* interface. Can't create other interfaces.
|
||||
*
|
||||
* Arguments:
|
||||
* riid: Interface id asked for
|
||||
* ppvObj: Returns the pointer to the interface
|
||||
*
|
||||
* Return values:
|
||||
* DD_OK on success
|
||||
* E_NOINTERFACE if the requested interface wasn't found.
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface(
|
||||
LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj
|
||||
) {
|
||||
static HRESULT WINAPI ddraw_clipper_QueryInterface(IDirectDrawClipper *iface, REFIID iid, void **object)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppvObj);
|
||||
TRACE("iface %p, iid %s, object %p.\n", iface, debugstr_guid(iid), object);
|
||||
|
||||
if (IsEqualGUID(&IID_IDirectDrawClipper, riid)
|
||||
|| IsEqualGUID(&IID_IUnknown, riid))
|
||||
if (IsEqualGUID(&IID_IDirectDrawClipper, iid)
|
||||
|| IsEqualGUID(&IID_IUnknown, iid))
|
||||
{
|
||||
IUnknown_AddRef(iface);
|
||||
*ppvObj = iface;
|
||||
IDirectDrawClipper_AddRef(&clipper->IDirectDrawClipper_iface);
|
||||
*object = &clipper->IDirectDrawClipper_iface;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
|
||||
*object = NULL;
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::AddRef
|
||||
*
|
||||
* Increases the reference count of the interface, returns the new count
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface )
|
||||
static ULONG WINAPI ddraw_clipper_AddRef(IDirectDrawClipper *iface)
|
||||
{
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
ULONG refcount = InterlockedIncrement(&clipper->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
TRACE("%p increasing refcount to %u.\n", clipper, refcount);
|
||||
|
||||
return ref;
|
||||
return refcount;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::Release
|
||||
*
|
||||
* Decreases the reference count of the interface, returns the new count
|
||||
* If the refcount is decreased to 0, the interface is destroyed.
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) {
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
static ULONG WINAPI ddraw_clipper_Release(IDirectDrawClipper *iface)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
ULONG refcount = InterlockedDecrement(&clipper->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
TRACE("%p decreasing refcount to %u.\n", clipper, refcount);
|
||||
|
||||
if (ref == 0)
|
||||
if (!refcount)
|
||||
{
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_clipper_decref(This->wineD3DClipper);
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
return 0;
|
||||
if (clipper->region)
|
||||
DeleteObject(clipper->region);
|
||||
HeapFree(GetProcessHeap(), 0, clipper);
|
||||
}
|
||||
else return ref;
|
||||
|
||||
return refcount;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::SetHwnd
|
||||
*
|
||||
* Assigns a hWnd to the clipper interface.
|
||||
*
|
||||
* Arguments:
|
||||
* Flags: Unsupported so far
|
||||
* hWnd: The hWnd to set
|
||||
*
|
||||
* Return values:
|
||||
* DD_OK on success
|
||||
* DDERR_INVALIDPARAMS if Flags was != 0
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI ddraw_clipper_SetHWnd(IDirectDrawClipper *iface, DWORD flags, HWND window)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
|
||||
LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd
|
||||
) {
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
HRESULT hr;
|
||||
TRACE("iface %p, flags %#x, window %p.\n", iface, flags, window);
|
||||
|
||||
TRACE("iface %p, flags %#x, window %p.\n", iface, dwFlags, hWnd);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
hr = wined3d_clipper_set_window(This->wineD3DClipper, dwFlags, hWnd);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
switch(hr)
|
||||
if (flags)
|
||||
{
|
||||
case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS;
|
||||
default: return hr;
|
||||
FIXME("flags %#x, not supported.\n", flags);
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
wined3d_mutex_lock();
|
||||
clipper->window = window;
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
static HRGN get_window_region(HWND window)
|
||||
{
|
||||
POINT origin = {0, 0};
|
||||
RECT client_rect;
|
||||
|
||||
if (!GetClientRect(window, &client_rect))
|
||||
{
|
||||
/* This can happen if the window is destroyed, for example. */
|
||||
WARN("Failed to get client rect.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!ClientToScreen(window, &origin))
|
||||
{
|
||||
ERR("Failed to translate origin.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!OffsetRect(&client_rect, origin.x, origin.y))
|
||||
{
|
||||
ERR("Failed to translate client rect.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return CreateRectRgnIndirect(&client_rect);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -142,169 +130,197 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
|
||||
* Retrieve a copy of the clip list
|
||||
*
|
||||
* Arguments:
|
||||
* Rect: Rectangle to be used to clip the clip list or NULL for the
|
||||
* entire clip list
|
||||
* ClipList: structure for the resulting copy of the clip list.
|
||||
* If NULL, fills Size up to the number of bytes necessary to hold
|
||||
* the entire clip.
|
||||
* Size: Size of resulting clip list; size of the buffer at ClipList
|
||||
* or, if ClipList is NULL, receives the required size of the buffer
|
||||
* in bytes
|
||||
* rect: Rectangle to be used to clip the clip list or NULL for the
|
||||
* entire clip list.
|
||||
* clip_list: structure for the resulting copy of the clip list.
|
||||
* If NULL, fills Size up to the number of bytes necessary to hold
|
||||
* the entire clip.
|
||||
* clip_list_size: Size of resulting clip list; size of the buffer at clip_list
|
||||
* or, if clip_list is NULL, receives the required size of the buffer
|
||||
* in bytes.
|
||||
*
|
||||
* RETURNS
|
||||
* Either DD_OK or DDERR_*
|
||||
************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
|
||||
LPDIRECTDRAWCLIPPER iface, LPRECT lpRect, LPRGNDATA lpClipList,
|
||||
LPDWORD lpdwSize)
|
||||
static HRESULT WINAPI ddraw_clipper_GetClipList(IDirectDrawClipper *iface, RECT *rect,
|
||||
RGNDATA *clip_list, DWORD *clip_list_size)
|
||||
{
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
HRESULT hr;
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
HRGN region;
|
||||
|
||||
TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n",
|
||||
iface, wine_dbgstr_rect(lpRect), lpClipList, lpdwSize);
|
||||
iface, wine_dbgstr_rect(rect), clip_list, clip_list_size);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
hr = wined3d_clipper_get_clip_list(This->wineD3DClipper, lpRect, lpClipList, lpdwSize);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
return hr;
|
||||
wined3d_mutex_lock();
|
||||
|
||||
if (clipper->window)
|
||||
{
|
||||
if (!(region = get_window_region(clipper->window)))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
WARN("Failed to get window region.\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(region = clipper->region))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
WARN("No clip list set.\n");
|
||||
return DDERR_NOCLIPLIST;
|
||||
}
|
||||
}
|
||||
|
||||
if (rect)
|
||||
{
|
||||
HRGN clip_region;
|
||||
|
||||
if (!(clip_region = CreateRectRgnIndirect(rect)))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
ERR("Failed to create region.\n");
|
||||
if (clipper->window)
|
||||
DeleteObject(region);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (CombineRgn(clip_region, region, clip_region, RGN_AND) == ERROR)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
ERR("Failed to combine regions.\n");
|
||||
DeleteObject(clip_region);
|
||||
if (clipper->window)
|
||||
DeleteObject(region);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (clipper->window)
|
||||
DeleteObject(region);
|
||||
region = clip_region;
|
||||
}
|
||||
|
||||
*clip_list_size = GetRegionData(region, *clip_list_size, clip_list);
|
||||
if (rect || clipper->window)
|
||||
DeleteObject(region);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::SetClipList
|
||||
*
|
||||
* Sets or deletes (if lprgn is NULL) the clip list
|
||||
* Sets or deletes (if region is NULL) the clip list
|
||||
*
|
||||
* This implementation is a stub and returns DD_OK always to make the app
|
||||
* happy.
|
||||
*
|
||||
* PARAMS
|
||||
* lprgn Pointer to a LRGNDATA structure or NULL
|
||||
* dwFlags not used, must be 0
|
||||
* region Pointer to a LRGNDATA structure or NULL
|
||||
* flags not used, must be 0
|
||||
* RETURNS
|
||||
* Either DD_OK or DDERR_*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
|
||||
LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD dwFlag
|
||||
) {
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
HRESULT hr;
|
||||
static HRESULT WINAPI ddraw_clipper_SetClipList(IDirectDrawClipper *iface, RGNDATA *region, DWORD flags)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
|
||||
TRACE("iface %p, clip_list %p, flags %#x.\n", iface, lprgn, dwFlag);
|
||||
TRACE("iface %p, region %p, flags %#x.\n", iface, region, flags);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
hr = wined3d_clipper_set_clip_list(This->wineD3DClipper, lprgn, dwFlag);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
return hr;
|
||||
}
|
||||
wined3d_mutex_lock();
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::GetHwnd
|
||||
*
|
||||
* Returns the hwnd assigned with SetHwnd
|
||||
*
|
||||
* Arguments:
|
||||
* hWndPtr: Address to store the HWND at
|
||||
*
|
||||
* Return values:
|
||||
* Always returns DD_OK;
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
|
||||
LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr
|
||||
) {
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, window %p.\n", iface, hWndPtr);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
hr = wined3d_clipper_get_window(This->wineD3DClipper, hWndPtr);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::Initialize
|
||||
*
|
||||
* Initializes the interface. Well, there isn't much to do for this
|
||||
* implementation, but it stores the DirectDraw Interface.
|
||||
*
|
||||
* Arguments:
|
||||
* DD: Pointer to a IDirectDraw interface
|
||||
* Flags: Unsupported by now
|
||||
*
|
||||
* Return values:
|
||||
* DD_OK on success
|
||||
* DDERR_ALREADYINITIALIZED if this interface isn't initialized already
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_Initialize(
|
||||
LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags
|
||||
) {
|
||||
IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
|
||||
|
||||
TRACE("iface %p, ddraw %p, flags %#x.\n", iface, lpDD, dwFlags);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
if (This->initialized)
|
||||
if (clipper->window)
|
||||
{
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_CLIPPERISUSINGHWND;
|
||||
}
|
||||
|
||||
if (clipper->region)
|
||||
DeleteObject(clipper->region);
|
||||
if (!region)
|
||||
clipper->region = NULL;
|
||||
else if (!(clipper->region = ExtCreateRegion(NULL, 0, region)))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
ERR("Failed to create region.\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ddraw_clipper_GetHWnd(IDirectDrawClipper *iface, HWND *window)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
|
||||
TRACE("iface %p, window %p.\n", iface, window);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
*window = clipper->window;
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ddraw_clipper_Initialize(IDirectDrawClipper *iface,
|
||||
IDirectDraw *ddraw, DWORD flags)
|
||||
{
|
||||
struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
|
||||
|
||||
TRACE("iface %p, ddraw %p, flags %#x.\n", iface, ddraw, flags);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
if (clipper->initialized)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_ALREADYINITIALIZED;
|
||||
}
|
||||
|
||||
This->initialized = TRUE;
|
||||
clipper->initialized = TRUE;
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper::IsClipListChanged
|
||||
*
|
||||
* This function is a stub
|
||||
*
|
||||
* Arguments:
|
||||
* Changed:
|
||||
*
|
||||
* Return values:
|
||||
* DD_OK, because it's a stub
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged(
|
||||
LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged
|
||||
) {
|
||||
FIXME("iface %p, changed %p stub!\n", iface, lpbChanged);
|
||||
static HRESULT WINAPI ddraw_clipper_IsClipListChanged(IDirectDrawClipper *iface, BOOL *changed)
|
||||
{
|
||||
FIXME("iface %p, changed %p stub!\n", iface, changed);
|
||||
|
||||
/* XXX What is safest? */
|
||||
*lpbChanged = FALSE;
|
||||
*changed = FALSE;
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* The VTable
|
||||
*****************************************************************************/
|
||||
static const struct IDirectDrawClipperVtbl ddraw_clipper_vtbl =
|
||||
{
|
||||
IDirectDrawClipperImpl_QueryInterface,
|
||||
IDirectDrawClipperImpl_AddRef,
|
||||
IDirectDrawClipperImpl_Release,
|
||||
IDirectDrawClipperImpl_GetClipList,
|
||||
IDirectDrawClipperImpl_GetHWnd,
|
||||
IDirectDrawClipperImpl_Initialize,
|
||||
IDirectDrawClipperImpl_IsClipListChanged,
|
||||
IDirectDrawClipperImpl_SetClipList,
|
||||
IDirectDrawClipperImpl_SetHwnd
|
||||
ddraw_clipper_QueryInterface,
|
||||
ddraw_clipper_AddRef,
|
||||
ddraw_clipper_Release,
|
||||
ddraw_clipper_GetClipList,
|
||||
ddraw_clipper_GetHWnd,
|
||||
ddraw_clipper_Initialize,
|
||||
ddraw_clipper_IsClipListChanged,
|
||||
ddraw_clipper_SetClipList,
|
||||
ddraw_clipper_SetHWnd,
|
||||
};
|
||||
|
||||
HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper)
|
||||
HRESULT ddraw_clipper_init(struct ddraw_clipper *clipper)
|
||||
{
|
||||
clipper->lpVtbl = &ddraw_clipper_vtbl;
|
||||
clipper->IDirectDrawClipper_iface.lpVtbl = &ddraw_clipper_vtbl;
|
||||
clipper->ref = 1;
|
||||
clipper->wineD3DClipper = wined3d_clipper_create();
|
||||
if (!clipper->wineD3DClipper)
|
||||
{
|
||||
WARN("Failed to create wined3d clipper.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
struct ddraw_clipper *unsafe_impl_from_IDirectDrawClipper(IDirectDrawClipper *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &ddraw_clipper_vtbl);
|
||||
|
||||
return impl_from_IDirectDrawClipper(iface);
|
||||
}
|
||||
|
||||
+1035
-1348
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
#include "version.rc"
|
||||
|
||||
1 WINE_REGISTRY ddraw.rgs
|
||||
@@ -0,0 +1,21 @@
|
||||
HKCR
|
||||
{
|
||||
NoRemove Interface
|
||||
{
|
||||
}
|
||||
NoRemove CLSID
|
||||
{
|
||||
'{D7B70EE0-4340-11CF-B063-0020AFC2CD35}' = s 'DirectDraw Object'
|
||||
{
|
||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
|
||||
}
|
||||
'{3C305196-50DB-11D3-9CFE-00C04FD930C5}' = s 'DirectDraw 7 Object'
|
||||
{
|
||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
|
||||
}
|
||||
'{593817A0-7DB3-11CF-A2DE-00AA00B93356}' = s 'DirectDraw Clipper Object'
|
||||
{
|
||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,6 @@ extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HI
|
||||
/* Typdef the interfaces */
|
||||
typedef struct IDirectDrawImpl IDirectDrawImpl;
|
||||
typedef struct IDirectDrawSurfaceImpl IDirectDrawSurfaceImpl;
|
||||
typedef struct IDirectDrawClipperImpl IDirectDrawClipperImpl;
|
||||
typedef struct IDirectDrawPaletteImpl IDirectDrawPaletteImpl;
|
||||
typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
|
||||
typedef struct IDirect3DLightImpl IDirect3DLightImpl;
|
||||
@@ -53,9 +52,6 @@ typedef struct IDirect3DMaterialImpl IDirect3DMaterialImpl;
|
||||
typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
|
||||
typedef struct IDirect3DVertexBufferImpl IDirect3DVertexBufferImpl;
|
||||
|
||||
/* Global critical section */
|
||||
extern CRITICAL_SECTION ddraw_cs DECLSPEC_HIDDEN;
|
||||
|
||||
extern DWORD force_refresh_rate DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -72,7 +68,6 @@ struct IDirectDrawImpl
|
||||
/* Interfaces */
|
||||
IDirectDraw7 IDirectDraw7_iface;
|
||||
IDirectDraw4 IDirectDraw4_iface;
|
||||
IDirectDraw3 IDirectDraw3_iface;
|
||||
IDirectDraw2 IDirectDraw2_iface;
|
||||
IDirectDraw IDirectDraw_iface;
|
||||
IDirect3D7 IDirect3D7_iface;
|
||||
@@ -83,17 +78,17 @@ struct IDirectDrawImpl
|
||||
|
||||
/* See comment in IDirectDraw::AddRef */
|
||||
LONG ref7, ref4, ref2, ref3, ref1, numIfaces;
|
||||
BOOL initialized;
|
||||
|
||||
/* WineD3D linkage */
|
||||
struct wined3d *wineD3D;
|
||||
struct wined3d *wined3d;
|
||||
struct wined3d_device *wined3d_device;
|
||||
BOOL d3d_initialized;
|
||||
|
||||
/* Misc ddraw fields */
|
||||
UINT total_vidmem;
|
||||
DWORD cur_scanline;
|
||||
BOOL fake_vblank;
|
||||
BOOL initialized;
|
||||
IDirectDrawSurfaceImpl *primary;
|
||||
RECT primary_lock;
|
||||
struct wined3d_surface *wined3d_frontbuffer;
|
||||
struct wined3d_swapchain *wined3d_swapchain;
|
||||
HWND swapchain_window;
|
||||
|
||||
/* DirectDraw things, which are not handled by WineD3D */
|
||||
DWORD cooperative_level;
|
||||
@@ -102,7 +97,6 @@ struct IDirectDrawImpl
|
||||
DWORD orig_bpp;
|
||||
|
||||
/* D3D things */
|
||||
IDirectDrawSurfaceImpl *d3d_target;
|
||||
HWND d3d_window;
|
||||
IDirect3DDeviceImpl *d3ddevice;
|
||||
int d3dversion;
|
||||
@@ -112,12 +106,8 @@ struct IDirectDrawImpl
|
||||
HWND devicewindow;
|
||||
HWND dest_window;
|
||||
|
||||
/* The surface type to request */
|
||||
WINED3DSURFTYPE ImplType;
|
||||
|
||||
/* Helpers for surface creation */
|
||||
IDirectDrawSurfaceImpl *tex_root;
|
||||
BOOL depthstencil;
|
||||
|
||||
/* For the dll unload cleanup code */
|
||||
struct list ddraw_list_entry;
|
||||
@@ -125,37 +115,27 @@ struct IDirectDrawImpl
|
||||
* because of IParent
|
||||
*/
|
||||
struct list surface_list;
|
||||
LONG surfaces;
|
||||
|
||||
/* FVF management */
|
||||
struct FvfToDecl *decls;
|
||||
UINT numConvertedDecls, declArraySize;
|
||||
};
|
||||
|
||||
#define DDRAW_WINDOW_CLASS_NAME "ddraw_wc"
|
||||
#define DDRAW_WINDOW_CLASS_NAME "DirectDrawDeviceWnd"
|
||||
|
||||
HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
|
||||
HRESULT ddraw_init(IDirectDrawImpl *ddraw, enum wined3d_device_type device_type) DECLSPEC_HIDDEN;
|
||||
void ddraw_destroy_swapchain(IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
|
||||
|
||||
/* Helper structures */
|
||||
typedef struct EnumDisplayModesCBS
|
||||
static inline void ddraw_set_swapchain_window(struct IDirectDrawImpl *ddraw, HWND window)
|
||||
{
|
||||
void *context;
|
||||
LPDDENUMMODESCALLBACK2 callback;
|
||||
} EnumDisplayModesCBS;
|
||||
|
||||
typedef struct EnumSurfacesCBS
|
||||
{
|
||||
void *context;
|
||||
LPDDENUMSURFACESCALLBACK7 callback;
|
||||
LPDDSURFACEDESC2 pDDSD;
|
||||
DWORD Flags;
|
||||
} EnumSurfacesCBS;
|
||||
if (window == GetDesktopWindow())
|
||||
window = NULL;
|
||||
ddraw->swapchain_window = window;
|
||||
}
|
||||
|
||||
/* Utility functions */
|
||||
void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS *pIn, DDSCAPS2 *pOut) DECLSPEC_HIDDEN;
|
||||
void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2 *pIn, DDDEVICEIDENTIFIER *pOut) DECLSPEC_HIDDEN;
|
||||
HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf,
|
||||
DDSURFACEDESC2 *desc, void *Context) DECLSPEC_HIDDEN;
|
||||
struct wined3d_vertex_declaration *ddraw_find_decl(IDirectDrawImpl *This, DWORD fvf) DECLSPEC_HIDDEN;
|
||||
|
||||
/* The default surface type */
|
||||
@@ -168,13 +148,16 @@ extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN;
|
||||
struct IDirectDrawSurfaceImpl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirectDrawSurface7Vtbl *lpVtbl;
|
||||
const IDirectDrawSurface3Vtbl *IDirectDrawSurface3_vtbl;
|
||||
const IDirectDrawGammaControlVtbl *IDirectDrawGammaControl_vtbl;
|
||||
const IDirect3DTexture2Vtbl *IDirect3DTexture2_vtbl;
|
||||
const IDirect3DTextureVtbl *IDirect3DTexture_vtbl;
|
||||
IDirectDrawSurface7 IDirectDrawSurface7_iface;
|
||||
IDirectDrawSurface4 IDirectDrawSurface4_iface;
|
||||
IDirectDrawSurface3 IDirectDrawSurface3_iface;
|
||||
IDirectDrawSurface2 IDirectDrawSurface2_iface;
|
||||
IDirectDrawSurface IDirectDrawSurface_iface;
|
||||
IDirectDrawGammaControl IDirectDrawGammaControl_iface;
|
||||
IDirect3DTexture2 IDirect3DTexture2_iface;
|
||||
IDirect3DTexture IDirect3DTexture_iface;
|
||||
|
||||
LONG ref;
|
||||
LONG ref7, ref4, ref3, ref2, ref1, iface_count, gamma_count;
|
||||
IUnknown *ifaceToRelease;
|
||||
|
||||
int version;
|
||||
@@ -183,11 +166,11 @@ struct IDirectDrawSurfaceImpl
|
||||
IDirectDrawImpl *ddraw;
|
||||
struct wined3d_surface *wined3d_surface;
|
||||
struct wined3d_texture *wined3d_texture;
|
||||
struct wined3d_swapchain *wined3d_swapchain;
|
||||
|
||||
/* This implementation handles attaching surfaces to other surfaces */
|
||||
IDirectDrawSurfaceImpl *next_attached;
|
||||
IDirectDrawSurfaceImpl *first_attached;
|
||||
IUnknown *attached_iface;
|
||||
|
||||
/* Complex surfaces are organized in a tree, although the tree is degenerated to a list in most cases.
|
||||
* In mipmap and primary surfaces each level has only one attachment, which is the next surface level.
|
||||
@@ -207,13 +190,9 @@ struct IDirectDrawSurfaceImpl
|
||||
/* Misc things */
|
||||
DWORD uniqueness_value;
|
||||
UINT mipmap_level;
|
||||
WINED3DSURFTYPE ImplType;
|
||||
|
||||
/* For D3DDevice creation */
|
||||
BOOL isRenderTarget;
|
||||
|
||||
/* Clipper objects */
|
||||
IDirectDrawClipperImpl *clipper;
|
||||
struct ddraw_clipper *clipper;
|
||||
|
||||
/* For the ddraw surface list */
|
||||
struct list surface_list_entry;
|
||||
@@ -222,28 +201,51 @@ struct IDirectDrawSurfaceImpl
|
||||
};
|
||||
|
||||
HRESULT ddraw_surface_create_texture(IDirectDrawSurfaceImpl *surface) DECLSPEC_HIDDEN;
|
||||
void ddraw_surface_destroy(IDirectDrawSurfaceImpl *surface) DECLSPEC_HIDDEN;
|
||||
HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw,
|
||||
DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) DECLSPEC_HIDDEN;
|
||||
DDSURFACEDESC2 *desc, UINT mip_level, UINT version) DECLSPEC_HIDDEN;
|
||||
ULONG ddraw_surface_release_iface(IDirectDrawSurfaceImpl *This) DECLSPEC_HIDDEN;
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface)
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirect3DTexture(IDirect3DTexture *iface)
|
||||
{
|
||||
return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirect3DTexture_iface);
|
||||
}
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *surface_from_texture2(IDirect3DTexture2 *iface)
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface)
|
||||
{
|
||||
return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture2_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirect3DTexture2_iface);
|
||||
}
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *surface_from_surface3(IDirectDrawSurface3 *iface)
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
|
||||
{
|
||||
return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface_iface);
|
||||
}
|
||||
|
||||
/* Get the number of bytes per pixel for a given surface */
|
||||
#define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.dwRGBBitCount+7)/8))
|
||||
#define GET_BPP(desc) PFGET_BPP(desc.ddpfPixelFormat)
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface2_iface);
|
||||
}
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_iface);
|
||||
}
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface4_iface);
|
||||
}
|
||||
|
||||
static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface7_iface);
|
||||
}
|
||||
|
||||
IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface(IDirectDrawSurface *iface) DECLSPEC_HIDDEN;
|
||||
IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface) DECLSPEC_HIDDEN;
|
||||
IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
IDirectDrawSurfaceImpl *unsafe_impl_from_IDirect3DTexture(IDirect3DTexture *iface) DECLSPEC_HIDDEN;
|
||||
IDirectDrawSurfaceImpl *unsafe_impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
#define DDRAW_INVALID_HANDLE ~0U
|
||||
|
||||
@@ -279,10 +281,10 @@ void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_ha
|
||||
struct IDirect3DDeviceImpl
|
||||
{
|
||||
/* IUnknown */
|
||||
const IDirect3DDevice7Vtbl *lpVtbl;
|
||||
const IDirect3DDevice3Vtbl *IDirect3DDevice3_vtbl;
|
||||
const IDirect3DDevice2Vtbl *IDirect3DDevice2_vtbl;
|
||||
const IDirect3DDeviceVtbl *IDirect3DDevice_vtbl;
|
||||
IDirect3DDevice7 IDirect3DDevice7_iface;
|
||||
IDirect3DDevice3 IDirect3DDevice3_iface;
|
||||
IDirect3DDevice2 IDirect3DDevice2_iface;
|
||||
IDirect3DDevice IDirect3DDevice_iface;
|
||||
LONG ref;
|
||||
|
||||
/* Other object connections */
|
||||
@@ -298,6 +300,10 @@ struct IDirect3DDeviceImpl
|
||||
|
||||
/* Required to keep track which of two available texture blending modes in d3ddevice3 is used */
|
||||
BOOL legacyTextureBlending;
|
||||
BOOL from_surface;
|
||||
|
||||
D3DMATRIX legacy_projection;
|
||||
D3DMATRIX legacy_clipspace;
|
||||
|
||||
/* Light state */
|
||||
DWORD material;
|
||||
@@ -325,52 +331,44 @@ extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN;
|
||||
/* Helper functions */
|
||||
HRESULT IDirect3DImpl_GetCaps(const struct wined3d *wined3d,
|
||||
D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7) DECLSPEC_HIDDEN;
|
||||
WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN;
|
||||
enum wined3d_depth_buffer_type IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *device) DECLSPEC_HIDDEN;
|
||||
|
||||
static inline IDirect3DDeviceImpl *device_from_device1(IDirect3DDevice *iface)
|
||||
static inline IDirect3DDeviceImpl *impl_from_IDirect3DDevice(IDirect3DDevice *iface)
|
||||
{
|
||||
return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirect3DDeviceImpl, IDirect3DDevice_iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DDeviceImpl *device_from_device2(IDirect3DDevice2 *iface)
|
||||
static inline IDirect3DDeviceImpl *impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface)
|
||||
{
|
||||
return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice2_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirect3DDeviceImpl, IDirect3DDevice2_iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DDeviceImpl *device_from_device3(IDirect3DDevice3 *iface)
|
||||
static inline IDirect3DDeviceImpl *impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface)
|
||||
{
|
||||
return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice3_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirect3DDeviceImpl, IDirect3DDevice3_iface);
|
||||
}
|
||||
|
||||
/* Structures */
|
||||
struct EnumTextureFormatsCBS
|
||||
static inline IDirect3DDeviceImpl *impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface)
|
||||
{
|
||||
LPD3DENUMTEXTUREFORMATSCALLBACK cbv2;
|
||||
LPD3DENUMPIXELFORMATSCALLBACK cbv7;
|
||||
void *Context;
|
||||
};
|
||||
return CONTAINING_RECORD(iface, IDirect3DDeviceImpl, IDirect3DDevice7_iface);
|
||||
}
|
||||
|
||||
/* Structure for EnumZBufferFormats */
|
||||
struct EnumZBufferFormatsData
|
||||
{
|
||||
LPD3DENUMPIXELFORMATSCALLBACK Callback;
|
||||
void *Context;
|
||||
};
|
||||
IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice(IDirect3DDevice *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawClipper implementation structure
|
||||
*****************************************************************************/
|
||||
struct IDirectDrawClipperImpl
|
||||
struct ddraw_clipper
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirectDrawClipperVtbl *lpVtbl;
|
||||
IDirectDrawClipper IDirectDrawClipper_iface;
|
||||
LONG ref;
|
||||
|
||||
struct wined3d_clipper *wineD3DClipper;
|
||||
HWND window;
|
||||
HRGN region;
|
||||
BOOL initialized;
|
||||
};
|
||||
|
||||
HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN;
|
||||
HRESULT ddraw_clipper_init(struct ddraw_clipper *clipper) DECLSPEC_HIDDEN;
|
||||
struct ddraw_clipper *unsafe_impl_from_IDirectDrawClipper(IDirectDrawClipper *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectDrawPalette implementation structure
|
||||
@@ -378,7 +376,7 @@ HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN;
|
||||
struct IDirectDrawPaletteImpl
|
||||
{
|
||||
/* IUnknown fields */
|
||||
const IDirectDrawPaletteVtbl *lpVtbl;
|
||||
IDirectDrawPalette IDirectDrawPalette_iface;
|
||||
LONG ref;
|
||||
|
||||
struct wined3d_palette *wineD3DPalette;
|
||||
@@ -387,6 +385,13 @@ struct IDirectDrawPaletteImpl
|
||||
IUnknown *ifaceToRelease;
|
||||
};
|
||||
|
||||
static inline IDirectDrawPaletteImpl *impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectDrawPaletteImpl, IDirectDrawPalette_iface);
|
||||
}
|
||||
|
||||
IDirectDrawPaletteImpl *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette,
|
||||
IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN;
|
||||
|
||||
@@ -403,7 +408,7 @@ struct object_creation_info
|
||||
******************************************************************************/
|
||||
struct IDirect3DLightImpl
|
||||
{
|
||||
const IDirect3DLightVtbl *lpVtbl;
|
||||
IDirect3DLight IDirect3DLight_iface;
|
||||
LONG ref;
|
||||
|
||||
/* IDirect3DLight fields */
|
||||
@@ -424,15 +429,16 @@ struct IDirect3DLightImpl
|
||||
void light_activate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN;
|
||||
void light_deactivate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN;
|
||||
void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
|
||||
IDirect3DLightImpl *unsafe_impl_from_IDirect3DLight(IDirect3DLight *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/******************************************************************************
|
||||
* IDirect3DMaterial implementation structure - Wraps to D3D7
|
||||
******************************************************************************/
|
||||
struct IDirect3DMaterialImpl
|
||||
{
|
||||
const IDirect3DMaterial3Vtbl *lpVtbl;
|
||||
const IDirect3DMaterial2Vtbl *IDirect3DMaterial2_vtbl;
|
||||
const IDirect3DMaterialVtbl *IDirect3DMaterial_vtbl;
|
||||
IDirect3DMaterial3 IDirect3DMaterial3_iface;
|
||||
IDirect3DMaterial2 IDirect3DMaterial2_iface;
|
||||
IDirect3DMaterial IDirect3DMaterial_iface;
|
||||
LONG ref;
|
||||
|
||||
/* IDirect3DMaterial2 fields */
|
||||
@@ -445,14 +451,14 @@ struct IDirect3DMaterialImpl
|
||||
|
||||
/* Helper functions */
|
||||
void material_activate(IDirect3DMaterialImpl* This) DECLSPEC_HIDDEN;
|
||||
void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
|
||||
IDirect3DMaterialImpl *d3d_material_create(IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DViewport - Wraps to D3D7
|
||||
*****************************************************************************/
|
||||
struct IDirect3DViewportImpl
|
||||
{
|
||||
const IDirect3DViewport3Vtbl *lpVtbl;
|
||||
IDirect3DViewport3 IDirect3DViewport3_iface;
|
||||
LONG ref;
|
||||
|
||||
/* IDirect3DViewport fields */
|
||||
@@ -479,6 +485,10 @@ struct IDirect3DViewportImpl
|
||||
IDirect3DMaterialImpl *background;
|
||||
};
|
||||
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* Helper functions */
|
||||
void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN;
|
||||
void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
|
||||
@@ -488,10 +498,8 @@ void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw)
|
||||
*****************************************************************************/
|
||||
struct IDirect3DExecuteBufferImpl
|
||||
{
|
||||
/* IUnknown */
|
||||
const IDirect3DExecuteBufferVtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
IDirect3DExecuteBuffer IDirect3DExecuteBuffer_iface;
|
||||
LONG ref;
|
||||
/* IDirect3DExecuteBuffer fields */
|
||||
IDirectDrawImpl *ddraw;
|
||||
IDirect3DDeviceImpl *d3ddev;
|
||||
@@ -512,6 +520,7 @@ struct IDirect3DExecuteBufferImpl
|
||||
|
||||
HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
|
||||
IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN;
|
||||
IDirect3DExecuteBufferImpl *unsafe_impl_from_IDirect3DExecuteBuffer(IDirect3DExecuteBuffer *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* The execute function */
|
||||
HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *execute_buffer,
|
||||
@@ -522,10 +531,9 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *execute_buffer,
|
||||
*****************************************************************************/
|
||||
struct IDirect3DVertexBufferImpl
|
||||
{
|
||||
/*** IUnknown Methods ***/
|
||||
const IDirect3DVertexBuffer7Vtbl *lpVtbl;
|
||||
const IDirect3DVertexBufferVtbl *IDirect3DVertexBuffer_vtbl;
|
||||
LONG ref;
|
||||
IDirect3DVertexBuffer7 IDirect3DVertexBuffer7_iface;
|
||||
IDirect3DVertexBuffer IDirect3DVertexBuffer_iface;
|
||||
LONG ref;
|
||||
|
||||
/*** WineD3D and ddraw links ***/
|
||||
struct wined3d_buffer *wineD3DVertexBuffer;
|
||||
@@ -537,14 +545,10 @@ struct IDirect3DVertexBufferImpl
|
||||
DWORD fvf;
|
||||
};
|
||||
|
||||
HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
|
||||
IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN;
|
||||
|
||||
static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
return (IDirect3DVertexBufferImpl *)((char*)iface
|
||||
- FIELD_OFFSET(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer_vtbl));
|
||||
}
|
||||
HRESULT d3d_vertex_buffer_create(IDirect3DVertexBufferImpl **vertex_buf, IDirectDrawImpl *ddraw,
|
||||
D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexBufferImpl *unsafe_impl_from_IDirect3DVertexBuffer(IDirect3DVertexBuffer *iface) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexBufferImpl *unsafe_impl_from_IDirect3DVertexBuffer7(IDirect3DVertexBuffer7 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/*****************************************************************************
|
||||
* Helper functions from utils.c
|
||||
@@ -564,6 +568,8 @@ void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) DECLSPEC_HIDDEN;
|
||||
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
|
||||
void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in) DECLSPEC_HIDDEN;
|
||||
void DDRAW_dump_cooperativelevel(DWORD cooplevel) DECLSPEC_HIDDEN;
|
||||
void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out) DECLSPEC_HIDDEN;
|
||||
void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out) DECLSPEC_HIDDEN;
|
||||
|
||||
/* This only needs to be here as long the processvertices functionality of
|
||||
* IDirect3DExecuteBuffer isn't in WineD3D */
|
||||
@@ -592,10 +598,11 @@ typedef struct
|
||||
#define DD_STRUCT_COPY_BYSIZE_(to,from,from_size) \
|
||||
do { \
|
||||
DWORD __size = (to)->dwSize; \
|
||||
DWORD __copysize = min(__size, from_size); \
|
||||
DWORD __resetsize = min(__size, sizeof(*to)); \
|
||||
DWORD __copysize = min(__resetsize, from_size); \
|
||||
assert(to != from); \
|
||||
memcpy(to, from, __copysize); \
|
||||
memset((char*)(to) + __copysize, 0, __size - __copysize); \
|
||||
memset((char*)(to) + __copysize, 0, __resetsize - __copysize); \
|
||||
(to)->dwSize = __size; /* restore size */ \
|
||||
} while (0)
|
||||
|
||||
|
||||
+1107
-836
File diff suppressed because it is too large
Load Diff
@@ -156,8 +156,8 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
|
||||
/* IDirect3DDevices have color keying always enabled -
|
||||
* enable it before drawing. This overwrites any ALPHA*
|
||||
* render state. */
|
||||
wined3d_device_set_render_state(lpDevice->wined3d_device, WINED3DRS_COLORKEYENABLE, 1);
|
||||
IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)lpDevice,
|
||||
wined3d_device_set_render_state(lpDevice->wined3d_device, WINED3D_RS_COLORKEYENABLE, 1);
|
||||
IDirect3DDevice7_DrawIndexedPrimitive(&lpDevice->IDirect3DDevice7_iface,
|
||||
D3DPT_TRIANGLELIST, D3DFVF_TLVERTEX, tl_vx, 0, This->indices, count * 3, 0);
|
||||
} break;
|
||||
|
||||
@@ -216,7 +216,7 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
|
||||
lpDevice->view = ci->u2.dwArg[0];
|
||||
if (ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_PROJECTION)
|
||||
lpDevice->proj = ci->u2.dwArg[0];
|
||||
IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)lpDevice,
|
||||
IDirect3DDevice7_SetTransform(&lpDevice->IDirect3DDevice7_iface,
|
||||
ci->u1.dtstTransformStateType, m);
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
|
||||
break;
|
||||
}
|
||||
|
||||
IDirect3DDevice7_SetRenderState((IDirect3DDevice7 *)lpDevice, rs, ci->u2.dwArg[0]);
|
||||
IDirect3DDevice7_SetRenderState(&lpDevice->IDirect3DDevice7_iface, rs, ci->u2.dwArg[0]);
|
||||
}
|
||||
|
||||
instr += size;
|
||||
@@ -292,7 +292,7 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
|
||||
|
||||
case D3DOP_STATERENDER: {
|
||||
int i;
|
||||
IDirect3DDevice2 *d3d_device2 = (IDirect3DDevice2 *)&lpDevice->IDirect3DDevice2_vtbl;
|
||||
IDirect3DDevice2 *d3d_device2 = &lpDevice->IDirect3DDevice2_iface;
|
||||
TRACE("STATERENDER (%d)\n", count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -314,13 +314,13 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
|
||||
TRACE("PROCESSVERTICES (%d)\n", count);
|
||||
|
||||
/* Get the transform and world matrix */
|
||||
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
|
||||
/* Note: D3DMATRIX is compatible with struct wined3d_matrix. */
|
||||
wined3d_device_get_transform(lpDevice->wined3d_device,
|
||||
D3DTRANSFORMSTATE_VIEW, (WINED3DMATRIX *)&view_mat);
|
||||
D3DTRANSFORMSTATE_VIEW, (struct wined3d_matrix *)&view_mat);
|
||||
wined3d_device_get_transform(lpDevice->wined3d_device,
|
||||
D3DTRANSFORMSTATE_PROJECTION, (WINED3DMATRIX *)&proj_mat);
|
||||
D3DTRANSFORMSTATE_PROJECTION, (struct wined3d_matrix *)&proj_mat);
|
||||
wined3d_device_get_transform(lpDevice->wined3d_device,
|
||||
WINED3DTS_WORLDMATRIX(0), (WINED3DMATRIX *)&world_mat);
|
||||
WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)&world_mat);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
LPD3DPROCESSVERTICES ci = (LPD3DPROCESSVERTICES) instr;
|
||||
@@ -547,6 +547,11 @@ end_of_buffer:
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static inline IDirect3DExecuteBufferImpl *impl_from_IDirect3DExecuteBuffer(IDirect3DExecuteBuffer *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DExecuteBuffer::QueryInterface
|
||||
*
|
||||
@@ -598,10 +603,9 @@ IDirect3DExecuteBufferImpl_QueryInterface(IDirect3DExecuteBuffer *iface,
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface)
|
||||
static ULONG WINAPI IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface)
|
||||
{
|
||||
IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
|
||||
IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -618,10 +622,9 @@ IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface)
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface)
|
||||
static ULONG WINAPI IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface)
|
||||
{
|
||||
IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
|
||||
IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
@@ -669,11 +672,10 @@ static HRESULT WINAPI IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuff
|
||||
* This implementation always returns D3D_OK
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEBUFFERDESC *lpDesc)
|
||||
static HRESULT WINAPI IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEBUFFERDESC *lpDesc)
|
||||
{
|
||||
IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
|
||||
IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface);
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("iface %p, desc %p.\n", iface, lpDesc);
|
||||
@@ -719,11 +721,10 @@ static HRESULT WINAPI IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *
|
||||
* DDERR_OUTOFMEMORY if the vertex buffer allocation failed
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEDATA *lpData)
|
||||
static HRESULT WINAPI IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEDATA *lpData)
|
||||
{
|
||||
IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
|
||||
IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface);
|
||||
DWORD nbvert;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
@@ -755,11 +756,10 @@ IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface,
|
||||
* D3D_OK on success
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEDATA *lpData)
|
||||
static HRESULT WINAPI IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface,
|
||||
D3DEXECUTEDATA *lpData)
|
||||
{
|
||||
IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
|
||||
IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface);
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
@@ -839,7 +839,7 @@ static const struct IDirect3DExecuteBufferVtbl d3d_execute_buffer_vtbl =
|
||||
HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
|
||||
IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc)
|
||||
{
|
||||
execute_buffer->lpVtbl = &d3d_execute_buffer_vtbl;
|
||||
execute_buffer->IDirect3DExecuteBuffer_iface.lpVtbl = &d3d_execute_buffer_vtbl;
|
||||
execute_buffer->ref = 1;
|
||||
execute_buffer->d3ddev = device;
|
||||
|
||||
@@ -870,3 +870,12 @@ HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
IDirect3DExecuteBufferImpl *unsafe_impl_from_IDirect3DExecuteBuffer(IDirect3DExecuteBuffer *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d_execute_buffer_vtbl);
|
||||
|
||||
return impl_from_IDirect3DExecuteBuffer(iface);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ static void light_update(IDirect3DLightImpl *light)
|
||||
if (!light->active_viewport || !light->active_viewport->active_device) return;
|
||||
device = light->active_viewport->active_device;
|
||||
|
||||
IDirect3DDevice7_SetLight((IDirect3DDevice7 *)device, light->dwLightIndex, &light->light7);
|
||||
IDirect3DDevice7_SetLight(&device->IDirect3DDevice7_iface, light->dwLightIndex, &light->light7);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -62,7 +62,7 @@ void light_activate(IDirect3DLightImpl *light)
|
||||
light_update(light);
|
||||
if (!(light->light.dwFlags & D3DLIGHT_ACTIVE))
|
||||
{
|
||||
IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, TRUE);
|
||||
IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, TRUE);
|
||||
light->light.dwFlags |= D3DLIGHT_ACTIVE;
|
||||
}
|
||||
}
|
||||
@@ -86,14 +86,15 @@ void light_deactivate(IDirect3DLightImpl *light)
|
||||
/* If was not active, activate it */
|
||||
if (light->light.dwFlags & D3DLIGHT_ACTIVE)
|
||||
{
|
||||
IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, FALSE);
|
||||
IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, FALSE);
|
||||
light->light.dwFlags &= ~D3DLIGHT_ACTIVE;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown Methods.
|
||||
*****************************************************************************/
|
||||
static inline IDirect3DLightImpl *impl_from_IDirect3DLight(IDirect3DLight *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DLightImpl, IDirect3DLight_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DLight::QueryInterface
|
||||
@@ -116,19 +117,9 @@ static HRESULT WINAPI IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface, R
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DLight::AddRef
|
||||
*
|
||||
* Increases the refcount by 1
|
||||
*
|
||||
* Returns:
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DLightImpl_AddRef(IDirect3DLight *iface)
|
||||
static ULONG WINAPI IDirect3DLightImpl_AddRef(IDirect3DLight *iface)
|
||||
{
|
||||
IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
|
||||
IDirect3DLightImpl *This = impl_from_IDirect3DLight(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -136,20 +127,9 @@ IDirect3DLightImpl_AddRef(IDirect3DLight *iface)
|
||||
return ref;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DLight::Release
|
||||
*
|
||||
* Reduces the refcount by one. If the refcount falls to 0, the object
|
||||
* is destroyed
|
||||
*
|
||||
* Returns:
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DLightImpl_Release(IDirect3DLight *iface)
|
||||
static ULONG WINAPI IDirect3DLightImpl_Release(IDirect3DLight *iface)
|
||||
{
|
||||
IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
|
||||
IDirect3DLightImpl *This = impl_from_IDirect3DLight(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
@@ -207,12 +187,10 @@ static const float zero_value[] = {
|
||||
0.0, 0.0, 0.0, 0.0
|
||||
};
|
||||
|
||||
static HRESULT WINAPI
|
||||
IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
|
||||
D3DLIGHT *lpLight)
|
||||
static HRESULT WINAPI IDirect3DLightImpl_SetLight(IDirect3DLight *iface, D3DLIGHT *lpLight)
|
||||
{
|
||||
IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
|
||||
LPD3DLIGHT7 light7 = &(This->light7);
|
||||
IDirect3DLightImpl *This = impl_from_IDirect3DLight(iface);
|
||||
LPD3DLIGHT7 light7 = &This->light7;
|
||||
|
||||
TRACE("iface %p, light %p.\n", iface, lpLight);
|
||||
|
||||
@@ -246,11 +224,12 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
|
||||
light7->dvTheta = lpLight->dvTheta;
|
||||
light7->dvPhi = lpLight->dvPhi;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
memcpy(&This->light, lpLight, lpLight->dwSize);
|
||||
if (This->light.dwFlags & D3DLIGHT_ACTIVE)
|
||||
light_update(This);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -266,11 +245,9 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
|
||||
* D3D_OK on success
|
||||
* DDERR_INVALIDPARAMS if Light is NULL
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DLightImpl_GetLight(IDirect3DLight *iface,
|
||||
D3DLIGHT *lpLight)
|
||||
static HRESULT WINAPI IDirect3DLightImpl_GetLight(IDirect3DLight *iface, D3DLIGHT *lpLight)
|
||||
{
|
||||
IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
|
||||
IDirect3DLightImpl *This = impl_from_IDirect3DLight(iface);
|
||||
|
||||
TRACE("iface %p, light %p.\n", iface, lpLight);
|
||||
|
||||
@@ -280,9 +257,9 @@ IDirect3DLightImpl_GetLight(IDirect3DLight *iface,
|
||||
dump_light(&This->light);
|
||||
}
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
memcpy(lpLight, &This->light, lpLight->dwSize);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
@@ -301,7 +278,16 @@ static const struct IDirect3DLightVtbl d3d_light_vtbl =
|
||||
|
||||
void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw)
|
||||
{
|
||||
light->lpVtbl = &d3d_light_vtbl;
|
||||
light->IDirect3DLight_iface.lpVtbl = &d3d_light_vtbl;
|
||||
light->ref = 1;
|
||||
light->ddraw = ddraw;
|
||||
}
|
||||
|
||||
IDirect3DLightImpl *unsafe_impl_from_IDirect3DLight(IDirect3DLight *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d_light_vtbl);
|
||||
|
||||
return impl_from_IDirect3DLight(iface);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#define DDRAW_INIT_GUID
|
||||
#include "ddraw_private.h"
|
||||
#include "rpcproxy.h"
|
||||
|
||||
#include "wine/exception.h"
|
||||
#include "winreg.h"
|
||||
@@ -36,21 +37,11 @@
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
|
||||
/* The configured default surface */
|
||||
WINED3DSURFTYPE DefaultSurfaceType = SURFACE_UNKNOWN;
|
||||
WINED3DSURFTYPE DefaultSurfaceType = SURFACE_OPENGL;
|
||||
|
||||
|
||||
|
||||
/* DDraw list and critical section */
|
||||
static struct list global_ddraw_list = LIST_INIT(global_ddraw_list);
|
||||
|
||||
static CRITICAL_SECTION_DEBUG ddraw_cs_debug =
|
||||
{
|
||||
0, 0, &ddraw_cs,
|
||||
{ &ddraw_cs_debug.ProcessLocksList,
|
||||
&ddraw_cs_debug.ProcessLocksList },
|
||||
0, 0, { (DWORD_PTR)(__FILE__ ": ddraw_cs") }
|
||||
};
|
||||
CRITICAL_SECTION ddraw_cs = { &ddraw_cs_debug, -1, 0, 0, 0, 0 };
|
||||
static HINSTANCE instance;
|
||||
|
||||
/* value of ForceRefreshRate */
|
||||
DWORD force_refresh_rate = 0;
|
||||
@@ -195,7 +186,7 @@ DDRAW_Create(const GUID *guid,
|
||||
IUnknown *UnkOuter,
|
||||
REFIID iid)
|
||||
{
|
||||
WINED3DDEVTYPE devicetype;
|
||||
enum wined3d_device_type device_type;
|
||||
IDirectDrawImpl *This;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -213,15 +204,15 @@ DDRAW_Create(const GUID *guid,
|
||||
* WineD3D always uses OpenGL for D3D rendering. One could make it request
|
||||
* indirect rendering
|
||||
*/
|
||||
devicetype = WINED3DDEVTYPE_REF;
|
||||
device_type = WINED3D_DEVICE_TYPE_REF;
|
||||
}
|
||||
else if(guid == (GUID *) DDCREATE_HARDWAREONLY)
|
||||
{
|
||||
devicetype = WINED3DDEVTYPE_HAL;
|
||||
device_type = WINED3D_DEVICE_TYPE_HAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
devicetype = 0;
|
||||
device_type = 0;
|
||||
}
|
||||
|
||||
/* DDraw doesn't support aggregation, according to msdn */
|
||||
@@ -236,7 +227,7 @@ DDRAW_Create(const GUID *guid,
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = ddraw_init(This, devicetype);
|
||||
hr = ddraw_init(This, device_type);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize ddraw object, hr %#x.\n", hr);
|
||||
@@ -271,9 +262,17 @@ DirectDrawCreate(GUID *GUID,
|
||||
TRACE("driver_guid %s, ddraw %p, outer_unknown %p.\n",
|
||||
debugstr_guid(GUID), DD, UnkOuter);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IDirectDraw_Initialize(*DD, GUID);
|
||||
if (FAILED(hr))
|
||||
IDirectDraw_Release(*DD);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -287,22 +286,31 @@ DirectDrawCreate(GUID *GUID,
|
||||
*
|
||||
***********************************************************************/
|
||||
HRESULT WINAPI DECLSPEC_HOTPATCH
|
||||
DirectDrawCreateEx(GUID *GUID,
|
||||
LPVOID *DD,
|
||||
DirectDrawCreateEx(GUID *guid,
|
||||
LPVOID *dd,
|
||||
REFIID iid,
|
||||
IUnknown *UnkOuter)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("driver_guid %s, ddraw %p, interface_iid %s, outer_unknown %p.\n",
|
||||
debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter);
|
||||
debugstr_guid(guid), dd, debugstr_guid(iid), UnkOuter);
|
||||
|
||||
if (!IsEqualGUID(iid, &IID_IDirectDraw7))
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
hr = DDRAW_Create(GUID, DD, UnkOuter, iid);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = DDRAW_Create(guid, dd, UnkOuter, iid);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
IDirectDraw7 *ddraw7 = *(IDirectDraw7 **)dd;
|
||||
hr = IDirectDraw7_Initialize(ddraw7, guid);
|
||||
if (FAILED(hr))
|
||||
IDirectDraw7_Release(ddraw7);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -448,9 +456,10 @@ CF_CreateDirectDraw(IUnknown* UnkOuter, REFIID iid,
|
||||
|
||||
TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(iid), obj);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = DDRAW_Create(NULL, obj, UnkOuter, iid);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -477,18 +486,19 @@ CF_CreateDirectDrawClipper(IUnknown* UnkOuter, REFIID riid,
|
||||
|
||||
TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(riid), obj);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = DirectDrawCreateClipper(0, &Clip, UnkOuter);
|
||||
if (hr != DD_OK)
|
||||
{
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = IDirectDrawClipper_QueryInterface(Clip, riid, obj);
|
||||
IDirectDrawClipper_Release(Clip);
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -714,6 +724,23 @@ HRESULT WINAPI DllCanUnloadNow(void)
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* DllRegisterServer (DDRAW.@)
|
||||
*/
|
||||
HRESULT WINAPI DllRegisterServer(void)
|
||||
{
|
||||
return __wine_register_resources( instance );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllUnregisterServer (DDRAW.@)
|
||||
*/
|
||||
HRESULT WINAPI DllUnregisterServer(void)
|
||||
{
|
||||
return __wine_unregister_resources( instance );
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* DestroyCallback
|
||||
*
|
||||
@@ -733,11 +760,18 @@ DestroyCallback(IDirectDrawSurface7 *surf,
|
||||
DDSURFACEDESC2 *desc,
|
||||
void *context)
|
||||
{
|
||||
IDirectDrawSurfaceImpl *Impl = (IDirectDrawSurfaceImpl *)surf;
|
||||
ULONG ref;
|
||||
IDirectDrawSurfaceImpl *Impl = impl_from_IDirectDrawSurface7(surf);
|
||||
ULONG ref7, ref4, ref3, ref2, ref1, gamma_count, iface_count;
|
||||
|
||||
ref = IDirectDrawSurface7_Release(surf); /* For the EnumSurfaces */
|
||||
WARN("Surface %p has an reference count of %d\n", Impl, ref);
|
||||
ref7 = IDirectDrawSurface7_Release(surf); /* For the EnumSurfaces */
|
||||
ref4 = Impl->ref4;
|
||||
ref3 = Impl->ref3;
|
||||
ref2 = Impl->ref2;
|
||||
ref1 = Impl->ref1;
|
||||
gamma_count = Impl->gamma_count;
|
||||
|
||||
WARN("Surface %p has an reference counts of 7: %u 4: %u 3: %u 2: %u 1: %u gamma: %u\n",
|
||||
Impl, ref7, ref4, ref3, ref2, ref1, gamma_count);
|
||||
|
||||
/* Skip surfaces which are attached somewhere or which are
|
||||
* part of a complex compound. They will get released when destroying
|
||||
@@ -747,7 +781,8 @@ DestroyCallback(IDirectDrawSurface7 *surf,
|
||||
return DDENUMRET_OK;
|
||||
|
||||
/* Destroy the surface */
|
||||
while(ref) ref = IDirectDrawSurface7_Release(surf);
|
||||
iface_count = ddraw_surface_release_iface(Impl);
|
||||
while (iface_count) iface_count = ddraw_surface_release_iface(Impl);
|
||||
|
||||
return DDENUMRET_OK;
|
||||
}
|
||||
@@ -880,6 +915,7 @@ DllMain(HINSTANCE hInstDLL,
|
||||
RegCloseKey( hkey );
|
||||
}
|
||||
|
||||
instance = hInstDLL;
|
||||
DisableThreadLibraryCalls(hInstDLL);
|
||||
}
|
||||
else if (Reason == DLL_PROCESS_DETACH)
|
||||
@@ -902,7 +938,6 @@ DllMain(HINSTANCE hInstDLL,
|
||||
/* Add references to each interface to avoid freeing them unexpectedly */
|
||||
IDirectDraw_AddRef(&ddraw->IDirectDraw_iface);
|
||||
IDirectDraw2_AddRef(&ddraw->IDirectDraw2_iface);
|
||||
IDirectDraw3_AddRef(&ddraw->IDirectDraw3_iface);
|
||||
IDirectDraw4_AddRef(&ddraw->IDirectDraw4_iface);
|
||||
IDirectDraw7_AddRef(&ddraw->IDirectDraw7_iface);
|
||||
|
||||
@@ -913,9 +948,15 @@ DllMain(HINSTANCE hInstDLL,
|
||||
if(ddraw->d3ddevice)
|
||||
{
|
||||
WARN("DDraw %p has d3ddevice %p attached\n", ddraw, ddraw->d3ddevice);
|
||||
while(IDirect3DDevice7_Release((IDirect3DDevice7 *)ddraw->d3ddevice));
|
||||
while(IDirect3DDevice7_Release(&ddraw->d3ddevice->IDirect3DDevice7_iface));
|
||||
}
|
||||
|
||||
/* Destroy the swapchain after any 3D device. The 3D device
|
||||
* cleanup code needs a swapchain. Specifically, it tries to
|
||||
* set the current render target to the front buffer. */
|
||||
if (ddraw->wined3d_swapchain)
|
||||
ddraw_destroy_swapchain(ddraw);
|
||||
|
||||
/* Try to release the objects
|
||||
* Do an EnumSurfaces to find any hanging surfaces
|
||||
*/
|
||||
@@ -929,16 +970,14 @@ DllMain(HINSTANCE hInstDLL,
|
||||
ERR("(%p) EnumSurfaces failed, prepare for trouble\n", ddraw);
|
||||
}
|
||||
|
||||
/* Check the surface count */
|
||||
if(ddraw->surfaces > 0)
|
||||
ERR("DDraw %p still has %d surfaces attached\n", ddraw, ddraw->surfaces);
|
||||
if (!list_empty(&ddraw->surface_list))
|
||||
ERR("DDraw %p still has surfaces attached.\n", ddraw);
|
||||
|
||||
/* Release all hanging references to destroy the objects. This
|
||||
* restores the screen mode too
|
||||
*/
|
||||
while(IDirectDraw_Release(&ddraw->IDirectDraw_iface));
|
||||
while(IDirectDraw2_Release(&ddraw->IDirectDraw2_iface));
|
||||
while(IDirectDraw3_Release(&ddraw->IDirectDraw3_iface));
|
||||
while(IDirectDraw4_Release(&ddraw->IDirectDraw4_iface));
|
||||
while(IDirectDraw7_Release(&ddraw->IDirectDraw7_iface));
|
||||
}
|
||||
|
||||
@@ -31,14 +31,19 @@ static void dump_material(const D3DMATERIAL *mat)
|
||||
TRACE(" dwSize : %d\n", mat->dwSize);
|
||||
}
|
||||
|
||||
static inline IDirect3DMaterialImpl *material_from_material1(IDirect3DMaterial *iface)
|
||||
static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial(IDirect3DMaterial *iface)
|
||||
{
|
||||
return (IDirect3DMaterialImpl *)((char*)iface - FIELD_OFFSET(IDirect3DMaterialImpl, IDirect3DMaterial_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial_iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DMaterialImpl *material_from_material2(IDirect3DMaterial2 *iface)
|
||||
static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial2(IDirect3DMaterial2 *iface)
|
||||
{
|
||||
return (IDirect3DMaterialImpl *)((char*)iface - FIELD_OFFSET(IDirect3DMaterialImpl, IDirect3DMaterial2_vtbl));
|
||||
return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial2_iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial3(IDirect3DMaterial3 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial3_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -60,12 +65,10 @@ static inline IDirect3DMaterialImpl *material_from_material2(IDirect3DMaterial2
|
||||
* E_NOINTERFACE if the requested interface wasn't found
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface,
|
||||
REFIID riid,
|
||||
LPVOID* obp)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface, REFIID riid,
|
||||
void **obp)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
|
||||
|
||||
@@ -78,19 +81,19 @@ IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface,
|
||||
return S_OK;
|
||||
}
|
||||
if ( IsEqualGUID( &IID_IDirect3DMaterial, riid ) ) {
|
||||
IDirect3DMaterial_AddRef((IDirect3DMaterial *)&This->IDirect3DMaterial_vtbl);
|
||||
*obp = &This->IDirect3DMaterial_vtbl;
|
||||
IDirect3DMaterial_AddRef(&This->IDirect3DMaterial_iface);
|
||||
*obp = &This->IDirect3DMaterial_iface;
|
||||
TRACE(" Creating IDirect3DMaterial interface %p\n", *obp);
|
||||
return S_OK;
|
||||
}
|
||||
if ( IsEqualGUID( &IID_IDirect3DMaterial2, riid ) ) {
|
||||
IDirect3DMaterial_AddRef((IDirect3DMaterial2 *)&This->IDirect3DMaterial2_vtbl);
|
||||
*obp = &This->IDirect3DMaterial2_vtbl;
|
||||
IDirect3DMaterial_AddRef(&This->IDirect3DMaterial2_iface);
|
||||
*obp = &This->IDirect3DMaterial2_iface;
|
||||
TRACE(" Creating IDirect3DMaterial2 interface %p\n", *obp);
|
||||
return S_OK;
|
||||
}
|
||||
if ( IsEqualGUID( &IID_IDirect3DMaterial3, riid ) ) {
|
||||
IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)This);
|
||||
IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
|
||||
*obp = This;
|
||||
TRACE(" Creating IDirect3DMaterial3 interface %p\n", *obp);
|
||||
return S_OK;
|
||||
@@ -108,10 +111,9 @@ IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface,
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -129,10 +131,9 @@ IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
@@ -141,9 +142,9 @@ IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface)
|
||||
{
|
||||
if(This->Handle)
|
||||
{
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
ddraw_free_handle(&This->ddraw->d3ddevice->handle_table, This->Handle - 1, DDRAW_HANDLE_MATERIAL);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
@@ -225,21 +226,20 @@ IDirect3DMaterialImpl_Unreserve(IDirect3DMaterial *iface)
|
||||
* DDERR_INVALIDPARAMS if Mat is NULL
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface,
|
||||
D3DMATERIAL *lpMat)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface,
|
||||
D3DMATERIAL *lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
if (TRACE_ON(ddraw))
|
||||
dump_material(lpMat);
|
||||
|
||||
/* Stores the material */
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
memset(&This->mat, 0, sizeof(This->mat));
|
||||
memcpy(&This->mat, lpMat, lpMat->dwSize);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
@@ -257,11 +257,10 @@ IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface,
|
||||
* DDERR_INVALIDPARAMS if Mat is NULL
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
|
||||
D3DMATERIAL *lpMat)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
|
||||
D3DMATERIAL *lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
@@ -272,10 +271,10 @@ IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
|
||||
}
|
||||
|
||||
/* Copies the material structure */
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
dwSize = lpMat->dwSize;
|
||||
memcpy(lpMat, &This->mat, dwSize);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
@@ -295,129 +294,153 @@ IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
|
||||
* DDERR_INVALIDPARAMS if Handle is NULL
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface,
|
||||
IDirect3DDevice3 *lpDirect3DDevice3,
|
||||
D3DMATERIALHANDLE *lpHandle)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface,
|
||||
IDirect3DDevice3 *device, D3DMATERIALHANDLE *handle)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
|
||||
IDirect3DDeviceImpl *device = device_from_device3(lpDirect3DDevice3);
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice3(device);
|
||||
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice3, lpHandle);
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
This->active_device = device;
|
||||
wined3d_mutex_lock();
|
||||
This->active_device = device_impl;
|
||||
if(!This->Handle)
|
||||
{
|
||||
DWORD h = ddraw_allocate_handle(&device->handle_table, This, DDRAW_HANDLE_MATERIAL);
|
||||
DWORD h = ddraw_allocate_handle(&device_impl->handle_table, This, DDRAW_HANDLE_MATERIAL);
|
||||
if (h == DDRAW_INVALID_HANDLE)
|
||||
{
|
||||
ERR("Failed to allocate a material handle.\n");
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_INVALIDPARAMS; /* Unchecked */
|
||||
}
|
||||
|
||||
This->Handle = h + 1;
|
||||
}
|
||||
*lpHandle = This->Handle;
|
||||
TRACE(" returning handle %08x.\n", *lpHandle);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
*handle = This->Handle;
|
||||
TRACE(" returning handle %08x.\n", *handle);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_GetHandle(IDirect3DMaterial2 *iface,
|
||||
IDirect3DDevice2 *lpDirect3DDevice2, D3DMATERIALHANDLE *lpHandle)
|
||||
IDirect3DDevice2 *device, D3DMATERIALHANDLE *handle)
|
||||
{
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice2, lpHandle);
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice2(device);
|
||||
|
||||
return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material2(iface), lpDirect3DDevice2 ?
|
||||
(IDirect3DDevice3 *)&device_from_device2(lpDirect3DDevice2)->IDirect3DDevice3_vtbl : NULL, lpHandle);
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
|
||||
|
||||
return IDirect3DMaterial3_GetHandle(&This->IDirect3DMaterial3_iface, device_impl ?
|
||||
&device_impl->IDirect3DDevice3_iface : NULL, handle);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_GetHandle(IDirect3DMaterial *iface,
|
||||
IDirect3DDevice *lpDirect3DDevice, D3DMATERIALHANDLE *lpHandle)
|
||||
IDirect3DDevice *device, D3DMATERIALHANDLE *handle)
|
||||
{
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice, lpHandle);
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice(device);
|
||||
|
||||
return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material1(iface), lpDirect3DDevice ?
|
||||
(IDirect3DDevice3 *)&device_from_device1(lpDirect3DDevice)->IDirect3DDevice3_vtbl : NULL, lpHandle);
|
||||
TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
|
||||
|
||||
return IDirect3DMaterial3_GetHandle(&This->IDirect3DMaterial3_iface, device_impl ?
|
||||
&device_impl->IDirect3DDevice3_iface : NULL, handle);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_QueryInterface(LPDIRECT3DMATERIAL2 iface, REFIID riid,
|
||||
LPVOID* obp)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_QueryInterface(IDirect3DMaterial2 *iface, REFIID riid,
|
||||
void **obp)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
|
||||
|
||||
return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material2(iface), riid, obp);
|
||||
return IDirect3DMaterial3_QueryInterface(&This->IDirect3DMaterial3_iface, riid, obp);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_QueryInterface(LPDIRECT3DMATERIAL iface, REFIID riid,
|
||||
LPVOID* obp)
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_QueryInterface(IDirect3DMaterial *iface, REFIID riid,
|
||||
void **obp)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
|
||||
|
||||
return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material1(iface), riid, obp);
|
||||
return IDirect3DMaterial3_QueryInterface(&This->IDirect3DMaterial3_iface, riid, obp);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_2_AddRef(LPDIRECT3DMATERIAL2 iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_2_AddRef(IDirect3DMaterial2 *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material2(iface));
|
||||
return IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_1_AddRef(LPDIRECT3DMATERIAL iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_1_AddRef(IDirect3DMaterial *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material1(iface));
|
||||
return IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_2_Release(LPDIRECT3DMATERIAL2 iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_2_Release(IDirect3DMaterial2 *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material2(iface));
|
||||
return IDirect3DMaterial3_Release(&This->IDirect3DMaterial3_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_1_Release(LPDIRECT3DMATERIAL iface)
|
||||
static ULONG WINAPI IDirect3DMaterialImpl_1_Release(IDirect3DMaterial *iface)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material1(iface));
|
||||
return IDirect3DMaterial3_Release(&This->IDirect3DMaterial3_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_SetMaterial(LPDIRECT3DMATERIAL2 iface,
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_SetMaterial(IDirect3DMaterial2 *iface,
|
||||
LPD3DMATERIAL lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
|
||||
return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat);
|
||||
return IDirect3DMaterial3_SetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_SetMaterial(LPDIRECT3DMATERIAL iface,
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_SetMaterial(IDirect3DMaterial *iface,
|
||||
LPD3DMATERIAL lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
|
||||
return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat);
|
||||
return IDirect3DMaterial3_SetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_GetMaterial(LPDIRECT3DMATERIAL2 iface,
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_2_GetMaterial(IDirect3DMaterial2 *iface,
|
||||
LPD3DMATERIAL lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
|
||||
return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat);
|
||||
return IDirect3DMaterial3_GetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_GetMaterial(LPDIRECT3DMATERIAL iface,
|
||||
static HRESULT WINAPI IDirect3DMaterialImpl_1_GetMaterial(IDirect3DMaterial *iface,
|
||||
LPD3DMATERIAL lpMat)
|
||||
{
|
||||
IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
|
||||
|
||||
TRACE("iface %p, material %p.\n", iface, lpMat);
|
||||
|
||||
return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat);
|
||||
return IDirect3DMaterial3_GetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
|
||||
}
|
||||
|
||||
|
||||
@@ -441,7 +464,7 @@ void material_activate(IDirect3DMaterialImpl* This)
|
||||
d3d7mat.u3.emissive = This->mat.u3.emissive;
|
||||
d3d7mat.u4.power = This->mat.u4.power;
|
||||
|
||||
IDirect3DDevice7_SetMaterial((IDirect3DDevice7 *)This->active_device, &d3d7mat);
|
||||
IDirect3DDevice7_SetMaterial(&This->active_device->IDirect3DDevice7_iface, &d3d7mat);
|
||||
}
|
||||
|
||||
static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl =
|
||||
@@ -483,11 +506,19 @@ static const struct IDirect3DMaterialVtbl d3d_material1_vtbl =
|
||||
IDirect3DMaterialImpl_Unreserve
|
||||
};
|
||||
|
||||
void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw)
|
||||
IDirect3DMaterialImpl *d3d_material_create(IDirectDrawImpl *ddraw)
|
||||
{
|
||||
material->lpVtbl = &d3d_material3_vtbl;
|
||||
material->IDirect3DMaterial2_vtbl = &d3d_material2_vtbl;
|
||||
material->IDirect3DMaterial_vtbl = &d3d_material1_vtbl;
|
||||
IDirect3DMaterialImpl *material;
|
||||
|
||||
material = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*material));
|
||||
if (!material)
|
||||
return NULL;
|
||||
|
||||
material->IDirect3DMaterial3_iface.lpVtbl = &d3d_material3_vtbl;
|
||||
material->IDirect3DMaterial2_iface.lpVtbl = &d3d_material2_vtbl;
|
||||
material->IDirect3DMaterial_iface.lpVtbl = &d3d_material1_vtbl;
|
||||
material->ref = 1;
|
||||
material->ddraw = ddraw;
|
||||
|
||||
return material;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ IDirectDrawPaletteImpl_QueryInterface(IDirectDrawPalette *iface,
|
||||
static ULONG WINAPI
|
||||
IDirectDrawPaletteImpl_AddRef(IDirectDrawPalette *iface)
|
||||
{
|
||||
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
|
||||
IDirectDrawPaletteImpl *This = impl_from_IDirectDrawPalette(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -90,20 +90,21 @@ IDirectDrawPaletteImpl_AddRef(IDirectDrawPalette *iface)
|
||||
static ULONG WINAPI
|
||||
IDirectDrawPaletteImpl_Release(IDirectDrawPalette *iface)
|
||||
{
|
||||
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
|
||||
IDirectDrawPaletteImpl *This = impl_from_IDirectDrawPalette(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
|
||||
if (ref == 0)
|
||||
{
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
wined3d_palette_decref(This->wineD3DPalette);
|
||||
if(This->ifaceToRelease)
|
||||
{
|
||||
IUnknown_Release(This->ifaceToRelease);
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
@@ -155,13 +156,13 @@ static HRESULT WINAPI
|
||||
IDirectDrawPaletteImpl_GetCaps(IDirectDrawPalette *iface,
|
||||
DWORD *Caps)
|
||||
{
|
||||
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
|
||||
IDirectDrawPaletteImpl *This = impl_from_IDirectDrawPalette(iface);
|
||||
|
||||
TRACE("iface %p, caps %p.\n", iface, Caps);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
*Caps = wined3d_palette_get_flags(This->wineD3DPalette);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
@@ -191,7 +192,7 @@ IDirectDrawPaletteImpl_SetEntries(IDirectDrawPalette *iface,
|
||||
DWORD Count,
|
||||
PALETTEENTRY *PalEnt)
|
||||
{
|
||||
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
|
||||
IDirectDrawPaletteImpl *This = impl_from_IDirectDrawPalette(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n",
|
||||
@@ -200,9 +201,10 @@ IDirectDrawPaletteImpl_SetEntries(IDirectDrawPalette *iface,
|
||||
if(!PalEnt)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_palette_set_entries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -230,7 +232,7 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface,
|
||||
DWORD Count,
|
||||
PALETTEENTRY *PalEnt)
|
||||
{
|
||||
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
|
||||
IDirectDrawPaletteImpl *This = impl_from_IDirectDrawPalette(iface);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n",
|
||||
@@ -239,9 +241,10 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface,
|
||||
if(!PalEnt)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_palette_get_entries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -258,12 +261,19 @@ static const struct IDirectDrawPaletteVtbl ddraw_palette_vtbl =
|
||||
IDirectDrawPaletteImpl_SetEntries
|
||||
};
|
||||
|
||||
IDirectDrawPaletteImpl *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
|
||||
{
|
||||
if (!iface) return NULL;
|
||||
assert(iface->lpVtbl == &ddraw_palette_vtbl);
|
||||
return CONTAINING_RECORD(iface, IDirectDrawPaletteImpl, IDirectDrawPalette_iface);
|
||||
}
|
||||
|
||||
HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette,
|
||||
IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
palette->lpVtbl = &ddraw_palette_vtbl;
|
||||
palette->IDirectDrawPalette_iface.lpVtbl = &ddraw_palette_vtbl;
|
||||
palette->ref = 1;
|
||||
|
||||
hr = wined3d_palette_create(ddraw->wined3d_device, flags,
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* IParent implementation
|
||||
*
|
||||
* Copyright (c) 2006 Stefan Dösinger
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* A universal parent interface for everything in WineD3D that doesn't have
|
||||
* a DDraw counterpart
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "wine/port.h"
|
||||
|
||||
#include "ddraw_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown methods
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* IParent::Queryinterface
|
||||
*
|
||||
* It can't query any interfaces, and it's not used for anything. So
|
||||
* it just returns E_NOINTERFACE
|
||||
*
|
||||
* Params:
|
||||
* riid: guid of queried interface
|
||||
* obj: returns a pointer to the interface
|
||||
*
|
||||
* Return values
|
||||
* This implementation always returns E_NOINTERFACE and NULL
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IParentImpl_QueryInterface(IParent *iface,
|
||||
REFIID riid,
|
||||
void **obj)
|
||||
{
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj);
|
||||
|
||||
*obj = NULL;
|
||||
if ( IsEqualGUID( &IID_IUnknown, riid ) ||
|
||||
IsEqualGUID( &IID_IParent, riid ) )
|
||||
{
|
||||
*obj = iface;
|
||||
IParent_AddRef(iface);
|
||||
return DD_OK;
|
||||
}
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IParent::AddRef
|
||||
*
|
||||
* Increases the refcount
|
||||
*
|
||||
* Params:
|
||||
*
|
||||
* Return values
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IParentImpl_AddRef(IParent *iface)
|
||||
{
|
||||
IParentImpl *This = (IParentImpl *)iface;
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* IParent::Release
|
||||
*
|
||||
* Releases the refcount, and destroys the object if the refcount falls to 0
|
||||
* Also releases the child object, if destroyed. That's almost the whole sense
|
||||
* of this interface.
|
||||
*
|
||||
* Params:
|
||||
*
|
||||
* Return values
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI IParentImpl_Release(IParent *iface)
|
||||
{
|
||||
IParentImpl *This = (IParentImpl *)iface;
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
|
||||
if (ref == 0)
|
||||
{
|
||||
TRACE("(%p) Releasing child at %p\n", This, This->child);
|
||||
if(This->child)
|
||||
IUnknown_Release(This->child);
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
TRACE("Released\n");
|
||||
}
|
||||
return ref;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* The VTable
|
||||
*****************************************************************************/
|
||||
static const struct IParentVtbl ddraw_parent_vtbl =
|
||||
{
|
||||
IParentImpl_QueryInterface,
|
||||
IParentImpl_AddRef,
|
||||
IParentImpl_Release,
|
||||
};
|
||||
|
||||
void ddraw_parent_init(IParentImpl *parent)
|
||||
{
|
||||
parent->lpVtbl = &ddraw_parent_vtbl;
|
||||
parent->ref = 1;
|
||||
}
|
||||
@@ -1,439 +0,0 @@
|
||||
/*
|
||||
* self-registerable dll functions for ddraw.dll
|
||||
*
|
||||
* Copyright (C) 2003 John K. Hohm
|
||||
*
|
||||
* 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 "wine/port.h"
|
||||
|
||||
#include "ddraw_private.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "winreg.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
|
||||
static LSTATUS (WINAPI *pRegDeleteTreeW)(HKEY,LPCWSTR);
|
||||
static LSTATUS (WINAPI *pRegDeleteTreeA)(HKEY,LPCSTR);
|
||||
|
||||
/*
|
||||
* Near the bottom of this file are the exported DllRegisterServer and
|
||||
* DllUnregisterServer, which make all this worthwhile.
|
||||
*/
|
||||
|
||||
/***********************************************************************
|
||||
* interface for self-registering
|
||||
*/
|
||||
struct regsvr_interface
|
||||
{
|
||||
IID const *iid; /* NULL for end of list */
|
||||
LPCSTR name; /* can be NULL to omit */
|
||||
IID const *base_iid; /* can be NULL to omit */
|
||||
int num_methods; /* can be <0 to omit */
|
||||
CLSID const *ps_clsid; /* can be NULL to omit */
|
||||
CLSID const *ps_clsid32; /* can be NULL to omit */
|
||||
};
|
||||
|
||||
static HRESULT register_interfaces(struct regsvr_interface const *list);
|
||||
static HRESULT unregister_interfaces(struct regsvr_interface const *list);
|
||||
|
||||
struct regsvr_coclass
|
||||
{
|
||||
CLSID const *clsid; /* NULL for end of list */
|
||||
LPCSTR name; /* can be NULL to omit */
|
||||
LPCSTR ips; /* can be NULL to omit */
|
||||
LPCSTR ips32; /* can be NULL to omit */
|
||||
LPCSTR ips32_tmodel; /* can be NULL to omit */
|
||||
LPCSTR clsid_str; /* can be NULL to omit */
|
||||
LPCSTR progid; /* can be NULL to omit */
|
||||
};
|
||||
|
||||
static HRESULT register_coclasses(struct regsvr_coclass const *list);
|
||||
static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
|
||||
|
||||
/***********************************************************************
|
||||
* static string constants
|
||||
*/
|
||||
static WCHAR const interface_keyname[10] = {
|
||||
'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
|
||||
static WCHAR const base_ifa_keyname[14] = {
|
||||
'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
|
||||
'e', 0 };
|
||||
static WCHAR const num_methods_keyname[11] = {
|
||||
'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
|
||||
static WCHAR const ps_clsid_keyname[15] = {
|
||||
'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
|
||||
'i', 'd', 0 };
|
||||
static WCHAR const ps_clsid32_keyname[17] = {
|
||||
'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
|
||||
'i', 'd', '3', '2', 0 };
|
||||
static WCHAR const clsid_keyname[6] = {
|
||||
'C', 'L', 'S', 'I', 'D', 0 };
|
||||
static WCHAR const ips_keyname[13] = {
|
||||
'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
|
||||
0 };
|
||||
static WCHAR const ips32_keyname[15] = {
|
||||
'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
|
||||
'3', '2', 0 };
|
||||
static WCHAR const progid_keyname[7] = {
|
||||
'P', 'r', 'o', 'g', 'I', 'D', 0 };
|
||||
static char const tmodel_valuename[] = "ThreadingModel";
|
||||
|
||||
/***********************************************************************
|
||||
* static helper functions
|
||||
*/
|
||||
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
|
||||
static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
|
||||
WCHAR const *value);
|
||||
static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
|
||||
char const *value);
|
||||
|
||||
/***********************************************************************
|
||||
* register_interfaces
|
||||
*/
|
||||
static HRESULT register_interfaces(struct regsvr_interface const *list)
|
||||
{
|
||||
LONG res = ERROR_SUCCESS;
|
||||
HKEY interface_key;
|
||||
|
||||
res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_return;
|
||||
|
||||
for (; res == ERROR_SUCCESS && list->iid; ++list) {
|
||||
WCHAR buf[39];
|
||||
HKEY iid_key;
|
||||
|
||||
StringFromGUID2(list->iid, buf, 39);
|
||||
res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_close_interface_key;
|
||||
|
||||
if (list->name) {
|
||||
res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
|
||||
(CONST BYTE*)(list->name),
|
||||
strlen(list->name) + 1);
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
}
|
||||
|
||||
if (list->base_iid) {
|
||||
res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
}
|
||||
|
||||
if (0 <= list->num_methods) {
|
||||
static WCHAR const fmt[3] = { '%', 'd', 0 };
|
||||
HKEY key;
|
||||
|
||||
res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
|
||||
sprintfW(buf, fmt, list->num_methods);
|
||||
res = RegSetValueExW(key, NULL, 0, REG_SZ,
|
||||
(CONST BYTE*)buf,
|
||||
(lstrlenW(buf) + 1) * sizeof(WCHAR));
|
||||
RegCloseKey(key);
|
||||
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
}
|
||||
|
||||
if (list->ps_clsid) {
|
||||
res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
}
|
||||
|
||||
if (list->ps_clsid32) {
|
||||
res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
|
||||
if (res != ERROR_SUCCESS) goto error_close_iid_key;
|
||||
}
|
||||
|
||||
error_close_iid_key:
|
||||
RegCloseKey(iid_key);
|
||||
}
|
||||
|
||||
error_close_interface_key:
|
||||
RegCloseKey(interface_key);
|
||||
error_return:
|
||||
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* unregister_interfaces
|
||||
*/
|
||||
static HRESULT unregister_interfaces(struct regsvr_interface const *list)
|
||||
{
|
||||
LONG res = ERROR_SUCCESS;
|
||||
HKEY interface_key;
|
||||
|
||||
res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
|
||||
KEY_READ | KEY_WRITE, &interface_key);
|
||||
if (res == ERROR_FILE_NOT_FOUND) return S_OK;
|
||||
if (res != ERROR_SUCCESS) goto error_return;
|
||||
|
||||
for (; res == ERROR_SUCCESS && list->iid; ++list) {
|
||||
WCHAR buf[39];
|
||||
|
||||
StringFromGUID2(list->iid, buf, 39);
|
||||
res = pRegDeleteTreeW(interface_key, buf);
|
||||
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
RegCloseKey(interface_key);
|
||||
error_return:
|
||||
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* register_coclasses
|
||||
*/
|
||||
static HRESULT register_coclasses(struct regsvr_coclass const *list)
|
||||
{
|
||||
LONG res = ERROR_SUCCESS;
|
||||
HKEY coclass_key;
|
||||
|
||||
res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_return;
|
||||
|
||||
for (; res == ERROR_SUCCESS && list->clsid; ++list) {
|
||||
WCHAR buf[39];
|
||||
HKEY clsid_key;
|
||||
|
||||
StringFromGUID2(list->clsid, buf, 39);
|
||||
res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
|
||||
|
||||
if (list->name) {
|
||||
res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
|
||||
(CONST BYTE*)(list->name),
|
||||
strlen(list->name) + 1);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
}
|
||||
|
||||
if (list->ips) {
|
||||
res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
}
|
||||
|
||||
if (list->ips32) {
|
||||
HKEY ips32_key;
|
||||
|
||||
res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL,
|
||||
&ips32_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
|
||||
res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
|
||||
(CONST BYTE*)list->ips32,
|
||||
lstrlenA(list->ips32) + 1);
|
||||
if (res == ERROR_SUCCESS && list->ips32_tmodel)
|
||||
res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
|
||||
(CONST BYTE*)list->ips32_tmodel,
|
||||
strlen(list->ips32_tmodel) + 1);
|
||||
RegCloseKey(ips32_key);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
}
|
||||
|
||||
if (list->clsid_str) {
|
||||
res = register_key_defvalueA(clsid_key, clsid_keyname,
|
||||
list->clsid_str);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
}
|
||||
|
||||
if (list->progid) {
|
||||
HKEY progid_key;
|
||||
|
||||
res = register_key_defvalueA(clsid_key, progid_keyname,
|
||||
list->progid);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
|
||||
res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0,
|
||||
NULL, 0, KEY_READ | KEY_WRITE, NULL,
|
||||
&progid_key, NULL);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
|
||||
res = register_key_defvalueW(progid_key, clsid_keyname, buf);
|
||||
RegCloseKey(progid_key);
|
||||
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
|
||||
}
|
||||
|
||||
error_close_clsid_key:
|
||||
RegCloseKey(clsid_key);
|
||||
}
|
||||
|
||||
error_close_coclass_key:
|
||||
RegCloseKey(coclass_key);
|
||||
error_return:
|
||||
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* unregister_coclasses
|
||||
*/
|
||||
static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
|
||||
{
|
||||
LONG res = ERROR_SUCCESS;
|
||||
HKEY coclass_key;
|
||||
|
||||
res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
|
||||
KEY_READ | KEY_WRITE, &coclass_key);
|
||||
if (res == ERROR_FILE_NOT_FOUND) return S_OK;
|
||||
if (res != ERROR_SUCCESS) goto error_return;
|
||||
|
||||
for (; res == ERROR_SUCCESS && list->clsid; ++list) {
|
||||
WCHAR buf[39];
|
||||
|
||||
StringFromGUID2(list->clsid, buf, 39);
|
||||
res = pRegDeleteTreeW(coclass_key, buf);
|
||||
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
|
||||
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
|
||||
|
||||
if (list->progid) {
|
||||
res = pRegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
|
||||
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
|
||||
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
|
||||
}
|
||||
}
|
||||
|
||||
error_close_coclass_key:
|
||||
RegCloseKey(coclass_key);
|
||||
error_return:
|
||||
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* regsvr_key_guid
|
||||
*/
|
||||
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
|
||||
{
|
||||
WCHAR buf[39];
|
||||
|
||||
StringFromGUID2(guid, buf, 39);
|
||||
return register_key_defvalueW(base, name, buf);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* regsvr_key_defvalueW
|
||||
*/
|
||||
static LONG register_key_defvalueW(
|
||||
HKEY base,
|
||||
WCHAR const *name,
|
||||
WCHAR const *value)
|
||||
{
|
||||
LONG res;
|
||||
HKEY key;
|
||||
|
||||
res = RegCreateKeyExW(base, name, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &key, NULL);
|
||||
if (res != ERROR_SUCCESS) return res;
|
||||
res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
|
||||
(lstrlenW(value) + 1) * sizeof(WCHAR));
|
||||
RegCloseKey(key);
|
||||
return res;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* regsvr_key_defvalueA
|
||||
*/
|
||||
static LONG register_key_defvalueA(
|
||||
HKEY base,
|
||||
WCHAR const *name,
|
||||
char const *value)
|
||||
{
|
||||
LONG res;
|
||||
HKEY key;
|
||||
|
||||
res = RegCreateKeyExW(base, name, 0, NULL, 0,
|
||||
KEY_READ | KEY_WRITE, NULL, &key, NULL);
|
||||
if (res != ERROR_SUCCESS) return res;
|
||||
res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
|
||||
lstrlenA(value) + 1);
|
||||
RegCloseKey(key);
|
||||
return res;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* coclass list
|
||||
*/
|
||||
|
||||
static struct regsvr_coclass const coclass_list[] = {
|
||||
{ &CLSID_DirectDraw,
|
||||
"DirectDraw Object",
|
||||
NULL,
|
||||
"ddraw.dll",
|
||||
"Both"
|
||||
},
|
||||
{ &CLSID_DirectDraw7,
|
||||
"DirectDraw 7 Object",
|
||||
NULL,
|
||||
"ddraw.dll",
|
||||
"Both"
|
||||
},
|
||||
{ &CLSID_DirectDrawClipper,
|
||||
"DirectDraw Clipper Object",
|
||||
NULL,
|
||||
"ddraw.dll",
|
||||
"Both"
|
||||
},
|
||||
{ NULL } /* list terminator */
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
* interface list
|
||||
*/
|
||||
|
||||
static struct regsvr_interface const interface_list[] = {
|
||||
{ NULL } /* list terminator */
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
* DllRegisterServer (DDRAW.@)
|
||||
*/
|
||||
HRESULT WINAPI DllRegisterServer(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
hr = register_coclasses(coclass_list);
|
||||
if (SUCCEEDED(hr))
|
||||
hr = register_interfaces(interface_list);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllUnregisterServer (DDRAW.@)
|
||||
*/
|
||||
HRESULT WINAPI DllUnregisterServer(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
HMODULE advapi32 = GetModuleHandleA("advapi32");
|
||||
if (!advapi32) return E_FAIL;
|
||||
pRegDeleteTreeA = (void *) GetProcAddress(advapi32, "RegDeleteTreeA");
|
||||
pRegDeleteTreeW = (void *) GetProcAddress(advapi32, "RegDeleteTreeW");
|
||||
if (!pRegDeleteTreeA || !pRegDeleteTreeW) return E_FAIL;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
hr = unregister_coclasses(coclass_list);
|
||||
if (SUCCEEDED(hr))
|
||||
hr = unregister_interfaces(interface_list);
|
||||
return hr;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -216,10 +216,9 @@ void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, enum wined3d_format_i
|
||||
case WINED3DFMT_D24_UNORM_S8_UINT:
|
||||
DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER;
|
||||
DDPixelFormat->dwFourCC = 0;
|
||||
/* Should I set dwZBufferBitDepth to 32 here? */
|
||||
DDPixelFormat->u1.dwZBufferBitDepth = 32;
|
||||
DDPixelFormat->u2.dwStencilBitDepth = 8;
|
||||
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF;
|
||||
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFF;
|
||||
DDPixelFormat->u4.dwStencilBitMask = 0xFF000000;
|
||||
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
|
||||
break;
|
||||
@@ -229,7 +228,7 @@ void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, enum wined3d_format_i
|
||||
DDPixelFormat->dwFourCC = 0;
|
||||
DDPixelFormat->u1.dwZBufferBitDepth = 32;
|
||||
DDPixelFormat->u2.dwStencilBitDepth = 0;
|
||||
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF;
|
||||
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFF;
|
||||
DDPixelFormat->u4.dwStencilBitMask = 0x00000000;
|
||||
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
|
||||
break;
|
||||
@@ -427,7 +426,7 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
{
|
||||
return WINED3DFMT_B2G3R3A8_UNORM;
|
||||
}
|
||||
ERR("16 bit RGB Pixel format does not match\n");
|
||||
WARN("16 bit RGB Pixel format does not match.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
case 24:
|
||||
@@ -446,10 +445,10 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
return WINED3DFMT_B8G8R8X8_UNORM;
|
||||
|
||||
}
|
||||
ERR("32 bit RGB pixel format does not match\n");
|
||||
WARN("32 bit RGB pixel format does not match.\n");
|
||||
|
||||
default:
|
||||
ERR("Invalid dwRGBBitCount in Pixelformat structure\n");
|
||||
WARN("Invalid dwRGBBitCount in Pixelformat structure.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -461,12 +460,12 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
case 1:
|
||||
case 2:
|
||||
case 4:
|
||||
ERR("Unsupported Alpha-Only bit depth 0x%x\n", DDPixelFormat->u1.dwAlphaBitDepth);
|
||||
FIXME("Unsupported Alpha-Only bit depth 0x%x.\n", DDPixelFormat->u1.dwAlphaBitDepth);
|
||||
case 8:
|
||||
return WINED3DFMT_A8_UNORM;
|
||||
|
||||
default:
|
||||
ERR("Invalid AlphaBitDepth in Alpha-Only Pixelformat\n");
|
||||
WARN("Invalid AlphaBitDepth in Alpha-Only Pixelformat.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -481,17 +480,17 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
case 4:
|
||||
if(DDPixelFormat->u1.dwAlphaBitDepth == 4)
|
||||
return WINED3DFMT_L4A4_UNORM;
|
||||
ERR("Unknown Alpha / Luminance bit depth combination\n");
|
||||
WARN("Unknown Alpha / Luminance bit depth combination.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
case 6:
|
||||
ERR("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now!!\n");
|
||||
FIXME("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now.\n");
|
||||
return WINED3DFMT_R5G5_SNORM_L6_UNORM;
|
||||
|
||||
case 8:
|
||||
if(DDPixelFormat->u1.dwAlphaBitDepth == 8)
|
||||
return WINED3DFMT_L8A8_UNORM;
|
||||
ERR("Unknown Alpha / Lumincase bit depth combination\n");
|
||||
WARN("Unknown Alpha / Lumincase bit depth combination.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -501,14 +500,14 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
switch(DDPixelFormat->u1.dwLuminanceBitCount)
|
||||
{
|
||||
case 6:
|
||||
ERR("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now!!\n");
|
||||
FIXME("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now.\n");
|
||||
return WINED3DFMT_R5G5_SNORM_L6_UNORM;
|
||||
|
||||
case 8:
|
||||
return WINED3DFMT_L8_UNORM;
|
||||
|
||||
default:
|
||||
ERR("Unknown luminance-only bit depth 0x%x\n", DDPixelFormat->u1.dwLuminanceBitCount);
|
||||
WARN("Unknown luminance-only bit depth 0x%x.\n", DDPixelFormat->u1.dwLuminanceBitCount);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -520,31 +519,22 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
{
|
||||
switch(DDPixelFormat->u1.dwZBufferBitDepth)
|
||||
{
|
||||
case 8:
|
||||
FIXME("8 Bits Z+Stencil buffer pixelformat is not supported. Returning WINED3DFMT_UNKNOWN\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
case 15:
|
||||
FIXME("15 bit depth buffer not handled yet, assuming 16 bit\n");
|
||||
case 16:
|
||||
if(DDPixelFormat->u2.dwStencilBitDepth == 1)
|
||||
return WINED3DFMT_S1_UINT_D15_UNORM;
|
||||
|
||||
FIXME("Don't know how to handle a 16 bit Z buffer with %d bit stencil buffer pixelformat\n", DDPixelFormat->u2.dwStencilBitDepth);
|
||||
if (DDPixelFormat->u2.dwStencilBitDepth == 1) return WINED3DFMT_S1_UINT_D15_UNORM;
|
||||
WARN("Unknown depth stenil format: 16 z bits, %u stencil bits\n",
|
||||
DDPixelFormat->u2.dwStencilBitDepth);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
case 24:
|
||||
FIXME("Don't know how to handle a 24 bit depth buffer with stencil bits\n");
|
||||
return WINED3DFMT_D24_UNORM_S8_UINT;
|
||||
|
||||
case 32:
|
||||
if(DDPixelFormat->u2.dwStencilBitDepth == 8)
|
||||
return WINED3DFMT_D24_UNORM_S8_UINT;
|
||||
else
|
||||
return WINED3DFMT_S4X4_UINT_D24_UNORM;
|
||||
if (DDPixelFormat->u2.dwStencilBitDepth == 8) return WINED3DFMT_D24_UNORM_S8_UINT;
|
||||
else if (DDPixelFormat->u2.dwStencilBitDepth == 4) return WINED3DFMT_S4X4_UINT_D24_UNORM;
|
||||
WARN("Unknown depth stenil format: 32 z bits, %u stencil bits\n",
|
||||
DDPixelFormat->u2.dwStencilBitDepth);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
default:
|
||||
ERR("Unknown Z buffer depth %d\n", DDPixelFormat->u1.dwZBufferBitDepth);
|
||||
WARN("Unknown depth stenil format: %u z bits, %u stencil bits\n",
|
||||
DDPixelFormat->u1.dwZBufferBitDepth, DDPixelFormat->u2.dwStencilBitDepth);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -552,26 +542,23 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
{
|
||||
switch(DDPixelFormat->u1.dwZBufferBitDepth)
|
||||
{
|
||||
case 8:
|
||||
ERR("8 Bit Z buffers are not supported. Trying a 16 Bit one\n");
|
||||
return WINED3DFMT_D16_UNORM;
|
||||
|
||||
case 16:
|
||||
return WINED3DFMT_D16_UNORM;
|
||||
|
||||
case 24:
|
||||
FIXME("24 Bit depth buffer, treating like a 32 bit one\n");
|
||||
return WINED3DFMT_X8D24_UNORM;
|
||||
|
||||
case 32:
|
||||
if(DDPixelFormat->u3.dwZBitMask == 0x00FFFFFF) {
|
||||
return WINED3DFMT_X8D24_UNORM;
|
||||
} else if(DDPixelFormat->u3.dwZBitMask == 0xFFFFFFFF) {
|
||||
return WINED3DFMT_D32_UNORM;
|
||||
}
|
||||
FIXME("Unhandled 32 bit depth buffer bitmasks, returning WINED3DFMT_D24X8\n");
|
||||
return WINED3DFMT_X8D24_UNORM; /* That's most likely to make games happy */
|
||||
if (DDPixelFormat->u3.dwZBitMask == 0x00FFFFFF) return WINED3DFMT_X8D24_UNORM;
|
||||
else if (DDPixelFormat->u3.dwZBitMask == 0xFFFFFF00) return WINED3DFMT_X8D24_UNORM;
|
||||
else if (DDPixelFormat->u3.dwZBitMask == 0xFFFFFFFF) return WINED3DFMT_D32_UNORM;
|
||||
WARN("Unknown depth-only format: 32 z bits, mask 0x%08x\n",
|
||||
DDPixelFormat->u3.dwZBitMask);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
|
||||
default:
|
||||
ERR("Unsupported Z buffer depth %d\n", DDPixelFormat->u1.dwZBufferBitDepth);
|
||||
WARN("Unknown depth-only format: %u z bits, mask 0x%08x\n",
|
||||
DDPixelFormat->u1.dwZBufferBitDepth, DDPixelFormat->u3.dwZBitMask);
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
@@ -612,7 +599,7 @@ enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat
|
||||
}
|
||||
}
|
||||
|
||||
ERR("Unknown Pixelformat!\n");
|
||||
WARN("Unknown Pixelformat.\n");
|
||||
return WINED3DFMT_UNKNOWN;
|
||||
}
|
||||
|
||||
@@ -1181,3 +1168,93 @@ hr_ddraw_from_wined3d(HRESULT hr)
|
||||
default: return hr;
|
||||
}
|
||||
}
|
||||
|
||||
/* Note that this function writes the full sizeof(DDSURFACEDESC2) size, don't use it
|
||||
* for writing into application-provided DDSURFACEDESC2 structures if the size may
|
||||
* be different */
|
||||
void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out)
|
||||
{
|
||||
/* The output of this function is never passed to the application directly, so
|
||||
* the memset is not strictly needed. CreateSurface still has problems with this
|
||||
* though. Don't forget to set ddsCaps.dwCaps2/3/4 to 0 when removing this */
|
||||
memset(out, 0x00, sizeof(*out));
|
||||
out->dwSize = sizeof(*out);
|
||||
out->dwFlags = in->dwFlags & ~DDSD_ZBUFFERBITDEPTH;
|
||||
if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
|
||||
if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
|
||||
if (in->dwFlags & DDSD_PIXELFORMAT) out->u4.ddpfPixelFormat = in->ddpfPixelFormat;
|
||||
else if(in->dwFlags & DDSD_ZBUFFERBITDEPTH)
|
||||
{
|
||||
out->dwFlags |= DDSD_PIXELFORMAT;
|
||||
memset(&out->u4.ddpfPixelFormat, 0, sizeof(out->u4.ddpfPixelFormat));
|
||||
out->u4.ddpfPixelFormat.dwSize = sizeof(out->u4.ddpfPixelFormat);
|
||||
out->u4.ddpfPixelFormat.dwFlags = DDPF_ZBUFFER;
|
||||
out->u4.ddpfPixelFormat.u1.dwZBufferBitDepth = in->u2.dwZBufferBitDepth;
|
||||
/* 0 is not a valid DDSURFACEDESC / DDPIXELFORMAT on either side of the
|
||||
* conversion */
|
||||
out->u4.ddpfPixelFormat.u3.dwZBitMask = ~0U >> (32 - in->u2.dwZBufferBitDepth);
|
||||
}
|
||||
/* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
|
||||
out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
|
||||
if (in->dwFlags & DDSD_PITCH) out->u1.lPitch = in->u1.lPitch;
|
||||
if (in->dwFlags & DDSD_BACKBUFFERCOUNT) out->u5.dwBackBufferCount = in->dwBackBufferCount;
|
||||
if (in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth = in->dwAlphaBitDepth;
|
||||
/* DDraw(native, and wine) does not set the DDSD_LPSURFACE, so always copy */
|
||||
out->lpSurface = in->lpSurface;
|
||||
if (in->dwFlags & DDSD_CKDESTOVERLAY) out->u3.ddckCKDestOverlay = in->ddckCKDestOverlay;
|
||||
if (in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt = in->ddckCKDestBlt;
|
||||
if (in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay = in->ddckCKSrcOverlay;
|
||||
if (in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt = in->ddckCKSrcBlt;
|
||||
if (in->dwFlags & DDSD_MIPMAPCOUNT) out->u2.dwMipMapCount = in->u2.dwMipMapCount;
|
||||
if (in->dwFlags & DDSD_REFRESHRATE) out->u2.dwRefreshRate = in->u2.dwRefreshRate;
|
||||
if (in->dwFlags & DDSD_LINEARSIZE) out->u1.dwLinearSize = in->u1.dwLinearSize;
|
||||
/* Does not exist in DDSURFACEDESC:
|
||||
* DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
|
||||
*/
|
||||
}
|
||||
|
||||
/* Note that this function writes the full sizeof(DDSURFACEDESC) size, don't use it
|
||||
* for writing into application-provided DDSURFACEDESC structures if the size may
|
||||
* be different */
|
||||
void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out)
|
||||
{
|
||||
memset(out, 0, sizeof(*out));
|
||||
out->dwSize = sizeof(*out);
|
||||
out->dwFlags = in->dwFlags;
|
||||
if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
|
||||
if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
|
||||
if (in->dwFlags & DDSD_PIXELFORMAT)
|
||||
{
|
||||
out->ddpfPixelFormat = in->u4.ddpfPixelFormat;
|
||||
if ((in->dwFlags & DDSD_CAPS) && (in->ddsCaps.dwCaps & DDSCAPS_ZBUFFER))
|
||||
{
|
||||
/* Z buffers have DDSD_ZBUFFERBITDEPTH set, but not DDSD_PIXELFORMAT. They do
|
||||
* have valid data in ddpfPixelFormat though */
|
||||
out->dwFlags &= ~DDSD_PIXELFORMAT;
|
||||
out->dwFlags |= DDSD_ZBUFFERBITDEPTH;
|
||||
out->u2.dwZBufferBitDepth = in->u4.ddpfPixelFormat.u1.dwZBufferBitDepth;
|
||||
}
|
||||
}
|
||||
/* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
|
||||
out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
|
||||
if (in->dwFlags & DDSD_PITCH) out->u1.lPitch = in->u1.lPitch;
|
||||
if (in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount = in->u5.dwBackBufferCount;
|
||||
if (in->dwFlags & DDSD_ZBUFFERBITDEPTH) out->u2.dwZBufferBitDepth = in->u2.dwMipMapCount; /* same union */
|
||||
if (in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth = in->dwAlphaBitDepth;
|
||||
/* DDraw(native, and wine) does not set the DDSD_LPSURFACE, so always copy */
|
||||
out->lpSurface = in->lpSurface;
|
||||
if (in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay = in->u3.ddckCKDestOverlay;
|
||||
if (in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt = in->ddckCKDestBlt;
|
||||
if (in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay = in->ddckCKSrcOverlay;
|
||||
if (in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt = in->ddckCKSrcBlt;
|
||||
if (in->dwFlags & DDSD_MIPMAPCOUNT) out->u2.dwMipMapCount = in->u2.dwMipMapCount;
|
||||
if (in->dwFlags & DDSD_REFRESHRATE) out->u2.dwRefreshRate = in->u2.dwRefreshRate;
|
||||
if (in->dwFlags & DDSD_LINEARSIZE) out->u1.dwLinearSize = in->u1.dwLinearSize;
|
||||
/* Does not exist in DDSURFACEDESC:
|
||||
* DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
|
||||
*/
|
||||
if (in->dwFlags & DDSD_TEXTURESTAGE) WARN("Does not exist in DDSURFACEDESC: DDSD_TEXTURESTAGE\n");
|
||||
if (in->dwFlags & DDSD_FVF) WARN("Does not exist in DDSURFACEDESC: DDSD_FVF\n");
|
||||
if (in->dwFlags & DDSD_SRCVBHANDLE) WARN("Does not exist in DDSURFACEDESC: DDSD_SRCVBHANDLE\n");
|
||||
out->dwFlags &= ~(DDSD_TEXTURESTAGE | DDSD_FVF | DDSD_SRCVBHANDLE);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,16 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
|
||||
static inline IDirect3DVertexBufferImpl *impl_from_IDirect3DVertexBuffer(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexBufferImpl, IDirect3DVertexBuffer_iface);
|
||||
}
|
||||
|
||||
static inline IDirect3DVertexBufferImpl *impl_from_IDirect3DVertexBuffer7(IDirect3DVertexBuffer7 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown Methods
|
||||
*****************************************************************************/
|
||||
@@ -37,7 +47,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
* For a link to QueryInterface rules, see IDirectDraw7::QueryInterface
|
||||
*
|
||||
* Params
|
||||
* riid: Queryied Interface id
|
||||
* riid: Queried Interface id
|
||||
* obj: Address to return the interface pointer
|
||||
*
|
||||
* Returns:
|
||||
@@ -45,12 +55,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
* E_NOINTERFACE if the interface wasn't found
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface,
|
||||
REFIID riid,
|
||||
void **obj)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface,
|
||||
REFIID riid, void **obj)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj);
|
||||
|
||||
@@ -67,7 +75,7 @@ IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface,
|
||||
if ( IsEqualGUID( &IID_IDirect3DVertexBuffer, riid ) )
|
||||
{
|
||||
IUnknown_AddRef(iface);
|
||||
*obj = &This->IDirect3DVertexBuffer_vtbl;
|
||||
*obj = &This->IDirect3DVertexBuffer_iface;
|
||||
TRACE(" Creating IDirect3DVertexBuffer interface %p\n", *obj);
|
||||
return S_OK;
|
||||
}
|
||||
@@ -85,9 +93,11 @@ IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface,
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_QueryInterface(IDirect3DVertexBuffer *iface,
|
||||
REFIID riid, void **obj)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj);
|
||||
|
||||
return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), riid, obj);
|
||||
return IDirect3DVertexBuffer7_QueryInterface(&This->IDirect3DVertexBuffer7_iface, riid, obj);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -99,10 +109,9 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_QueryInterface(IDirect3DVertex
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface)
|
||||
static ULONG WINAPI IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -112,9 +121,11 @@ IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface)
|
||||
|
||||
static ULONG WINAPI IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)vb_from_vb1(iface));
|
||||
return IDirect3DVertexBuffer7_AddRef(&This->IDirect3DVertexBuffer7_iface);
|
||||
}
|
||||
|
||||
|
||||
@@ -127,10 +138,9 @@ static ULONG WINAPI IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *if
|
||||
* The new refcount
|
||||
*
|
||||
*****************************************************************************/
|
||||
static ULONG WINAPI
|
||||
IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
|
||||
static ULONG WINAPI IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
@@ -140,11 +150,11 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
|
||||
struct wined3d_buffer *curVB = NULL;
|
||||
UINT offset, stride;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
/* D3D7 Vertex buffers don't stay bound in the device, they are passed
|
||||
* as a parameter to drawPrimitiveVB. DrawPrimitiveVB sets them as the
|
||||
* stream source in wined3d, and they should get unset there before
|
||||
* they are destroyed. */
|
||||
wined3d_mutex_lock();
|
||||
wined3d_device_get_stream_source(This->ddraw->wined3d_device,
|
||||
0, &curVB, &offset, &stride);
|
||||
if (curVB == This->wineD3DVertexBuffer)
|
||||
@@ -154,7 +164,8 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
|
||||
|
||||
wined3d_vertex_declaration_decref(This->wineD3DVertexDeclaration);
|
||||
wined3d_buffer_decref(This->wineD3DVertexBuffer);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
|
||||
return 0;
|
||||
@@ -164,9 +175,11 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
|
||||
|
||||
static ULONG WINAPI IDirect3DVertexBufferImpl_1_Release(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)vb_from_vb1(iface));
|
||||
return IDirect3DVertexBuffer7_Release(&This->IDirect3DVertexBuffer7_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -192,13 +205,10 @@ static ULONG WINAPI IDirect3DVertexBufferImpl_1_Release(IDirect3DVertexBuffer *i
|
||||
* D3DERR_VERTEXBUFFEROPTIMIZED if called on an optimized buffer(WineD3D)
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
|
||||
DWORD Flags,
|
||||
void **Data,
|
||||
DWORD *Size)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, DWORD Flags,
|
||||
void **Data, DWORD *Size)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
HRESULT hr;
|
||||
@@ -214,7 +224,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
|
||||
if(Flags & DDLOCK_NOOVERWRITE) wined3d_flags |= WINED3DLOCK_NOOVERWRITE;
|
||||
if(Flags & DDLOCK_DISCARDCONTENTS) wined3d_flags |= WINED3DLOCK_DISCARD;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
if(Size)
|
||||
{
|
||||
/* Get the size, for returning it, and for locking */
|
||||
@@ -224,16 +234,19 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
|
||||
}
|
||||
|
||||
hr = wined3d_buffer_map(This->wineD3DVertexBuffer, 0, 0, (BYTE **)Data, wined3d_flags);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Lock(IDirect3DVertexBuffer *iface, DWORD Flags,
|
||||
void **Data, DWORD *Size)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p, flags %#x, data %p, data_size %p.\n", iface, Flags, Data, Size);
|
||||
|
||||
return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Flags, Data, Size);
|
||||
return IDirect3DVertexBuffer7_Lock(&This->IDirect3DVertexBuffer7_iface, Flags, Data, Size);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -245,25 +258,26 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Lock(IDirect3DVertexBuffer *if
|
||||
* D3D_OK on success
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
wined3d_buffer_unmap(This->wineD3DVertexBuffer);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface));
|
||||
return IDirect3DVertexBuffer7_Unlock(&This->IDirect3DVertexBuffer7_iface);
|
||||
}
|
||||
|
||||
|
||||
@@ -289,24 +303,18 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer *
|
||||
* DDERR_INVALIDPARAMS If D3DVOP_TRANSFORM wasn't passed
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface,
|
||||
DWORD VertexOp,
|
||||
DWORD DestIndex,
|
||||
DWORD Count,
|
||||
IDirect3DVertexBuffer7 *SrcBuffer,
|
||||
DWORD SrcIndex,
|
||||
IDirect3DDevice7 *D3DDevice,
|
||||
DWORD Flags)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface,
|
||||
DWORD VertexOp, DWORD DestIndex, DWORD Count, IDirect3DVertexBuffer7 *SrcBuffer,
|
||||
DWORD SrcIndex, IDirect3DDevice7 *device, DWORD Flags)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *Src = (IDirect3DVertexBufferImpl *)SrcBuffer;
|
||||
IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
IDirect3DVertexBufferImpl *Src = unsafe_impl_from_IDirect3DVertexBuffer7(SrcBuffer);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice7(device);
|
||||
BOOL oldClip, doClip;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n",
|
||||
iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags);
|
||||
iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, device, Flags);
|
||||
|
||||
/* Vertex operations:
|
||||
* D3DVOP_CLIP: Clips vertices outside the viewing frustrum. Needs clipping information
|
||||
@@ -320,41 +328,46 @@ IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface,
|
||||
*/
|
||||
if( !(VertexOp & D3DVOP_TRANSFORM) ) return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
/* WineD3D doesn't know d3d7 vertex operation, it uses
|
||||
* render states instead. Set the render states according to
|
||||
* the vertex ops
|
||||
*/
|
||||
doClip = VertexOp & D3DVOP_CLIP ? TRUE : FALSE;
|
||||
wined3d_device_get_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, (DWORD *)&oldClip);
|
||||
wined3d_device_get_render_state(device_impl->wined3d_device, WINED3D_RS_CLIPPING, (DWORD *)&oldClip);
|
||||
if (doClip != oldClip)
|
||||
wined3d_device_set_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, doClip);
|
||||
wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_CLIPPING, doClip);
|
||||
|
||||
wined3d_device_set_stream_source(D3D->wined3d_device,
|
||||
wined3d_device_set_stream_source(device_impl->wined3d_device,
|
||||
0, Src->wineD3DVertexBuffer, 0, get_flexible_vertex_size(Src->fvf));
|
||||
wined3d_device_set_vertex_declaration(D3D->wined3d_device, Src->wineD3DVertexDeclaration);
|
||||
hr = wined3d_device_process_vertices(D3D->wined3d_device, SrcIndex, DestIndex,
|
||||
wined3d_device_set_vertex_declaration(device_impl->wined3d_device, Src->wineD3DVertexDeclaration);
|
||||
hr = wined3d_device_process_vertices(device_impl->wined3d_device, SrcIndex, DestIndex,
|
||||
Count, This->wineD3DVertexBuffer, NULL, Flags, This->fvf);
|
||||
|
||||
/* Restore the states if needed */
|
||||
if (doClip != oldClip)
|
||||
wined3d_device_set_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, oldClip);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_CLIPPING, oldClip);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_ProcessVertices(IDirect3DVertexBuffer *iface,
|
||||
DWORD VertexOp, DWORD DestIndex, DWORD Count, IDirect3DVertexBuffer *SrcBuffer,
|
||||
DWORD SrcIndex, IDirect3DDevice3 *D3DDevice, DWORD Flags)
|
||||
DWORD SrcIndex, IDirect3DDevice3 *device, DWORD Flags)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *Src = SrcBuffer ? vb_from_vb1(SrcBuffer) : NULL;
|
||||
IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
IDirect3DVertexBufferImpl *Src = unsafe_impl_from_IDirect3DVertexBuffer(SrcBuffer);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice3(device);
|
||||
|
||||
TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n",
|
||||
iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags);
|
||||
iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, device, Flags);
|
||||
|
||||
return IDirect3DVertexBuffer7_ProcessVertices((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), VertexOp,
|
||||
DestIndex, Count, (IDirect3DVertexBuffer7 *)Src, SrcIndex, (IDirect3DDevice7 *)D3D, Flags);
|
||||
return IDirect3DVertexBuffer7_ProcessVertices(&This->IDirect3DVertexBuffer7_iface, VertexOp,
|
||||
DestIndex, Count, &Src->IDirect3DVertexBuffer7_iface, SrcIndex,
|
||||
device_impl ? &device_impl->IDirect3DDevice7_iface : NULL, Flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -370,11 +383,10 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_ProcessVertices(IDirect3DVerte
|
||||
* D3D_OK on success
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface,
|
||||
D3DVERTEXBUFFERDESC *Desc)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface,
|
||||
D3DVERTEXBUFFERDESC *Desc)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
struct wined3d_resource_desc wined3d_desc;
|
||||
struct wined3d_resource *wined3d_resource;
|
||||
|
||||
@@ -382,10 +394,10 @@ IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface,
|
||||
|
||||
if(!Desc) return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
wined3d_resource = wined3d_buffer_get_resource(This->wineD3DVertexBuffer);
|
||||
wined3d_resource_get_desc(wined3d_resource, &wined3d_desc);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
/* Now fill the Desc structure */
|
||||
Desc->dwCaps = This->Caps;
|
||||
@@ -398,9 +410,11 @@ IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface,
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(IDirect3DVertexBuffer *iface,
|
||||
D3DVERTEXBUFFERDESC *Desc)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
|
||||
TRACE("iface %p, desc %p.\n", iface, Desc);
|
||||
|
||||
return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Desc);
|
||||
return IDirect3DVertexBuffer7_GetVertexBufferDesc(&This->IDirect3DVertexBuffer7_iface, Desc);
|
||||
}
|
||||
|
||||
|
||||
@@ -417,12 +431,10 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(IDirect3DV
|
||||
* D3D_OK, because it's a stub
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DVertexBufferImpl_Optimize(IDirect3DVertexBuffer7 *iface,
|
||||
IDirect3DDevice7 *D3DDevice,
|
||||
DWORD Flags)
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_Optimize(IDirect3DVertexBuffer7 *iface,
|
||||
IDirect3DDevice7 *D3DDevice, DWORD Flags)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface);
|
||||
static BOOL hide = FALSE;
|
||||
|
||||
TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags);
|
||||
@@ -436,22 +448,23 @@ IDirect3DVertexBufferImpl_Optimize(IDirect3DVertexBuffer7 *iface,
|
||||
/* We could forward this call to WineD3D and take advantage
|
||||
* of it once we use OpenGL vertex buffers
|
||||
*/
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
This->Caps |= D3DVBCAPS_OPTIMIZED;
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Optimize(IDirect3DVertexBuffer *iface,
|
||||
IDirect3DDevice3 *D3DDevice, DWORD Flags)
|
||||
IDirect3DDevice3 *device, DWORD Flags)
|
||||
{
|
||||
IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL;
|
||||
IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer(iface);
|
||||
IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice3(device);
|
||||
|
||||
TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags);
|
||||
TRACE("iface %p, device %p, flags %#x.\n", iface, device, Flags);
|
||||
|
||||
return IDirect3DVertexBuffer7_Optimize((IDirect3DVertexBuffer7 *)vb_from_vb1(iface),
|
||||
(IDirect3DDevice7 *)D3D, Flags);
|
||||
return IDirect3DVertexBuffer7_Optimize(&This->IDirect3DVertexBuffer7_iface,
|
||||
device_impl ? &device_impl->IDirect3DDevice7_iface : NULL, Flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -526,14 +539,25 @@ static const struct IDirect3DVertexBufferVtbl d3d_vertex_buffer1_vtbl =
|
||||
IDirect3DVertexBufferImpl_1_Optimize
|
||||
};
|
||||
|
||||
HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
|
||||
IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc)
|
||||
HRESULT d3d_vertex_buffer_create(IDirect3DVertexBufferImpl **vertex_buf, IDirectDrawImpl *ddraw,
|
||||
D3DVERTEXBUFFERDESC *desc)
|
||||
{
|
||||
IDirect3DVertexBufferImpl *buffer;
|
||||
DWORD usage;
|
||||
HRESULT hr;
|
||||
HRESULT hr = D3D_OK;
|
||||
|
||||
buffer->lpVtbl = &d3d_vertex_buffer7_vtbl;
|
||||
buffer->IDirect3DVertexBuffer_vtbl = &d3d_vertex_buffer1_vtbl;
|
||||
TRACE("Vertex buffer description:\n");
|
||||
TRACE(" dwSize %u\n", desc->dwSize);
|
||||
TRACE(" dwCaps %#x\n", desc->dwCaps);
|
||||
TRACE(" FVF %#x\n", desc->dwFVF);
|
||||
TRACE(" dwNumVertices %u\n", desc->dwNumVertices);
|
||||
|
||||
buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*buffer));
|
||||
if (!buffer)
|
||||
return DDERR_OUTOFMEMORY;
|
||||
|
||||
buffer->IDirect3DVertexBuffer7_iface.lpVtbl = &d3d_vertex_buffer7_vtbl;
|
||||
buffer->IDirect3DVertexBuffer_iface.lpVtbl = &d3d_vertex_buffer1_vtbl;
|
||||
buffer->ref = 1;
|
||||
|
||||
buffer->ddraw = ddraw;
|
||||
@@ -543,21 +567,18 @@ HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
|
||||
usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0;
|
||||
usage |= WINED3DUSAGE_STATICDECL;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
hr = wined3d_buffer_create_vb(ddraw->wined3d_device,
|
||||
get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices,
|
||||
usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT,
|
||||
usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3D_POOL_SYSTEM_MEM : WINED3D_POOL_DEFAULT,
|
||||
buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
if (hr == WINED3DERR_INVALIDCALL)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
else
|
||||
return hr;
|
||||
hr = DDERR_INVALIDPARAMS;
|
||||
goto end;
|
||||
}
|
||||
|
||||
buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF);
|
||||
@@ -565,13 +586,35 @@ HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
|
||||
{
|
||||
ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF);
|
||||
wined3d_buffer_decref(buffer->wineD3DVertexBuffer);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
return DDERR_INVALIDPARAMS;
|
||||
hr = DDERR_INVALIDPARAMS;
|
||||
goto end;
|
||||
}
|
||||
wined3d_vertex_declaration_incref(buffer->wineD3DVertexDeclaration);
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
end:
|
||||
wined3d_mutex_unlock();
|
||||
if (hr == D3D_OK)
|
||||
*vertex_buf = buffer;
|
||||
else
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
|
||||
return D3D_OK;
|
||||
return hr;
|
||||
}
|
||||
|
||||
IDirect3DVertexBufferImpl *unsafe_impl_from_IDirect3DVertexBuffer(IDirect3DVertexBuffer *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d_vertex_buffer1_vtbl);
|
||||
|
||||
return impl_from_IDirect3DVertexBuffer(iface);
|
||||
}
|
||||
|
||||
IDirect3DVertexBufferImpl *unsafe_impl_from_IDirect3DVertexBuffer7(IDirect3DVertexBuffer7 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &d3d_vertex_buffer7_vtbl);
|
||||
|
||||
return impl_from_IDirect3DVertexBuffer7(iface);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
* Helper functions
|
||||
*****************************************************************************/
|
||||
|
||||
static void update_clip_space(IDirect3DDeviceImpl *device,
|
||||
struct wined3d_vec3 *scale, struct wined3d_vec3 *offset)
|
||||
{
|
||||
D3DMATRIX clip_space =
|
||||
{
|
||||
scale->x, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, scale->y, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, scale->z, 0.0f,
|
||||
offset->x, offset->y, offset->z, 1.0f,
|
||||
};
|
||||
D3DMATRIX projection;
|
||||
HRESULT hr;
|
||||
|
||||
multiply_matrix(&projection, &clip_space, &device->legacy_projection);
|
||||
hr = wined3d_device_set_transform(device->wined3d_device,
|
||||
WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection);
|
||||
if (SUCCEEDED(hr))
|
||||
device->legacy_clipspace = clip_space;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* viewport_activate
|
||||
*
|
||||
@@ -38,6 +58,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||
*****************************************************************************/
|
||||
void viewport_activate(IDirect3DViewportImpl *This, BOOL ignore_lights)
|
||||
{
|
||||
struct wined3d_vec3 scale, offset;
|
||||
D3DVIEWPORT7 vp;
|
||||
|
||||
if (!ignore_lights)
|
||||
@@ -58,8 +79,15 @@ void viewport_activate(IDirect3DViewportImpl *This, BOOL ignore_lights)
|
||||
vp.dwY = This->viewports.vp2.dwY;
|
||||
vp.dwHeight = This->viewports.vp2.dwHeight;
|
||||
vp.dwWidth = This->viewports.vp2.dwWidth;
|
||||
vp.dvMinZ = This->viewports.vp2.dvMinZ;
|
||||
vp.dvMaxZ = This->viewports.vp2.dvMaxZ;
|
||||
vp.dvMinZ = 0.0f;
|
||||
vp.dvMaxZ = 1.0f;
|
||||
|
||||
scale.x = 2.0f / This->viewports.vp2.dvClipWidth;
|
||||
scale.y = 2.0f / This->viewports.vp2.dvClipHeight;
|
||||
scale.z = 1.0f / (This->viewports.vp2.dvMaxZ - This->viewports.vp2.dvMinZ);
|
||||
offset.x = -2.0f * This->viewports.vp2.dvClipX / This->viewports.vp2.dvClipWidth - 1.0f;
|
||||
offset.y = -2.0f * This->viewports.vp2.dvClipY / This->viewports.vp2.dvClipHeight + 1.0f;
|
||||
offset.z = -This->viewports.vp2.dvMinZ / (This->viewports.vp2.dvMaxZ - This->viewports.vp2.dvMinZ);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -67,12 +95,19 @@ void viewport_activate(IDirect3DViewportImpl *This, BOOL ignore_lights)
|
||||
vp.dwY = This->viewports.vp1.dwY;
|
||||
vp.dwHeight = This->viewports.vp1.dwHeight;
|
||||
vp.dwWidth = This->viewports.vp1.dwWidth;
|
||||
vp.dvMinZ = This->viewports.vp1.dvMinZ;
|
||||
vp.dvMaxZ = This->viewports.vp1.dvMaxZ;
|
||||
vp.dvMinZ = 0.0f;
|
||||
vp.dvMaxZ = 1.0f;
|
||||
|
||||
scale.x = 2.0f * This->viewports.vp1.dvScaleX / This->viewports.vp1.dwWidth;
|
||||
scale.y = 2.0f * This->viewports.vp1.dvScaleY / This->viewports.vp1.dwHeight;
|
||||
scale.z = 1.0f;
|
||||
offset.x = 0.0f;
|
||||
offset.y = 0.0f;
|
||||
offset.z = 0.0f;
|
||||
}
|
||||
|
||||
/* And also set the viewport */
|
||||
IDirect3DDevice7_SetViewport((IDirect3DDevice7 *)This->active_device, &vp);
|
||||
update_clip_space(This->active_device, &scale, &offset);
|
||||
IDirect3DDevice7_SetViewport(&This->active_device->IDirect3DDevice7_iface, &vp);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -109,6 +144,11 @@ static void _dump_D3DVIEWPORT2(const D3DVIEWPORT2 *lpvp)
|
||||
lpvp->dvMinZ, lpvp->dvMaxZ);
|
||||
}
|
||||
|
||||
static inline IDirect3DViewportImpl *impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown Methods.
|
||||
*****************************************************************************/
|
||||
@@ -161,7 +201,7 @@ static HRESULT WINAPI IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *i
|
||||
static ULONG WINAPI
|
||||
IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", This, ref);
|
||||
@@ -181,7 +221,7 @@ IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
|
||||
static ULONG WINAPI
|
||||
IDirect3DViewportImpl_Release(IDirect3DViewport3 *iface)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", This, ref);
|
||||
@@ -235,12 +275,13 @@ static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
|
||||
D3DVIEWPORT *lpData)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
dwSize = lpData->dwSize;
|
||||
memset(lpData, 0, dwSize);
|
||||
if (!This->use_vp2)
|
||||
@@ -266,7 +307,8 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
|
||||
TRACE(" returning D3DVIEWPORT :\n");
|
||||
_dump_D3DVIEWPORT(lpData);
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
@@ -288,8 +330,8 @@ static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
|
||||
D3DVIEWPORT *lpData)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
LPDIRECT3DVIEWPORT3 current_viewport;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DViewport3 *current_viewport;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
|
||||
@@ -299,7 +341,8 @@ IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
|
||||
_dump_D3DVIEWPORT(lpData);
|
||||
}
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
This->use_vp2 = 0;
|
||||
memset(&(This->viewports.vp1), 0, sizeof(This->viewports.vp1));
|
||||
memcpy(&(This->viewports.vp1), lpData, lpData->dwSize);
|
||||
@@ -311,15 +354,16 @@ IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
|
||||
This->viewports.vp1.dvMaxZ = 1.0;
|
||||
|
||||
if (This->active_device) {
|
||||
IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl;
|
||||
IDirect3DDevice3 *d3d_device3 = &This->active_device->IDirect3DDevice3_iface;
|
||||
IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport);
|
||||
if (current_viewport)
|
||||
{
|
||||
if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE);
|
||||
if (current_viewport == iface) viewport_activate(This, FALSE);
|
||||
IDirect3DViewport3_Release(current_viewport);
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
@@ -358,8 +402,8 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
|
||||
DWORD dwFlags,
|
||||
DWORD *lpOffScreen)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
D3DMATRIX view_mat, world_mat, proj_mat, mat;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
D3DMATRIX view_mat, world_mat, mat;
|
||||
float *in;
|
||||
float *out;
|
||||
float x, y, z, w;
|
||||
@@ -386,15 +430,13 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
|
||||
}
|
||||
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
wined3d_device_get_transform(This->active_device->wined3d_device,
|
||||
D3DTRANSFORMSTATE_VIEW, (WINED3DMATRIX *)&view_mat);
|
||||
D3DTRANSFORMSTATE_VIEW, (struct wined3d_matrix *)&view_mat);
|
||||
wined3d_device_get_transform(This->active_device->wined3d_device,
|
||||
D3DTRANSFORMSTATE_PROJECTION, (WINED3DMATRIX *)&proj_mat);
|
||||
wined3d_device_get_transform(This->active_device->wined3d_device,
|
||||
WINED3DTS_WORLDMATRIX(0), (WINED3DMATRIX *)&world_mat);
|
||||
multiply_matrix(&mat,&view_mat,&world_mat);
|
||||
multiply_matrix(&mat,&proj_mat,&mat);
|
||||
WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)&world_mat);
|
||||
multiply_matrix(&mat, &view_mat, &world_mat);
|
||||
multiply_matrix(&mat, &This->active_device->legacy_projection, &mat);
|
||||
|
||||
in = lpData->lpIn;
|
||||
out = lpData->lpOut;
|
||||
@@ -471,7 +513,7 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
|
||||
{
|
||||
*lpOffScreen = 0;
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
TRACE("All done\n");
|
||||
return DD_OK;
|
||||
@@ -515,18 +557,18 @@ static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
|
||||
D3DMATERIALHANDLE hMat)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DMaterialImpl *m;
|
||||
|
||||
TRACE("iface %p, material %#x.\n", iface, hMat);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
if (!hMat)
|
||||
{
|
||||
This->background = NULL;
|
||||
TRACE("Setting background to NULL\n");
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -534,7 +576,7 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
|
||||
if (!m)
|
||||
{
|
||||
WARN("Invalid material handle.\n");
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
@@ -543,7 +585,8 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
|
||||
m->mat.u.diffuse.u3.b, m->mat.u.diffuse.u4.a);
|
||||
This->background = m;
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -565,11 +608,11 @@ IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface,
|
||||
D3DMATERIALHANDLE *lphMat,
|
||||
BOOL *lpValid)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
|
||||
TRACE("iface %p, material %p, valid %p.\n", iface, lphMat, lpValid);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
if(lpValid)
|
||||
{
|
||||
*lpValid = This->background != NULL;
|
||||
@@ -585,7 +628,7 @@ IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface,
|
||||
*lphMat = 0;
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
@@ -655,10 +698,10 @@ IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface,
|
||||
static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
|
||||
DWORD dwCount, D3DRECT *lpRects, DWORD dwFlags)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
DWORD color = 0x00000000;
|
||||
HRESULT hr;
|
||||
LPDIRECT3DVIEWPORT3 current_viewport;
|
||||
IDirect3DViewport3 *current_viewport;
|
||||
IDirect3DDevice3 *d3d_device3;
|
||||
|
||||
TRACE("iface %p, rect_count %u, rects %p, flags %#x.\n", iface, dwCount, lpRects, dwFlags);
|
||||
@@ -667,9 +710,10 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
|
||||
ERR(" Trying to clear a viewport not attached to a device !\n");
|
||||
return D3DERR_VIEWPORTHASNODEVICE;
|
||||
}
|
||||
d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl;
|
||||
d3d_device3 = &This->active_device->IDirect3DDevice3_iface;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
if (dwFlags & D3DCLEAR_TARGET) {
|
||||
if (This->background == NULL) {
|
||||
ERR(" Trying to clear the color buffer without background material !\n");
|
||||
@@ -687,17 +731,18 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
|
||||
afterwards. */
|
||||
viewport_activate(This, TRUE);
|
||||
|
||||
hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device, dwCount, lpRects,
|
||||
hr = IDirect3DDevice7_Clear(&This->active_device->IDirect3DDevice7_iface, dwCount, lpRects,
|
||||
dwFlags & (D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET), color, 1.0, 0x00000000);
|
||||
|
||||
IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport);
|
||||
if(current_viewport) {
|
||||
IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport;
|
||||
IDirect3DViewportImpl *vp = impl_from_IDirect3DViewport3(current_viewport);
|
||||
viewport_activate(vp, TRUE);
|
||||
IDirect3DViewport3_Release(current_viewport);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -715,21 +760,21 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
|
||||
* DDERR_INVALIDPARAMS if there are 8 lights or more
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight)
|
||||
static HRESULT WINAPI IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DLightImpl *lpDirect3DLightImpl = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
|
||||
DWORD i = 0;
|
||||
DWORD map = This->map_lights;
|
||||
|
||||
TRACE("iface %p, light %p.\n", iface, lpDirect3DLight);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
if (This->num_lights >= 8)
|
||||
{
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
@@ -754,7 +799,8 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
|
||||
if (This->active_device)
|
||||
light_activate(lpDirect3DLightImpl);
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -771,21 +817,20 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
|
||||
* DDERR_INVALIDPARAMS if the light wasn't found
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight)
|
||||
static HRESULT WINAPI IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DLightImpl *l = (IDirect3DLightImpl *)lpDirect3DLight;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DLightImpl *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
|
||||
|
||||
TRACE("iface %p, light %p.\n", iface, lpDirect3DLight);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
if (l->active_viewport != This)
|
||||
{
|
||||
WARN("Light %p active viewport is %p.\n", l, l->active_viewport);
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
@@ -796,7 +841,7 @@ IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
|
||||
--This->num_lights;
|
||||
This->map_lights &= ~(1 << l->dwLightIndex);
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
@@ -814,14 +859,11 @@ IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
|
||||
* D3D_OK, because it's a stub
|
||||
*
|
||||
*****************************************************************************/
|
||||
static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight,
|
||||
IDirect3DLight **lplpDirect3DLight,
|
||||
DWORD dwFlags)
|
||||
static HRESULT WINAPI IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
|
||||
IDirect3DLight *lpDirect3DLight, IDirect3DLight **lplpDirect3DLight, DWORD dwFlags)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DLightImpl *l = (IDirect3DLightImpl *)lpDirect3DLight;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DLightImpl *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
|
||||
struct list *entry;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -831,7 +873,7 @@ IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
|
||||
if (!lplpDirect3DLight)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
switch (dwFlags)
|
||||
{
|
||||
@@ -872,7 +914,7 @@ IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
|
||||
hr = DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -901,12 +943,12 @@ static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
|
||||
D3DVIEWPORT2 *lpData)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
dwSize = lpData->dwSize;
|
||||
memset(lpData, 0, dwSize);
|
||||
if (This->use_vp2)
|
||||
@@ -933,7 +975,8 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
|
||||
_dump_D3DVIEWPORT2(lpData);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
@@ -953,8 +996,8 @@ static HRESULT WINAPI
|
||||
IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface,
|
||||
D3DVIEWPORT2 *lpData)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
LPDIRECT3DVIEWPORT3 current_viewport;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
IDirect3DViewport3 *current_viewport;
|
||||
|
||||
TRACE("iface %p, data %p.\n", iface, lpData);
|
||||
|
||||
@@ -964,21 +1007,23 @@ IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface,
|
||||
_dump_D3DVIEWPORT2(lpData);
|
||||
}
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
This->use_vp2 = 1;
|
||||
memset(&(This->viewports.vp2), 0, sizeof(This->viewports.vp2));
|
||||
memcpy(&(This->viewports.vp2), lpData, lpData->dwSize);
|
||||
|
||||
if (This->active_device) {
|
||||
IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl;
|
||||
IDirect3DDevice3 *d3d_device3 = &This->active_device->IDirect3DDevice3_iface;
|
||||
IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport);
|
||||
if (current_viewport)
|
||||
{
|
||||
if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE);
|
||||
if (current_viewport == iface) viewport_activate(This, FALSE);
|
||||
IDirect3DViewport3_Release(current_viewport);
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
@@ -1056,34 +1101,37 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
|
||||
D3DVALUE dvZ,
|
||||
DWORD dwStencil)
|
||||
{
|
||||
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
|
||||
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface);
|
||||
HRESULT hr;
|
||||
LPDIRECT3DVIEWPORT3 current_viewport;
|
||||
IDirect3DViewport3 *current_viewport;
|
||||
IDirect3DDevice3 *d3d_device3;
|
||||
|
||||
TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n",
|
||||
iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
|
||||
|
||||
EnterCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_lock();
|
||||
|
||||
if (This->active_device == NULL) {
|
||||
ERR(" Trying to clear a viewport not attached to a device !\n");
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
wined3d_mutex_unlock();
|
||||
return D3DERR_VIEWPORTHASNODEVICE;
|
||||
}
|
||||
d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl;
|
||||
d3d_device3 = &This->active_device->IDirect3DDevice3_iface;
|
||||
/* Need to temporarily activate viewport to clear it. Previously active
|
||||
* one will be restored afterwards. */
|
||||
viewport_activate(This, TRUE);
|
||||
|
||||
hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device,
|
||||
hr = IDirect3DDevice7_Clear(&This->active_device->IDirect3DDevice7_iface,
|
||||
dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
|
||||
IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport);
|
||||
if(current_viewport) {
|
||||
IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport;
|
||||
IDirect3DViewportImpl *vp = impl_from_IDirect3DViewport3(current_viewport);
|
||||
viewport_activate(vp, TRUE);
|
||||
IDirect3DViewport3_Release(current_viewport);
|
||||
}
|
||||
LeaveCriticalSection(&ddraw_cs);
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -1120,9 +1168,32 @@ static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl =
|
||||
IDirect3DViewportImpl_Clear2,
|
||||
};
|
||||
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface)
|
||||
{
|
||||
if (!iface) return NULL;
|
||||
assert(iface->lpVtbl == &d3d_viewport_vtbl);
|
||||
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface);
|
||||
}
|
||||
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface)
|
||||
{
|
||||
/* IDirect3DViewport and IDirect3DViewport3 use the same iface. */
|
||||
if (!iface) return NULL;
|
||||
assert(iface->lpVtbl == (IDirect3DViewport2Vtbl *)&d3d_viewport_vtbl);
|
||||
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface);
|
||||
}
|
||||
|
||||
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface)
|
||||
{
|
||||
/* IDirect3DViewport and IDirect3DViewport3 use the same iface. */
|
||||
if (!iface) return NULL;
|
||||
assert(iface->lpVtbl == (IDirect3DViewportVtbl *)&d3d_viewport_vtbl);
|
||||
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface);
|
||||
}
|
||||
|
||||
void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw)
|
||||
{
|
||||
viewport->lpVtbl = &d3d_viewport_vtbl;
|
||||
viewport->IDirect3DViewport3_iface.lpVtbl = &d3d_viewport_vtbl;
|
||||
viewport->ref = 1;
|
||||
viewport->ddraw = ddraw;
|
||||
viewport->use_vp2 = 0xff;
|
||||
|
||||
@@ -19,7 +19,6 @@ list(APPEND SOURCE
|
||||
ati_fragment_shader.c
|
||||
arb_program_shader.c
|
||||
buffer.c
|
||||
clipper.c
|
||||
context.c
|
||||
device.c
|
||||
directx.c
|
||||
@@ -53,7 +52,7 @@ list(APPEND SOURCE
|
||||
endif()
|
||||
|
||||
add_library(wined3d SHARED ${SOURCE})
|
||||
set_module_type(wined3d win32dll)
|
||||
set_module_type(wined3d win32dll ENTRYPOINT 0)
|
||||
|
||||
target_link_libraries(wined3d wine)
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -321,10 +321,10 @@ static GLuint find_tmpreg(const struct texture_stage_op op[MAX_TEXTURES])
|
||||
BOOL tex_used[MAX_TEXTURES];
|
||||
|
||||
memset(tex_used, 0, sizeof(tex_used));
|
||||
for(i = 0; i < MAX_TEXTURES; i++) {
|
||||
if(op[i].cop == WINED3DTOP_DISABLE) {
|
||||
for (i = 0; i < MAX_TEXTURES; ++i)
|
||||
{
|
||||
if (op[i].cop == WINED3D_TOP_DISABLE)
|
||||
break;
|
||||
}
|
||||
|
||||
if(lowest_read == -1 &&
|
||||
(op[i].carg1 == WINED3DTA_TEMP || op[i].carg2 == WINED3DTA_TEMP || op[i].carg0 == WINED3DTA_TEMP ||
|
||||
@@ -399,9 +399,11 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
/* Pass 1: Generate sampling instructions for perturbation maps */
|
||||
for (stage = 0; stage < gl_info->limits.textures; ++stage)
|
||||
{
|
||||
if(op[stage].cop == WINED3DTOP_DISABLE) break;
|
||||
if(op[stage].cop != WINED3DTOP_BUMPENVMAP &&
|
||||
op[stage].cop != WINED3DTOP_BUMPENVMAPLUMINANCE) continue;
|
||||
if (op[stage].cop == WINED3D_TOP_DISABLE)
|
||||
break;
|
||||
if (op[stage].cop != WINED3D_TOP_BUMPENVMAP
|
||||
&& op[stage].cop != WINED3D_TOP_BUMPENVMAP_LUMINANCE)
|
||||
continue;
|
||||
|
||||
TRACE("glSampleMapATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, GL_SWIZZLE_STR_ATI)\n",
|
||||
stage, stage);
|
||||
@@ -428,9 +430,11 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
GLuint argmodextra_x, argmodextra_y;
|
||||
struct color_fixup_desc fixup;
|
||||
|
||||
if(op[stage].cop == WINED3DTOP_DISABLE) break;
|
||||
if(op[stage].cop != WINED3DTOP_BUMPENVMAP &&
|
||||
op[stage].cop != WINED3DTOP_BUMPENVMAPLUMINANCE) continue;
|
||||
if (op[stage].cop == WINED3D_TOP_DISABLE)
|
||||
break;
|
||||
if (op[stage].cop != WINED3D_TOP_BUMPENVMAP
|
||||
&& op[stage].cop != WINED3D_TOP_BUMPENVMAP_LUMINANCE)
|
||||
continue;
|
||||
|
||||
fixup = op[stage].color_fixup;
|
||||
if (fixup.x_source != CHANNEL_SOURCE_X || fixup.y_source != CHANNEL_SOURCE_Y)
|
||||
@@ -474,9 +478,8 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
/* Pass 3: Generate sampling instructions for regular textures */
|
||||
for (stage = 0; stage < gl_info->limits.textures; ++stage)
|
||||
{
|
||||
if(op[stage].cop == WINED3DTOP_DISABLE) {
|
||||
if (op[stage].cop == WINED3D_TOP_DISABLE)
|
||||
break;
|
||||
}
|
||||
|
||||
if(op[stage].projected == proj_none) {
|
||||
swizzle = GL_SWIZZLE_STR_ATI;
|
||||
@@ -486,17 +489,18 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
swizzle = GL_SWIZZLE_STQ_DQ_ATI;
|
||||
}
|
||||
|
||||
if((op[stage].carg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
(op[stage].carg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
(op[stage].carg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
(op[stage].aarg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
(op[stage].aarg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
(op[stage].aarg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE ||
|
||||
op[stage].cop == WINED3DTOP_BLENDTEXTUREALPHA) {
|
||||
|
||||
if(stage > 0 &&
|
||||
(op[stage - 1].cop == WINED3DTOP_BUMPENVMAP ||
|
||||
op[stage - 1].cop == WINED3DTOP_BUMPENVMAPLUMINANCE)) {
|
||||
if ((op[stage].carg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| (op[stage].carg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| (op[stage].carg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| (op[stage].aarg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| (op[stage].aarg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| (op[stage].aarg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
|
||||
|| op[stage].cop == WINED3D_TOP_BLEND_TEXTURE_ALPHA)
|
||||
{
|
||||
if (stage > 0
|
||||
&& (op[stage - 1].cop == WINED3D_TOP_BUMPENVMAP
|
||||
|| op[stage - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE))
|
||||
{
|
||||
TRACE("glSampleMapATI(GL_REG_%d_ATI, GL_REG_%d_ATI, GL_SWIZZLE_STR_ATI)\n",
|
||||
stage, stage);
|
||||
GL_EXTCALL(glSampleMapATI(GL_REG_0_ATI + stage,
|
||||
@@ -515,7 +519,7 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
/* Pass 4: Generate the arithmetic instructions */
|
||||
for (stage = 0; stage < MAX_TEXTURES; ++stage)
|
||||
{
|
||||
if (op[stage].cop == WINED3DTOP_DISABLE)
|
||||
if (op[stage].cop == WINED3D_TOP_DISABLE)
|
||||
{
|
||||
if (!stage)
|
||||
{
|
||||
@@ -546,46 +550,52 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
argmodextra = GL_NONE;
|
||||
extrarg = GL_NONE;
|
||||
|
||||
switch(op[stage].cop) {
|
||||
case WINED3DTOP_SELECTARG2:
|
||||
switch (op[stage].cop)
|
||||
{
|
||||
case WINED3D_TOP_SELECT_ARG2:
|
||||
arg1 = arg2;
|
||||
argmod1 = argmod2;
|
||||
rep1 = rep2;
|
||||
case WINED3DTOP_SELECTARG1:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_SELECT_ARG1:
|
||||
wrap_op1(gl_info, GL_MOV_ATI, dstreg, GL_NONE, GL_NONE,
|
||||
arg1, rep1, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATE4X:
|
||||
case WINED3D_TOP_MODULATE_4X:
|
||||
if(dstmod == GL_NONE) dstmod = GL_4X_BIT_ATI;
|
||||
case WINED3DTOP_MODULATE2X:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE_2X:
|
||||
if(dstmod == GL_NONE) dstmod = GL_2X_BIT_ATI;
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
case WINED3DTOP_MODULATE:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE:
|
||||
wrap_op2(gl_info, GL_MUL_ATI, dstreg, GL_NONE, dstmod,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADDSIGNED2X:
|
||||
case WINED3D_TOP_ADD_SIGNED_2X:
|
||||
dstmod = GL_2X_BIT_ATI;
|
||||
case WINED3DTOP_ADDSIGNED:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_ADD_SIGNED:
|
||||
argmodextra = GL_BIAS_BIT_ATI;
|
||||
case WINED3DTOP_ADD:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_ADD:
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
wrap_op2(gl_info, GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, dstmod,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmodextra | argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_SUBTRACT:
|
||||
case WINED3D_TOP_SUBTRACT:
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
wrap_op2(gl_info, GL_SUB_ATI, dstreg, GL_NONE, dstmod,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADDSMOOTH:
|
||||
case WINED3D_TOP_ADD_SMOOTH:
|
||||
argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;
|
||||
/* Dst = arg1 + * arg2(1 -arg 1)
|
||||
* = arg2 * (1 - arg1) + arg1
|
||||
@@ -596,21 +606,28 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
arg1, rep1, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BLENDCURRENTALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDFACTORALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDTEXTUREALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDDIFFUSEALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3D_TOP_BLEND_CURRENT_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_FACTOR_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_DIFFUSE_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL, NULL, -1);
|
||||
wrap_op3(gl_info, GL_LERP_ATI, dstreg, GL_NONE, GL_NONE,
|
||||
extrarg, GL_ALPHA, GL_NONE,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BLENDTEXTUREALPHAPM:
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM:
|
||||
arg0 = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_NONE, GL_NONE,
|
||||
arg2, rep2, argmod2,
|
||||
@@ -620,48 +637,52 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
|
||||
/* D3DTOP_PREMODULATE ???? */
|
||||
|
||||
case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
|
||||
case WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR:
|
||||
argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;
|
||||
case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
|
||||
if(!argmodextra) argmodextra = argmod1;
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR:
|
||||
if (!argmodextra)
|
||||
argmodextra = argmod1;
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_NONE, GL_SATURATE_BIT_ATI,
|
||||
arg2, rep2, argmod2,
|
||||
arg1, GL_ALPHA, argmodextra,
|
||||
arg1, rep1, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
|
||||
case WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA:
|
||||
argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;
|
||||
case WINED3DTOP_MODULATECOLOR_ADDALPHA:
|
||||
if(!argmodextra) argmodextra = argmod1;
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA:
|
||||
if (!argmodextra)
|
||||
argmodextra = argmod1;
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_NONE, GL_SATURATE_BIT_ATI,
|
||||
arg2, rep2, argmod2,
|
||||
arg1, rep1, argmodextra,
|
||||
arg1, GL_ALPHA, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_DOTPRODUCT3:
|
||||
case WINED3D_TOP_DOTPRODUCT3:
|
||||
wrap_op2(gl_info, GL_DOT3_ATI, dstreg, GL_NONE, GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI,
|
||||
arg1, rep1, argmod1 | GL_BIAS_BIT_ATI,
|
||||
arg2, rep2, argmod2 | GL_BIAS_BIT_ATI);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MULTIPLYADD:
|
||||
case WINED3D_TOP_MULTIPLY_ADD:
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_NONE, GL_SATURATE_BIT_ATI,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmod2,
|
||||
arg0, rep0, argmod0);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_LERP:
|
||||
case WINED3D_TOP_LERP:
|
||||
wrap_op3(gl_info, GL_LERP_ATI, dstreg, GL_NONE, GL_NONE,
|
||||
arg0, rep0, argmod0,
|
||||
arg1, rep1, argmod1,
|
||||
arg2, rep2, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BUMPENVMAP:
|
||||
case WINED3DTOP_BUMPENVMAPLUMINANCE:
|
||||
case WINED3D_TOP_BUMPENVMAP:
|
||||
case WINED3D_TOP_BUMPENVMAP_LUMINANCE:
|
||||
/* Those are handled in the first pass of the shader(generation pass 1 and 2) already */
|
||||
break;
|
||||
|
||||
@@ -675,8 +696,9 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
argmodextra = GL_NONE;
|
||||
extrarg = GL_NONE;
|
||||
|
||||
switch(op[stage].aop) {
|
||||
case WINED3DTOP_DISABLE:
|
||||
switch (op[stage].aop)
|
||||
{
|
||||
case WINED3D_TOP_DISABLE:
|
||||
/* Get the primary color to the output if on stage 0, otherwise leave register 0 untouched */
|
||||
if (!stage)
|
||||
{
|
||||
@@ -685,44 +707,51 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
}
|
||||
break;
|
||||
|
||||
case WINED3DTOP_SELECTARG2:
|
||||
case WINED3D_TOP_SELECT_ARG2:
|
||||
arg1 = arg2;
|
||||
argmod1 = argmod2;
|
||||
case WINED3DTOP_SELECTARG1:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_SELECT_ARG1:
|
||||
wrap_op1(gl_info, GL_MOV_ATI, dstreg, GL_ALPHA, GL_NONE,
|
||||
arg1, GL_NONE, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATE4X:
|
||||
if(dstmod == GL_NONE) dstmod = GL_4X_BIT_ATI;
|
||||
case WINED3DTOP_MODULATE2X:
|
||||
if(dstmod == GL_NONE) dstmod = GL_2X_BIT_ATI;
|
||||
case WINED3D_TOP_MODULATE_4X:
|
||||
if (dstmod == GL_NONE)
|
||||
dstmod = GL_4X_BIT_ATI;
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE_2X:
|
||||
if (dstmod == GL_NONE)
|
||||
dstmod = GL_2X_BIT_ATI;
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
case WINED3DTOP_MODULATE:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_MODULATE:
|
||||
wrap_op2(gl_info, GL_MUL_ATI, dstreg, GL_ALPHA, dstmod,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADDSIGNED2X:
|
||||
case WINED3D_TOP_ADD_SIGNED_2X:
|
||||
dstmod = GL_2X_BIT_ATI;
|
||||
case WINED3DTOP_ADDSIGNED:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_ADD_SIGNED:
|
||||
argmodextra = GL_BIAS_BIT_ATI;
|
||||
case WINED3DTOP_ADD:
|
||||
/* fall through */
|
||||
case WINED3D_TOP_ADD:
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
wrap_op2(gl_info, GL_ADD_ATI, dstreg, GL_ALPHA, dstmod,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmodextra | argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_SUBTRACT:
|
||||
case WINED3D_TOP_SUBTRACT:
|
||||
dstmod |= GL_SATURATE_BIT_ATI;
|
||||
wrap_op2(gl_info, GL_SUB_ATI, dstreg, GL_ALPHA, dstmod,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADDSMOOTH:
|
||||
case WINED3D_TOP_ADD_SMOOTH:
|
||||
argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI;
|
||||
/* Dst = arg1 + * arg2(1 -arg 1)
|
||||
* = arg2 * (1 - arg1) + arg1
|
||||
@@ -733,21 +762,28 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
arg1, GL_NONE, argmod1);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BLENDCURRENTALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDFACTORALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDTEXTUREALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3DTOP_BLENDDIFFUSEALPHA:
|
||||
if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL, NULL, -1);
|
||||
case WINED3D_TOP_BLEND_CURRENT_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_FACTOR_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
/* fall through */
|
||||
case WINED3D_TOP_BLEND_DIFFUSE_ALPHA:
|
||||
if (extrarg == GL_NONE)
|
||||
extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL, NULL, -1);
|
||||
wrap_op3(gl_info, GL_LERP_ATI, dstreg, GL_ALPHA, GL_NONE,
|
||||
extrarg, GL_ALPHA, GL_NONE,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmod2);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BLENDTEXTUREALPHAPM:
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM:
|
||||
arg0 = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL, NULL, -1);
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_ALPHA, GL_NONE,
|
||||
arg2, GL_NONE, argmod2,
|
||||
@@ -757,32 +793,32 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
|
||||
/* D3DTOP_PREMODULATE ???? */
|
||||
|
||||
case WINED3DTOP_DOTPRODUCT3:
|
||||
case WINED3D_TOP_DOTPRODUCT3:
|
||||
wrap_op2(gl_info, GL_DOT3_ATI, dstreg, GL_ALPHA, GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI,
|
||||
arg1, GL_NONE, argmod1 | GL_BIAS_BIT_ATI,
|
||||
arg2, GL_NONE, argmod2 | GL_BIAS_BIT_ATI);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MULTIPLYADD:
|
||||
case WINED3D_TOP_MULTIPLY_ADD:
|
||||
wrap_op3(gl_info, GL_MAD_ATI, dstreg, GL_ALPHA, GL_SATURATE_BIT_ATI,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmod2,
|
||||
arg0, GL_NONE, argmod0);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_LERP:
|
||||
case WINED3D_TOP_LERP:
|
||||
wrap_op3(gl_info, GL_LERP_ATI, dstreg, GL_ALPHA, GL_SATURATE_BIT_ATI,
|
||||
arg1, GL_NONE, argmod1,
|
||||
arg2, GL_NONE, argmod2,
|
||||
arg0, GL_NONE, argmod0);
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
|
||||
case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
|
||||
case WINED3DTOP_MODULATECOLOR_ADDALPHA:
|
||||
case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
|
||||
case WINED3DTOP_BUMPENVMAP:
|
||||
case WINED3DTOP_BUMPENVMAPLUMINANCE:
|
||||
case WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR:
|
||||
case WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR:
|
||||
case WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA:
|
||||
case WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA:
|
||||
case WINED3D_TOP_BUMPENVMAP:
|
||||
case WINED3D_TOP_BUMPENVMAP_LUMINANCE:
|
||||
ERR("Application uses an invalid alpha operation\n");
|
||||
break;
|
||||
|
||||
@@ -796,17 +832,17 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void set_tex_op_atifs(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void set_tex_op_atifs(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
const struct wined3d_device *device = context->swapchain->device;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
struct wined3d_device *device = stateblock->device;
|
||||
const struct atifs_ffp_desc *desc;
|
||||
struct ffp_frag_settings settings;
|
||||
struct atifs_private_data *priv = device->fragment_priv;
|
||||
DWORD mapped_stage;
|
||||
unsigned int i;
|
||||
|
||||
gen_ffp_frag_op(stateblock, &settings, TRUE);
|
||||
gen_ffp_frag_op(device, state, &settings, TRUE);
|
||||
desc = (const struct atifs_ffp_desc *)find_ffp_frag_shader(&priv->fragment_shaders, &settings);
|
||||
if(!desc) {
|
||||
struct atifs_ffp_desc *new_desc = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_desc));
|
||||
@@ -818,7 +854,8 @@ static void set_tex_op_atifs(DWORD state, struct wined3d_stateblock *stateblock,
|
||||
new_desc->num_textures_used = 0;
|
||||
for (i = 0; i < gl_info->limits.texture_stages; ++i)
|
||||
{
|
||||
if(settings.op[i].cop == WINED3DTOP_DISABLE) break;
|
||||
if (settings.op[i].cop == WINED3D_TOP_DISABLE)
|
||||
break;
|
||||
new_desc->num_textures_used = i;
|
||||
}
|
||||
|
||||
@@ -837,35 +874,34 @@ static void set_tex_op_atifs(DWORD state, struct wined3d_stateblock *stateblock,
|
||||
mapped_stage = device->texUnitMap[i];
|
||||
if (mapped_stage != WINED3D_UNMAPPED_STAGE)
|
||||
{
|
||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
||||
checkGLcall("glActiveTextureARB");
|
||||
texture_activate_dimensions(stateblock->state.textures[i], gl_info);
|
||||
context_active_texture(context, gl_info, mapped_stage);
|
||||
texture_activate_dimensions(state->textures[i], gl_info);
|
||||
}
|
||||
}
|
||||
|
||||
GL_EXTCALL(glBindFragmentShaderATI(desc->shader));
|
||||
}
|
||||
|
||||
static void state_texfactor_atifs(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void state_texfactor_atifs(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
float col[4];
|
||||
D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col);
|
||||
|
||||
D3DCOLORTOGLFLOAT4(state->render_states[WINED3D_RS_TEXTUREFACTOR], col);
|
||||
GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col));
|
||||
checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)");
|
||||
}
|
||||
|
||||
static void set_bumpmat(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void set_bumpmat(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||
DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
float mat[2][2];
|
||||
|
||||
mat[0][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT00]);
|
||||
mat[1][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT01]);
|
||||
mat[0][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT10]);
|
||||
mat[1][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT11]);
|
||||
mat[0][0] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT00]);
|
||||
mat[1][0] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT01]);
|
||||
mat[0][1] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT10]);
|
||||
mat[1][1] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT11]);
|
||||
/* GL_ATI_fragment_shader allows only constants from 0.0 to 1.0, but the bumpmat
|
||||
* constants can be in any range. While they should stay between [-1.0 and 1.0] because
|
||||
* Shader Model 1.x pixel shaders are clamped to that range negative values are used occasionally,
|
||||
@@ -881,159 +917,160 @@ static void set_bumpmat(DWORD state, struct wined3d_stateblock *stateblock, stru
|
||||
checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), mat)");
|
||||
}
|
||||
|
||||
static void textransform(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void textransform(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
if (!isStateDirty(context, STATE_PIXELSHADER))
|
||||
set_tex_op_atifs(state, stateblock, context);
|
||||
set_tex_op_atifs(context, state, state_id);
|
||||
}
|
||||
|
||||
static void atifs_apply_pixelshader(DWORD state_id,
|
||||
struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void atifs_apply_pixelshader(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
const struct wined3d_state *state = &stateblock->state;
|
||||
struct wined3d_device *device = stateblock->device;
|
||||
const struct wined3d_device *device = context->swapchain->device;
|
||||
BOOL use_vshader = use_vs(state);
|
||||
|
||||
context->last_was_pshader = use_ps(state);
|
||||
/* The ATIFS code does not support pixel shaders currently, but we have to provide a state handler
|
||||
* to call shader_select to select a vertex shader if one is applied because the vertex shader state
|
||||
* may defer calling the shader backend if the pshader state is dirty.
|
||||
/* The ATIFS code does not support pixel shaders currently, but we have to
|
||||
* provide a state handler to call shader_select to select a vertex shader
|
||||
* if one is applied because the vertex shader state may defer calling the
|
||||
* shader backend if the pshader state is dirty.
|
||||
*
|
||||
* In theory the application should not be able to mark the pixel shader dirty because it cannot
|
||||
* create a shader, and thus has no way to set the state to something != NULL. However, a different
|
||||
* pipeline part may link a different state to its pixelshader handler, thus a pshader state exists
|
||||
* and can be dirtified. Also the pshader is always dirtified at startup, and blitting disables all
|
||||
* shaders and dirtifies all shader states. If atifs can deal with this it keeps the rest of the code
|
||||
* simpler.
|
||||
*/
|
||||
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
|
||||
* In theory the application should not be able to mark the pixel shader
|
||||
* dirty because it cannot create a shader, and thus has no way to set the
|
||||
* state to something != NULL. However, a different pipeline part may link
|
||||
* a different state to its pixelshader handler, thus a pshader state
|
||||
* exists and can be dirtified. Also the pshader is always dirtified at
|
||||
* startup, and blitting disables all shaders and dirtifies all shader
|
||||
* states. If atifs can deal with this it keeps the rest of the code
|
||||
* simpler. */
|
||||
if (!isStateDirty(context, context->state_table[STATE_VSHADER].representative))
|
||||
{
|
||||
device->shader_backend->shader_select(context, FALSE, use_vshader);
|
||||
|
||||
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader)
|
||||
stateblock_apply_state(STATE_VERTEXSHADERCONSTANT, stateblock, context);
|
||||
context_apply_state(context, state, STATE_VERTEXSHADERCONSTANT);
|
||||
}
|
||||
}
|
||||
|
||||
static void atifs_srgbwriteenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void atifs_srgbwriteenable(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
if (stateblock->state.render_states[WINED3DRS_SRGBWRITEENABLE])
|
||||
if (state->render_states[WINED3D_RS_SRGBWRITEENABLE])
|
||||
WARN("sRGB writes are not supported by this fragment pipe.\n");
|
||||
}
|
||||
|
||||
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
|
||||
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), atifs_srgbwriteenable }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), { STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), state_texfactor_atifs }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGCOLOR), { STATE_RENDER(WINED3D_RS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGDENSITY), { STATE_RENDER(WINED3D_RS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGENABLE), { STATE_RENDER(WINED3D_RS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGTABLEMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGSTART), { STATE_RENDER(WINED3D_RS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_FOGEND), { STATE_RENDER(WINED3D_RS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), { STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), atifs_srgbwriteenable }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
@@ -1042,14 +1079,14 @@ static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
|
||||
{ STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(0,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(1,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(2,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(3,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(3, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(4,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(4, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(5,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(6,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_TEXTURESTAGE(7,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), textransform }, WINED3D_GL_EXT_NONE },
|
||||
{STATE_PIXELSHADER, { STATE_PIXELSHADER, atifs_apply_pixelshader }, WINED3D_GL_EXT_NONE },
|
||||
{0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
|
||||
};
|
||||
|
||||
@@ -76,21 +76,19 @@ static inline void buffer_clear_dirty_areas(struct wined3d_buffer *This)
|
||||
This->modified_areas = 0;
|
||||
}
|
||||
|
||||
static inline BOOL buffer_is_dirty(struct wined3d_buffer *This)
|
||||
static BOOL buffer_is_dirty(const struct wined3d_buffer *buffer)
|
||||
{
|
||||
return !!This->modified_areas;
|
||||
return !!buffer->modified_areas;
|
||||
}
|
||||
|
||||
static inline BOOL buffer_is_fully_dirty(struct wined3d_buffer *This)
|
||||
static BOOL buffer_is_fully_dirty(const struct wined3d_buffer *buffer)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for(i = 0; i < This->modified_areas; i++)
|
||||
for (i = 0; i < buffer->modified_areas; ++i)
|
||||
{
|
||||
if (!This->maps[i].offset && This->maps[i].size == This->resource.size)
|
||||
{
|
||||
if (!buffer->maps[i].offset && buffer->maps[i].size == buffer->resource.size)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -119,7 +117,7 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, const struc
|
||||
{
|
||||
GLenum error, gl_usage;
|
||||
|
||||
TRACE("Creating an OpenGL vertex buffer object for IWineD3DVertexBuffer %p Usage(%s)\n",
|
||||
TRACE("Creating an OpenGL vertex buffer object for wined3d_buffer %p with usage %s.\n",
|
||||
This, debug_d3dusage(This->resource.usage));
|
||||
|
||||
ENTER_GL();
|
||||
@@ -131,12 +129,11 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, const struc
|
||||
*/
|
||||
while (glGetError() != GL_NO_ERROR);
|
||||
|
||||
/* Basically the FVF parameter passed to CreateVertexBuffer is no good
|
||||
* It is the FVF set with IWineD3DDevice::SetFVF or the Vertex Declaration set with
|
||||
* IWineD3DDevice::SetVertexDeclaration that decides how the vertices in the buffer
|
||||
* look like. This means that on each DrawPrimitive call the vertex buffer has to be verified
|
||||
* to check if the rhw and color values are in the correct format.
|
||||
*/
|
||||
/* Basically the FVF parameter passed to CreateVertexBuffer is no good.
|
||||
* The vertex declaration from the device determines how the data in the
|
||||
* buffer is interpreted. This means that on each draw call the buffer has
|
||||
* to be verified to check if the rhw and color values are in the correct
|
||||
* format. */
|
||||
|
||||
GL_EXTCALL(glGenBuffersARB(1, &This->buffer_object));
|
||||
error = glGetError();
|
||||
@@ -147,10 +144,8 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, const struc
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
{
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
|
||||
}
|
||||
if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
device_invalidate_state(This->resource.device, STATE_INDEXBUFFER);
|
||||
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
|
||||
error = glGetError();
|
||||
if (error != GL_NO_ERROR)
|
||||
@@ -231,7 +226,6 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
|
||||
const enum wined3d_buffer_conversion_type conversion_type,
|
||||
const struct wined3d_stream_info_element *attrib, DWORD *stride_this_run)
|
||||
{
|
||||
DWORD offset = This->resource.device->stateBlock->state.streams[attrib->stream_idx].offset;
|
||||
DWORD attrib_size;
|
||||
BOOL ret = FALSE;
|
||||
unsigned int i;
|
||||
@@ -268,7 +262,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
|
||||
}
|
||||
}
|
||||
|
||||
data = (((DWORD_PTR)attrib->data) + offset) % This->stride;
|
||||
data = ((DWORD_PTR)attrib->data.addr) % This->stride;
|
||||
attrib_size = attrib->format->component_count * attrib->format->component_size;
|
||||
for (i = 0; i < attrib_size; ++i)
|
||||
{
|
||||
@@ -297,7 +291,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win
|
||||
* there, on nonexistent attribs the vbo is 0.
|
||||
*/
|
||||
if (!(si->use_map & (1 << attrib_idx))
|
||||
|| attrib->buffer_object != This->buffer_object)
|
||||
|| attrib->data.buffer_object != This->buffer_object)
|
||||
return FALSE;
|
||||
|
||||
format = attrib->format->id;
|
||||
@@ -470,10 +464,10 @@ static inline void fixup_transformed_pos(float *p)
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
const BYTE *buffer_get_memory(struct wined3d_buffer *buffer,
|
||||
const struct wined3d_gl_info *gl_info, GLuint *buffer_object)
|
||||
void buffer_get_memory(struct wined3d_buffer *buffer, const struct wined3d_gl_info *gl_info,
|
||||
struct wined3d_bo_address *data)
|
||||
{
|
||||
*buffer_object = buffer->buffer_object;
|
||||
data->buffer_object = buffer->buffer_object;
|
||||
if (!buffer->buffer_object)
|
||||
{
|
||||
if (buffer->flags & WINED3D_BUFFER_CREATEBO)
|
||||
@@ -482,15 +476,16 @@ const BYTE *buffer_get_memory(struct wined3d_buffer *buffer,
|
||||
buffer->flags &= ~WINED3D_BUFFER_CREATEBO;
|
||||
if (buffer->buffer_object)
|
||||
{
|
||||
*buffer_object = buffer->buffer_object;
|
||||
return NULL;
|
||||
data->buffer_object = buffer->buffer_object;
|
||||
data->addr = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return buffer->resource.allocatedMemory;
|
||||
data->addr = buffer->resource.allocatedMemory;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
data->addr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -513,9 +508,7 @@ BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_inf
|
||||
This->resource.allocatedMemory = (BYTE *)(((ULONG_PTR)This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
|
||||
|
||||
if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
{
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
|
||||
}
|
||||
device_invalidate_state(This->resource.device, STATE_INDEXBUFFER);
|
||||
|
||||
ENTER_GL();
|
||||
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
|
||||
@@ -589,23 +582,6 @@ void * CDECL wined3d_buffer_get_parent(const struct wined3d_buffer *buffer)
|
||||
return buffer->resource.parent;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_buffer_set_private_data(struct wined3d_buffer *buffer,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
return resource_set_private_data(&buffer->resource, guid, data, data_size, flags);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_buffer_get_private_data(const struct wined3d_buffer *buffer,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
return resource_get_private_data(&buffer->resource, guid, data, data_size);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_buffer_free_private_data(struct wined3d_buffer *buffer, REFGUID guid)
|
||||
{
|
||||
return resource_free_private_data(&buffer->resource, guid);
|
||||
}
|
||||
|
||||
DWORD CDECL wined3d_buffer_set_priority(struct wined3d_buffer *buffer, DWORD priority)
|
||||
{
|
||||
return resource_set_priority(&buffer->resource, priority);
|
||||
@@ -704,13 +680,9 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined
|
||||
GLbitfield mapflags;
|
||||
mapflags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
|
||||
if (flags & WINED3D_BUFFER_DISCARD)
|
||||
{
|
||||
mapflags |= GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;
|
||||
}
|
||||
else if (flags & WINED3D_BUFFER_NOSYNC)
|
||||
{
|
||||
mapflags |= GL_MAP_INVALIDATE_BUFFER_BIT;
|
||||
if (flags & WINED3D_BUFFER_NOSYNC)
|
||||
mapflags |= GL_MAP_UNSYNCHRONIZED_BIT;
|
||||
}
|
||||
map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
|
||||
This->resource.size, mapflags));
|
||||
checkGLcall("glMapBufferRange");
|
||||
@@ -833,7 +805,7 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer)
|
||||
* is not valid any longer. Dirtify the stream source to force a
|
||||
* reload. This happens only once per changed vertexbuffer and
|
||||
* should occur rather rarely. */
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_STREAMSRC);
|
||||
device_invalidate_state(device, STATE_STREAMSRC);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -864,7 +836,8 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer)
|
||||
FIXME("Too many full buffer conversions, stopping converting.\n");
|
||||
buffer_unload(&buffer->resource);
|
||||
buffer->flags &= ~WINED3D_BUFFER_CREATEBO;
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_STREAMSRC);
|
||||
if (buffer->bind_count)
|
||||
device_invalidate_state(device, STATE_STREAMSRC);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -879,7 +852,7 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer)
|
||||
}
|
||||
|
||||
if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_INDEXBUFFER);
|
||||
device_invalidate_state(device, STATE_INDEXBUFFER);
|
||||
|
||||
if (!buffer->conversion_map)
|
||||
{
|
||||
@@ -961,7 +934,7 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer)
|
||||
context_release(context);
|
||||
}
|
||||
|
||||
static DWORD buffer_sanitize_flags(struct wined3d_buffer *buffer, DWORD flags)
|
||||
static DWORD buffer_sanitize_flags(const struct wined3d_buffer *buffer, DWORD flags)
|
||||
{
|
||||
/* Not all flags make sense together, but Windows never returns an error. Catch the
|
||||
* cases that could cause issues */
|
||||
@@ -996,17 +969,15 @@ 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
|
||||
{
|
||||
if (!(d3d_flags & WINED3DLOCK_READONLY))
|
||||
ret |= GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
|
||||
if (!(d3d_flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)))
|
||||
ret |= GL_MAP_READ_BIT;
|
||||
}
|
||||
|
||||
if (d3d_flags & WINED3DLOCK_DISCARD)
|
||||
ret |= GL_MAP_INVALIDATE_BUFFER_BIT;
|
||||
if (d3d_flags & WINED3DLOCK_NOOVERWRITE)
|
||||
ret |= GL_MAP_UNSYNCHRONIZED_BIT;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1043,12 +1014,13 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
|
||||
struct wined3d_context *context;
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
|
||||
if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_INDEXBUFFER);
|
||||
|
||||
context = context_acquire(device, NULL);
|
||||
gl_info = context->gl_info;
|
||||
|
||||
ENTER_GL();
|
||||
|
||||
if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
context_invalidate_state(context, STATE_INDEXBUFFER);
|
||||
GL_EXTCALL(glBindBufferARB(buffer->buffer_type_hint, buffer->buffer_object));
|
||||
|
||||
if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
|
||||
@@ -1074,8 +1046,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
|
||||
|
||||
if (((DWORD_PTR)buffer->resource.allocatedMemory) & (RESOURCE_ALIGNMENT - 1))
|
||||
{
|
||||
WARN("Pointer %p is not %u byte aligned, falling back to double buffered operation.\n",
|
||||
buffer->resource.allocatedMemory, RESOURCE_ALIGNMENT);
|
||||
WARN("Pointer %p is not %u byte aligned.\n", buffer->resource.allocatedMemory, RESOURCE_ALIGNMENT);
|
||||
|
||||
ENTER_GL();
|
||||
GL_EXTCALL(glUnmapBufferARB(buffer->buffer_type_hint));
|
||||
@@ -1083,7 +1054,23 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
|
||||
LEAVE_GL();
|
||||
buffer->resource.allocatedMemory = NULL;
|
||||
|
||||
buffer_get_sysmem(buffer, gl_info);
|
||||
if (buffer->resource.usage & WINED3DUSAGE_DYNAMIC)
|
||||
{
|
||||
/* The extra copy is more expensive than not using VBOs at
|
||||
* all on the Nvidia Linux driver, which is the only driver
|
||||
* that returns unaligned pointers
|
||||
*/
|
||||
TRACE("Dynamic buffer, dropping VBO\n");
|
||||
buffer_unload(&buffer->resource);
|
||||
buffer->flags &= ~WINED3D_BUFFER_CREATEBO;
|
||||
if (buffer->bind_count)
|
||||
device_invalidate_state(device, STATE_STREAMSRC);
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE("Falling back to doublebuffered operation\n");
|
||||
buffer_get_sysmem(buffer, gl_info);
|
||||
}
|
||||
TRACE("New pointer is %p.\n", buffer->resource.allocatedMemory);
|
||||
}
|
||||
context_release(context);
|
||||
@@ -1147,14 +1134,13 @@ void CDECL wined3d_buffer_unmap(struct wined3d_buffer *buffer)
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
struct wined3d_context *context;
|
||||
|
||||
if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
{
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_INDEXBUFFER);
|
||||
}
|
||||
|
||||
context = context_acquire(device, NULL);
|
||||
gl_info = context->gl_info;
|
||||
|
||||
ENTER_GL();
|
||||
|
||||
if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
|
||||
context_invalidate_state(context, STATE_INDEXBUFFER);
|
||||
GL_EXTCALL(glBindBufferARB(buffer->buffer_type_hint, buffer->buffer_object));
|
||||
|
||||
if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
|
||||
@@ -1178,6 +1164,7 @@ void CDECL wined3d_buffer_unmap(struct wined3d_buffer *buffer)
|
||||
|
||||
GL_EXTCALL(glUnmapBufferARB(buffer->buffer_type_hint));
|
||||
LEAVE_GL();
|
||||
if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
|
||||
context_release(context);
|
||||
|
||||
buffer->resource.allocatedMemory = NULL;
|
||||
@@ -1195,7 +1182,7 @@ static const struct wined3d_resource_ops buffer_resource_ops =
|
||||
};
|
||||
|
||||
static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device,
|
||||
UINT size, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, GLenum bind_hint,
|
||||
UINT size, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, GLenum bind_hint,
|
||||
const char *data, void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
@@ -1209,8 +1196,8 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
hr = resource_init(&buffer->resource, device, WINED3DRTYPE_BUFFER, format,
|
||||
WINED3DMULTISAMPLE_NONE, 0, usage, pool, size, 1, 1, size,
|
||||
hr = resource_init(&buffer->resource, device, WINED3D_RTYPE_BUFFER, format,
|
||||
WINED3D_MULTISAMPLE_NONE, 0, usage, pool, size, 1, 1, size,
|
||||
parent, parent_ops, &buffer_resource_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -1222,8 +1209,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
|
||||
TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
|
||||
debug_d3dformat(buffer->resource.format->id), buffer->resource.allocatedMemory, buffer);
|
||||
|
||||
/* GL_ARB_map_buffer_range is disabled for now due to numerous bugs and no gains */
|
||||
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).
|
||||
@@ -1236,7 +1222,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
|
||||
{
|
||||
TRACE("Not creating a vbo because GL_ARB_vertex_buffer is not supported\n");
|
||||
}
|
||||
else if(buffer->resource.pool == WINED3DPOOL_SYSTEMMEM)
|
||||
else if(buffer->resource.pool == WINED3D_POOL_SYSTEM_MEM)
|
||||
{
|
||||
TRACE("Not creating a vbo because the vertex buffer is in system memory\n");
|
||||
}
|
||||
@@ -1298,7 +1284,7 @@ HRESULT CDECL wined3d_buffer_create(struct wined3d_device *device, struct wined3
|
||||
FIXME("Ignoring access flags (pool)\n");
|
||||
|
||||
hr = buffer_init(object, device, desc->byte_width, desc->usage, WINED3DFMT_UNKNOWN,
|
||||
WINED3DPOOL_MANAGED, GL_ARRAY_BUFFER_ARB, data, parent, parent_ops);
|
||||
WINED3D_POOL_MANAGED, GL_ARRAY_BUFFER_ARB, data, parent, parent_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize buffer, hr %#x.\n", hr);
|
||||
@@ -1314,7 +1300,7 @@ HRESULT CDECL wined3d_buffer_create(struct wined3d_device *device, struct wined3
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_buffer_create_vb(struct wined3d_device *device, UINT size, DWORD usage, WINED3DPOOL pool,
|
||||
HRESULT CDECL wined3d_buffer_create_vb(struct wined3d_device *device, UINT size, DWORD usage, enum wined3d_pool pool,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer)
|
||||
{
|
||||
struct wined3d_buffer *object;
|
||||
@@ -1323,11 +1309,11 @@ HRESULT CDECL wined3d_buffer_create_vb(struct wined3d_device *device, UINT size,
|
||||
TRACE("device %p, size %u, usage %#x, pool %#x, parent %p, parent_ops %p, buffer %p.\n",
|
||||
device, size, usage, pool, parent, parent_ops, buffer);
|
||||
|
||||
if (pool == WINED3DPOOL_SCRATCH)
|
||||
if (pool == WINED3D_POOL_SCRATCH)
|
||||
{
|
||||
/* The d3d9 tests shows that this is not allowed. It doesn't make much
|
||||
* sense anyway, SCRATCH buffers wouldn't be usable anywhere. */
|
||||
WARN("Vertex buffer in WINED3DPOOL_SCRATCH requested, returning WINED3DERR_INVALIDCALL.\n");
|
||||
WARN("Vertex buffer in WINED3D_POOL_SCRATCH requested, returning WINED3DERR_INVALIDCALL.\n");
|
||||
*buffer = NULL;
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
@@ -1355,7 +1341,7 @@ HRESULT CDECL wined3d_buffer_create_vb(struct wined3d_device *device, UINT size,
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_buffer_create_ib(struct wined3d_device *device, UINT size, DWORD usage, WINED3DPOOL pool,
|
||||
HRESULT CDECL wined3d_buffer_create_ib(struct wined3d_device *device, UINT size, DWORD usage, enum wined3d_pool pool,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer)
|
||||
{
|
||||
struct wined3d_buffer *object;
|
||||
|
||||
@@ -1,162 +0,0 @@
|
||||
/* IWineD3DClipper implementation
|
||||
*
|
||||
* Copyright 2000 (c) Marcus Meissner
|
||||
* Copyright 2000 (c) TransGaming Technologies Inc.
|
||||
* Copyright 2006 (c) Stefan Dösinger
|
||||
*
|
||||
* 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 <stdio.h>
|
||||
#ifdef HAVE_FLOAT_H
|
||||
# include <float.h>
|
||||
#endif
|
||||
#include "wined3d_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
|
||||
|
||||
ULONG CDECL wined3d_clipper_incref(struct wined3d_clipper *clipper)
|
||||
{
|
||||
ULONG refcount = InterlockedIncrement(&clipper->ref);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", clipper, refcount);
|
||||
|
||||
return refcount;
|
||||
}
|
||||
|
||||
ULONG CDECL wined3d_clipper_decref(struct wined3d_clipper *clipper)
|
||||
{
|
||||
ULONG refcount = InterlockedDecrement(&clipper->ref);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", clipper, refcount);
|
||||
|
||||
if (!refcount)
|
||||
HeapFree(GetProcessHeap(), 0, clipper);
|
||||
|
||||
return refcount;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_clipper_set_window(struct wined3d_clipper *clipper, DWORD flags, HWND window)
|
||||
{
|
||||
TRACE("clipper %p, flags %#x, window %p.\n", clipper, flags, window);
|
||||
|
||||
if (flags)
|
||||
{
|
||||
FIXME("flags %#x, not supported.\n", flags);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
clipper->hWnd = window;
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_clipper_get_clip_list(const struct wined3d_clipper *clipper, const RECT *rect,
|
||||
RGNDATA *clip_list, DWORD *clip_list_size)
|
||||
{
|
||||
TRACE("clipper %p, rect %s, clip_list %p, clip_list_size %p.\n",
|
||||
clipper, wine_dbgstr_rect(rect), clip_list, clip_list_size);
|
||||
|
||||
if (clipper->hWnd)
|
||||
{
|
||||
HDC hDC = GetDCEx(clipper->hWnd, NULL, DCX_WINDOW);
|
||||
if (hDC)
|
||||
{
|
||||
HRGN hRgn = CreateRectRgn(0,0,0,0);
|
||||
if (GetRandomRgn(hDC, hRgn, SYSRGN))
|
||||
{
|
||||
if (GetVersion() & 0x80000000)
|
||||
{
|
||||
/* map region to screen coordinates */
|
||||
POINT org;
|
||||
GetDCOrgEx(hDC, &org);
|
||||
OffsetRgn(hRgn, org.x, org.y);
|
||||
}
|
||||
if (rect)
|
||||
{
|
||||
HRGN hRgnClip = CreateRectRgn(rect->left, rect->top,
|
||||
rect->right, rect->bottom);
|
||||
CombineRgn(hRgn, hRgn, hRgnClip, RGN_AND);
|
||||
DeleteObject(hRgnClip);
|
||||
}
|
||||
*clip_list_size = GetRegionData(hRgn, *clip_list_size, clip_list);
|
||||
}
|
||||
DeleteObject(hRgn);
|
||||
ReleaseDC(clipper->hWnd, hDC);
|
||||
}
|
||||
return WINED3D_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
static unsigned int once;
|
||||
|
||||
if (!once++)
|
||||
FIXME("clipper %p, rect %s, clip_list %p, clip_list_size %p stub!\n",
|
||||
clipper, wine_dbgstr_rect(rect), clip_list, clip_list_size);
|
||||
|
||||
if (clip_list_size)
|
||||
*clip_list_size = 0;
|
||||
|
||||
return WINEDDERR_NOCLIPLIST;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_clipper_set_clip_list(struct wined3d_clipper *clipper, const RGNDATA *region, DWORD flags)
|
||||
{
|
||||
static unsigned int once;
|
||||
|
||||
if (!once++ || !region)
|
||||
FIXME("clipper %p, region %p, flags %#x stub!\n", clipper, region, flags);
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_clipper_get_window(const struct wined3d_clipper *clipper, HWND *window)
|
||||
{
|
||||
TRACE("clipper %p, window %p.\n", clipper, window);
|
||||
|
||||
*window = clipper->hWnd;
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_clipper_is_clip_list_changed(const struct wined3d_clipper *clipper, BOOL *changed)
|
||||
{
|
||||
FIXME("clipper %p, changed %p stub!\n", clipper, changed);
|
||||
|
||||
/* XXX What is safest? */
|
||||
*changed = FALSE;
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
struct wined3d_clipper * CDECL wined3d_clipper_create(void)
|
||||
{
|
||||
struct wined3d_clipper *clipper;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
clipper = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*clipper));
|
||||
if (!clipper)
|
||||
{
|
||||
ERR("Out of memory when trying to allocate a WineD3D Clipper\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wined3d_clipper_incref(clipper);
|
||||
|
||||
return clipper;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -33,14 +33,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw);
|
||||
#include <math.h>
|
||||
|
||||
/* GL locking is done by the caller */
|
||||
static void drawStridedFast(GLenum primitive_type, UINT count, UINT idx_size, const void *idx_data, UINT start_idx)
|
||||
static void drawStridedFast(const struct wined3d_gl_info *gl_info, GLenum primitive_type, UINT count, UINT idx_size,
|
||||
const void *idx_data, UINT start_idx, INT base_vertex_index)
|
||||
{
|
||||
if (idx_size)
|
||||
{
|
||||
glDrawElements(primitive_type, count,
|
||||
idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT,
|
||||
(const char *)idx_data + (idx_size * start_idx));
|
||||
checkGLcall("glDrawElements");
|
||||
GLenum idxtype = idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||
if (gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX])
|
||||
{
|
||||
GL_EXTCALL(glDrawElementsBaseVertex(primitive_type, count, idxtype,
|
||||
(const char *)idx_data + (idx_size * start_idx), base_vertex_index));
|
||||
checkGLcall("glDrawElementsBaseVertex");
|
||||
}
|
||||
else
|
||||
{
|
||||
glDrawElements(primitive_type, count,
|
||||
idxtype, (const char *)idx_data + (idx_size * start_idx));
|
||||
checkGLcall("glDrawElements");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -55,7 +65,7 @@ static void drawStridedFast(GLenum primitive_type, UINT count, UINT idx_size, co
|
||||
*/
|
||||
|
||||
/* GL locking is done by the caller */
|
||||
static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_context *context,
|
||||
static void drawStridedSlow(const struct wined3d_device *device, const struct wined3d_context *context,
|
||||
const struct wined3d_stream_info *si, UINT NumVertexes, GLenum glPrimType,
|
||||
const void *idxData, UINT idxSize, UINT startIdx)
|
||||
{
|
||||
@@ -64,8 +74,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
const DWORD *pIdxBufL = NULL;
|
||||
UINT vx_index;
|
||||
const struct wined3d_state *state = &device->stateBlock->state;
|
||||
const struct wined3d_stream_state *streams = state->streams;
|
||||
LONG SkipnStrides = startIdx + state->load_base_vertex_index;
|
||||
LONG SkipnStrides = startIdx;
|
||||
BOOL pixelShader = use_ps(state);
|
||||
BOOL specular_fog = FALSE;
|
||||
const BYTE *texCoords[WINED3DDP_MAXTEXCOORD];
|
||||
@@ -101,13 +110,13 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
if (si->use_map & (1 << WINED3D_FFP_POSITION))
|
||||
{
|
||||
element = &si->elements[WINED3D_FFP_POSITION];
|
||||
position = element->data + streams[element->stream_idx].offset;
|
||||
position = element->data.addr;
|
||||
}
|
||||
|
||||
if (si->use_map & (1 << WINED3D_FFP_NORMAL))
|
||||
{
|
||||
element = &si->elements[WINED3D_FFP_NORMAL];
|
||||
normal = element->data + streams[element->stream_idx].offset;
|
||||
normal = element->data.addr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -118,7 +127,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
|
||||
{
|
||||
element = &si->elements[WINED3D_FFP_DIFFUSE];
|
||||
diffuse = element->data + streams[element->stream_idx].offset;
|
||||
diffuse = element->data.addr;
|
||||
|
||||
if (num_untracked_materials && element->format->id != WINED3DFMT_B8G8R8A8_UNORM)
|
||||
FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format->id));
|
||||
@@ -131,13 +140,13 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
|
||||
{
|
||||
element = &si->elements[WINED3D_FFP_SPECULAR];
|
||||
specular = element->data + streams[element->stream_idx].offset;
|
||||
specular = element->data.addr;
|
||||
|
||||
/* special case where the fog density is stored in the specular alpha channel */
|
||||
if (state->render_states[WINED3DRS_FOGENABLE]
|
||||
&& (state->render_states[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE
|
||||
if (state->render_states[WINED3D_RS_FOGENABLE]
|
||||
&& (state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE
|
||||
|| si->elements[WINED3D_FFP_POSITION].format->id == WINED3DFMT_R32G32B32A32_FLOAT)
|
||||
&& state->render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE)
|
||||
&& state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE)
|
||||
{
|
||||
if (gl_info->supported[EXT_FOG_COORD])
|
||||
{
|
||||
@@ -164,7 +173,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
|
||||
for (textureNo = 0; textureNo < texture_stages; ++textureNo)
|
||||
{
|
||||
int coordIdx = state->texture_states[textureNo][WINED3DTSS_TEXCOORDINDEX];
|
||||
int coordIdx = state->texture_states[textureNo][WINED3D_TSS_TEXCOORD_INDEX];
|
||||
DWORD texture_idx = device->texUnitMap[textureNo];
|
||||
|
||||
if (!gl_info->supported[ARB_MULTITEXTURE] && textureNo > 0)
|
||||
@@ -191,7 +200,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
if (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)))
|
||||
{
|
||||
element = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
|
||||
texCoords[coordIdx] = element->data + streams[element->stream_idx].offset;
|
||||
texCoords[coordIdx] = element->data.addr;
|
||||
tex_mask |= (1 << textureNo);
|
||||
}
|
||||
else
|
||||
@@ -220,9 +229,9 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
{
|
||||
/* Indexed so work out the number of strides to skip */
|
||||
if (idxSize == 2)
|
||||
SkipnStrides = pIdxBufS[startIdx + vx_index] + state->load_base_vertex_index;
|
||||
SkipnStrides = pIdxBufS[startIdx + vx_index] + state->base_vertex_index;
|
||||
else
|
||||
SkipnStrides = pIdxBufL[startIdx + vx_index] + state->load_base_vertex_index;
|
||||
SkipnStrides = pIdxBufL[startIdx + vx_index] + state->base_vertex_index;
|
||||
}
|
||||
|
||||
tmp_tex_mask = tex_mask;
|
||||
@@ -234,7 +243,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
|
||||
|
||||
if (!(tmp_tex_mask & 1)) continue;
|
||||
|
||||
coord_idx = state->texture_states[texture][WINED3DTSS_TEXCOORDINDEX];
|
||||
coord_idx = state->texture_states[texture][WINED3D_TSS_TEXCOORD_INDEX];
|
||||
ptr = texCoords[coord_idx] + (SkipnStrides * si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].stride);
|
||||
|
||||
texture_idx = device->texUnitMap[texture];
|
||||
@@ -375,7 +384,7 @@ static inline void send_attribute(const struct wined3d_gl_info *gl_info,
|
||||
/* Are those 16 bit floats. C doesn't have a 16 bit float type. I could read the single bits and calculate a 4
|
||||
* byte float according to the IEEE standard
|
||||
*/
|
||||
if (gl_info->supported[NV_HALF_FLOAT])
|
||||
if (gl_info->supported[NV_HALF_FLOAT] && gl_info->supported[NV_VERTEX_PROGRAM])
|
||||
{
|
||||
/* Not supported by GL_ARB_half_float_vertex */
|
||||
GL_EXTCALL(glVertexAttrib2hvNV(index, ptr));
|
||||
@@ -388,7 +397,7 @@ static inline void send_attribute(const struct wined3d_gl_info *gl_info,
|
||||
}
|
||||
break;
|
||||
case WINED3DFMT_R16G16B16A16_FLOAT:
|
||||
if (gl_info->supported[NV_HALF_FLOAT])
|
||||
if (gl_info->supported[NV_HALF_FLOAT] && gl_info->supported[NV_VERTEX_PROGRAM])
|
||||
{
|
||||
/* Not supported by GL_ARB_half_float_vertex */
|
||||
GL_EXTCALL(glVertexAttrib4hvNV(index, ptr));
|
||||
@@ -455,8 +464,7 @@ static void drawStridedSlowVs(const struct wined3d_gl_info *gl_info, const struc
|
||||
{
|
||||
if (!(si->use_map & (1 << i))) continue;
|
||||
|
||||
ptr = si->elements[i].data + si->elements[i].stride * SkipnStrides
|
||||
+ state->streams[si->elements[i].stream_idx].offset;
|
||||
ptr = si->elements[i].data.addr + si->elements[i].stride * SkipnStrides;
|
||||
|
||||
send_attribute(gl_info, si->elements[i].format->id, i, ptr);
|
||||
}
|
||||
@@ -469,11 +477,12 @@ static void drawStridedSlowVs(const struct wined3d_gl_info *gl_info, const struc
|
||||
/* GL locking is done by the caller */
|
||||
static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state,
|
||||
const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType,
|
||||
const void *idxData, UINT idxSize, UINT startIdx)
|
||||
const void *idxData, UINT idxSize, UINT startIdx, UINT base_vertex_index)
|
||||
{
|
||||
UINT numInstances = 0, i;
|
||||
int numInstancedAttribs = 0, j;
|
||||
UINT instancedData[sizeof(si->elements) / sizeof(*si->elements) /* 16 */];
|
||||
GLenum idxtype = idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||
|
||||
if (!idxSize)
|
||||
{
|
||||
@@ -518,10 +527,9 @@ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const st
|
||||
for(i = 0; i < numInstances; i++) {
|
||||
/* Specify the instanced attributes using immediate mode calls */
|
||||
for(j = 0; j < numInstancedAttribs; j++) {
|
||||
const BYTE *ptr = si->elements[instancedData[j]].data
|
||||
+ si->elements[instancedData[j]].stride * i
|
||||
+ state->streams[si->elements[instancedData[j]].stream_idx].offset;
|
||||
if (si->elements[instancedData[j]].buffer_object)
|
||||
const BYTE *ptr = si->elements[instancedData[j]].data.addr
|
||||
+ si->elements[instancedData[j]].stride * i;
|
||||
if (si->elements[instancedData[j]].data.buffer_object)
|
||||
{
|
||||
struct wined3d_buffer *vb = state->streams[si->elements[instancedData[j]].stream_idx].buffer;
|
||||
ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info);
|
||||
@@ -530,9 +538,18 @@ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const st
|
||||
send_attribute(gl_info, si->elements[instancedData[j]].format->id, instancedData[j], ptr);
|
||||
}
|
||||
|
||||
glDrawElements(glPrimitiveType, numberOfVertices, idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT,
|
||||
(const char *)idxData+(idxSize * startIdx));
|
||||
checkGLcall("glDrawElements");
|
||||
if (gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX])
|
||||
{
|
||||
GL_EXTCALL(glDrawElementsBaseVertex(glPrimitiveType, numberOfVertices, idxtype,
|
||||
(const char *)idxData+(idxSize * startIdx), base_vertex_index));
|
||||
checkGLcall("glDrawElementsBaseVertex");
|
||||
}
|
||||
else
|
||||
{
|
||||
glDrawElements(glPrimitiveType, numberOfVertices, idxtype,
|
||||
(const char *)idxData+(idxSize * startIdx));
|
||||
checkGLcall("glDrawElements");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -548,11 +565,11 @@ static void remove_vbos(const struct wined3d_gl_info *gl_info,
|
||||
if (!(s->use_map & (1 << i))) continue;
|
||||
|
||||
e = &s->elements[i];
|
||||
if (e->buffer_object)
|
||||
if (e->data.buffer_object)
|
||||
{
|
||||
struct wined3d_buffer *vb = state->streams[e->stream_idx].buffer;
|
||||
e->buffer_object = 0;
|
||||
e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
|
||||
e->data.buffer_object = 0;
|
||||
e->data.addr = (BYTE *)((ULONG_PTR)e->data.addr + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -566,7 +583,7 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
|
||||
if (!index_count) return;
|
||||
|
||||
if (state->render_states[WINED3DRS_COLORWRITEENABLE])
|
||||
if (state->render_states[WINED3D_RS_COLORWRITEENABLE])
|
||||
{
|
||||
/* Invalidate the back buffer memory so LockRect will read it the next time */
|
||||
for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
|
||||
@@ -574,8 +591,8 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
struct wined3d_surface *target = device->fb.render_targets[i];
|
||||
if (target)
|
||||
{
|
||||
surface_load_location(target, SFLAG_INDRAWABLE, NULL);
|
||||
surface_modify_location(target, SFLAG_INDRAWABLE, TRUE);
|
||||
surface_load_location(target, target->draw_binding, NULL);
|
||||
surface_modify_location(target, target->draw_binding, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -591,13 +608,6 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
return;
|
||||
}
|
||||
|
||||
if (!context_apply_draw_state(context, device))
|
||||
{
|
||||
context_release(context);
|
||||
WARN("Unable to apply draw state, skipping draw.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->fb.depth_stencil)
|
||||
{
|
||||
/* Note that this depends on the context_acquire() call above to set
|
||||
@@ -605,13 +615,13 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
* Z-compare function into account, but we could skip loading the
|
||||
* depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note
|
||||
* that we never copy the stencil data.*/
|
||||
DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
|
||||
if (state->render_states[WINED3DRS_ZWRITEENABLE] || state->render_states[WINED3DRS_ZENABLE])
|
||||
DWORD location = context->render_offscreen ? device->fb.depth_stencil->draw_binding : SFLAG_INDRAWABLE;
|
||||
if (state->render_states[WINED3D_RS_ZWRITEENABLE] || state->render_states[WINED3D_RS_ZENABLE])
|
||||
{
|
||||
struct wined3d_surface *ds = device->fb.depth_stencil;
|
||||
RECT current_rect, draw_rect, r;
|
||||
|
||||
if (location == SFLAG_DS_ONSCREEN && ds != device->onscreen_depth_stencil)
|
||||
if (!context->render_offscreen && ds != device->onscreen_depth_stencil)
|
||||
device_switch_onscreen_ds(device, context, ds);
|
||||
|
||||
if (ds->flags & location)
|
||||
@@ -619,24 +629,33 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
else
|
||||
SetRectEmpty(¤t_rect);
|
||||
|
||||
device_get_draw_rect(device, &draw_rect);
|
||||
wined3d_get_draw_rect(state, &draw_rect);
|
||||
|
||||
IntersectRect(&r, &draw_rect, ¤t_rect);
|
||||
if (!EqualRect(&r, &draw_rect))
|
||||
surface_load_ds_location(ds, context, location);
|
||||
|
||||
if (state->render_states[WINED3DRS_ZWRITEENABLE])
|
||||
{
|
||||
surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
|
||||
surface_modify_location(ds, SFLAG_INDRAWABLE, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!context_apply_draw_state(context, device))
|
||||
{
|
||||
context_release(context);
|
||||
WARN("Unable to apply draw state, skipping draw.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->fb.depth_stencil && state->render_states[WINED3D_RS_ZWRITEENABLE])
|
||||
{
|
||||
struct wined3d_surface *ds = device->fb.depth_stencil;
|
||||
DWORD location = context->render_offscreen ? ds->draw_binding : SFLAG_INDRAWABLE;
|
||||
|
||||
surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
|
||||
}
|
||||
|
||||
if ((!context->gl_info->supported[WINED3D_GL_VERSION_2_0]
|
||||
|| (!glPointParameteri && !context->gl_info->supported[NV_POINT_SPRITE]))
|
||||
&& context->render_offscreen
|
||||
&& state->render_states[WINED3DRS_POINTSPRITEENABLE]
|
||||
&& state->render_states[WINED3D_RS_POINTSPRITEENABLE]
|
||||
&& state->gl_primitive_type == GL_POINTS)
|
||||
{
|
||||
FIXME("Point sprite coordinate origin switching not supported.\n");
|
||||
@@ -646,6 +665,7 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
ENTER_GL();
|
||||
{
|
||||
GLenum glPrimType = state->gl_primitive_type;
|
||||
INT base_vertex_index = state->base_vertex_index;
|
||||
BOOL emulation = FALSE;
|
||||
const struct wined3d_stream_info *stream_info = &device->strided_streams;
|
||||
struct wined3d_stream_info stridedlcl;
|
||||
@@ -653,7 +673,7 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
if (!use_vs(state))
|
||||
{
|
||||
if (!stream_info->position_transformed && context->num_untracked_materials
|
||||
&& state->render_states[WINED3DRS_LIGHTING])
|
||||
&& state->render_states[WINED3D_RS_LIGHTING])
|
||||
{
|
||||
static BOOL warned;
|
||||
if (!warned) {
|
||||
@@ -664,7 +684,7 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
}
|
||||
emulation = TRUE;
|
||||
}
|
||||
else if (context->fog_coord && state->render_states[WINED3DRS_FOGENABLE])
|
||||
else if (context->fog_coord && state->render_states[WINED3D_RS_FOGENABLE])
|
||||
{
|
||||
/* Either write a pipeline replacement shader or convert the specular alpha from unsigned byte
|
||||
* to a float in the vertex buffer
|
||||
@@ -711,11 +731,11 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
|
||||
{
|
||||
/* Instancing emulation with mixing immediate mode and arrays */
|
||||
drawStridedInstanced(context->gl_info, state, stream_info,
|
||||
index_count, glPrimType, idxData, idxSize, StartIdx);
|
||||
index_count, glPrimType, idxData, idxSize, StartIdx, base_vertex_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
drawStridedFast(glPrimType, index_count, idxSize, idxData, StartIdx);
|
||||
drawStridedFast(context->gl_info, glPrimType, index_count, idxSize, idxData, StartIdx, base_vertex_index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -771,12 +791,14 @@ static void normalize_normal(float *n) {
|
||||
HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch *patch)
|
||||
{
|
||||
unsigned int i, j, num_quads, out_vertex_size, buffer_size, d3d_out_vertex_size;
|
||||
const struct wined3d_rect_patch_info *info = &patch->rect_patch_info;
|
||||
float max_x = 0.0f, max_y = 0.0f, max_z = 0.0f, neg_z = 0.0f;
|
||||
struct wined3d_state *state = &This->stateBlock->state;
|
||||
struct wined3d_stream_info stream_info;
|
||||
struct wined3d_stream_info_element *e;
|
||||
struct wined3d_context *context;
|
||||
struct wined3d_shader *vs;
|
||||
const BYTE *data;
|
||||
const WINED3DRECTPATCH_INFO *info = &patch->RectPatchInfo;
|
||||
DWORD vtxStride;
|
||||
GLenum feedback_type;
|
||||
GLfloat *feedbuffer;
|
||||
@@ -787,21 +809,23 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
context = context_acquire(This, NULL);
|
||||
context_apply_blit_state(context, This);
|
||||
|
||||
/* First, locate the position data. This is provided in a vertex buffer in the stateblock.
|
||||
* Beware of vbos
|
||||
*/
|
||||
device_stream_info_from_declaration(This, FALSE, &stream_info, NULL);
|
||||
/* First, locate the position data. This is provided in a vertex buffer in
|
||||
* the stateblock. Beware of VBOs. */
|
||||
vs = state->vertex_shader;
|
||||
state->vertex_shader = NULL;
|
||||
device_stream_info_from_declaration(This, &stream_info, NULL);
|
||||
state->vertex_shader = vs;
|
||||
|
||||
e = &stream_info.elements[WINED3D_FFP_POSITION];
|
||||
if (e->buffer_object)
|
||||
if (e->data.buffer_object)
|
||||
{
|
||||
struct wined3d_buffer *vb = This->stateBlock->state.streams[e->stream_idx].buffer;
|
||||
e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, context->gl_info));
|
||||
struct wined3d_buffer *vb = state->streams[e->stream_idx].buffer;
|
||||
e->data.addr = (BYTE *)((ULONG_PTR)e->data.addr + (ULONG_PTR)buffer_get_sysmem(vb, context->gl_info));
|
||||
}
|
||||
vtxStride = e->stride;
|
||||
data = e->data +
|
||||
vtxStride * info->Stride * info->StartVertexOffsetHeight +
|
||||
vtxStride * info->StartVertexOffsetWidth;
|
||||
data = e->data.addr
|
||||
+ vtxStride * info->stride * info->start_vertex_offset_height
|
||||
+ vtxStride * info->start_vertex_offset_width;
|
||||
|
||||
/* Not entirely sure about what happens with transformed vertices */
|
||||
if (stream_info.position_transformed) FIXME("Transformed position in rectpatch generation\n");
|
||||
@@ -813,17 +837,17 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
*/
|
||||
ERR("Vertex stride is not a multiple of sizeof(GLfloat)\n");
|
||||
}
|
||||
if(info->Basis != WINED3DBASIS_BEZIER) {
|
||||
FIXME("Basis is %s, how to handle this?\n", debug_d3dbasis(info->Basis));
|
||||
}
|
||||
if(info->Degree != WINED3DDEGREE_CUBIC) {
|
||||
FIXME("Degree is %s, how to handle this?\n", debug_d3ddegree(info->Degree));
|
||||
}
|
||||
if (info->basis != WINED3D_BASIS_BEZIER)
|
||||
FIXME("Basis is %s, how to handle this?\n", debug_d3dbasis(info->basis));
|
||||
if (info->degree != WINED3D_DEGREE_CUBIC)
|
||||
FIXME("Degree is %s, how to handle this?\n", debug_d3ddegree(info->degree));
|
||||
|
||||
/* First, get the boundary cube of the input data */
|
||||
for(j = 0; j < info->Height; j++) {
|
||||
for(i = 0; i < info->Width; i++) {
|
||||
const float *v = (const float *)(data + vtxStride * i + vtxStride * info->Stride * j);
|
||||
for (j = 0; j < info->height; ++j)
|
||||
{
|
||||
for (i = 0; i < info->width; ++i)
|
||||
{
|
||||
const float *v = (const float *)(data + vtxStride * i + vtxStride * info->stride * j);
|
||||
if(fabs(v[0]) > max_x) max_x = fabsf(v[0]);
|
||||
if(fabs(v[1]) > max_y) max_y = fabsf(v[1]);
|
||||
if(fabs(v[2]) > max_z) max_z = fabsf(v[2]);
|
||||
@@ -853,8 +877,9 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
*/
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)");
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_FILLMODE));
|
||||
if(patch->has_normals) {
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_FILLMODE));
|
||||
if (patch->has_normals)
|
||||
{
|
||||
static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||
static const GLfloat red[] = {1.0f, 0.0f, 0.0f, 0.0f};
|
||||
static const GLfloat green[] = {0.0f, 1.0f, 0.0f, 0.0f};
|
||||
@@ -864,30 +889,30 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
checkGLcall("glEnable(GL_LIGHTING)");
|
||||
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);
|
||||
checkGLcall("glLightModel for MODEL_AMBIENT");
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_AMBIENT));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_AMBIENT));
|
||||
|
||||
for (i = 3; i < context->gl_info->limits.lights; ++i)
|
||||
{
|
||||
glDisable(GL_LIGHT0 + i);
|
||||
checkGLcall("glDisable(GL_LIGHT0 + i)");
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(i));
|
||||
context_invalidate_state(context, STATE_ACTIVELIGHT(i));
|
||||
}
|
||||
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(0));
|
||||
context_invalidate_state(context, STATE_ACTIVELIGHT(0));
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, red);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, black);
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, black);
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, red);
|
||||
glEnable(GL_LIGHT0);
|
||||
checkGLcall("Setting up light 1");
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(1));
|
||||
context_invalidate_state(context, STATE_ACTIVELIGHT(1));
|
||||
glLightfv(GL_LIGHT1, GL_DIFFUSE, green);
|
||||
glLightfv(GL_LIGHT1, GL_SPECULAR, black);
|
||||
glLightfv(GL_LIGHT1, GL_AMBIENT, black);
|
||||
glLightfv(GL_LIGHT1, GL_POSITION, green);
|
||||
glEnable(GL_LIGHT1);
|
||||
checkGLcall("Setting up light 2");
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(2));
|
||||
context_invalidate_state(context, STATE_ACTIVELIGHT(2));
|
||||
glLightfv(GL_LIGHT2, GL_DIFFUSE, blue);
|
||||
glLightfv(GL_LIGHT2, GL_SPECULAR, black);
|
||||
glLightfv(GL_LIGHT2, GL_AMBIENT, black);
|
||||
@@ -895,8 +920,8 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
glEnable(GL_LIGHT2);
|
||||
checkGLcall("Setting up light 3");
|
||||
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_MATERIAL);
|
||||
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORVERTEX));
|
||||
context_invalidate_state(context, STATE_MATERIAL);
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_COLORVERTEX));
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black);
|
||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black);
|
||||
@@ -941,14 +966,15 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
feedbuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_size * sizeof(float) * 8);
|
||||
|
||||
glMap2f(GL_MAP2_VERTEX_3,
|
||||
0.0f, 1.0f, vtxStride / sizeof(float), info->Width,
|
||||
0.0f, 1.0f, info->Stride * vtxStride / sizeof(float), info->Height,
|
||||
0.0f, 1.0f, vtxStride / sizeof(float), info->width,
|
||||
0.0f, 1.0f, info->stride * vtxStride / sizeof(float), info->height,
|
||||
(const GLfloat *)data);
|
||||
checkGLcall("glMap2f");
|
||||
if(patch->has_texcoords) {
|
||||
if (patch->has_texcoords)
|
||||
{
|
||||
glMap2f(GL_MAP2_TEXTURE_COORD_4,
|
||||
0.0f, 1.0f, vtxStride / sizeof(float), info->Width,
|
||||
0.0f, 1.0f, info->Stride * vtxStride / sizeof(float), info->Height,
|
||||
0.0f, 1.0f, vtxStride / sizeof(float), info->width,
|
||||
0.0f, 1.0f, info->stride * vtxStride / sizeof(float), info->height,
|
||||
(const GLfloat *)data);
|
||||
checkGLcall("glMap2f");
|
||||
}
|
||||
@@ -1101,21 +1127,22 @@ HRESULT tesselate_rectpatch(struct wined3d_device *This, struct WineD3DRectPatch
|
||||
}
|
||||
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;
|
||||
patch->strided.position.data = (BYTE *)patch->mem;
|
||||
patch->strided.position.stride = vtxStride;
|
||||
|
||||
if(patch->has_normals) {
|
||||
if (patch->has_normals)
|
||||
{
|
||||
patch->strided.normal.format = WINED3DFMT_R32G32B32_FLOAT;
|
||||
patch->strided.normal.lpData = (BYTE *) patch->mem + 3 * sizeof(float) /* pos */;
|
||||
patch->strided.normal.dwStride = vtxStride;
|
||||
patch->strided.normal.data = (BYTE *)patch->mem + 3 * sizeof(float) /* pos */;
|
||||
patch->strided.normal.stride = vtxStride;
|
||||
}
|
||||
if(patch->has_texcoords) {
|
||||
patch->strided.texCoords[0].format = WINED3DFMT_R32G32B32A32_FLOAT;
|
||||
patch->strided.texCoords[0].lpData = (BYTE *) patch->mem + 3 * sizeof(float) /* pos */;
|
||||
if(patch->has_normals) {
|
||||
patch->strided.texCoords[0].lpData += 3 * sizeof(float);
|
||||
}
|
||||
patch->strided.texCoords[0].dwStride = vtxStride;
|
||||
if (patch->has_texcoords)
|
||||
{
|
||||
patch->strided.tex_coords[0].format = WINED3DFMT_R32G32B32A32_FLOAT;
|
||||
patch->strided.tex_coords[0].data = (BYTE *)patch->mem + 3 * sizeof(float) /* pos */;
|
||||
if (patch->has_normals)
|
||||
patch->strided.tex_coords[0].data += 3 * sizeof(float);
|
||||
patch->strided.tex_coords[0].stride = vtxStride;
|
||||
}
|
||||
|
||||
return WINED3D_OK;
|
||||
|
||||
@@ -391,7 +391,7 @@ void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info)
|
||||
* too, which would allow fog coord emulation in a fixed function vertex pipeline replacement.
|
||||
*
|
||||
* Fog vs texture: We apply the fog in the vertex color. An app could set up texturing settings which
|
||||
* ignore the vertex color, thus effectively disabing our fog. However, in D3D this type of fog is
|
||||
* ignore the vertex color, thus effectively disabling our fog. However, in D3D this type of fog is
|
||||
* a per-vertex fog too, so the apps shouldn't do that.
|
||||
*
|
||||
* Fog vs lighting: The app could in theory use D3DFOG_NONE table and D3DFOG_NONE vertex fog with
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -34,8 +34,9 @@ static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD st
|
||||
{
|
||||
BOOL bumpmap = FALSE;
|
||||
|
||||
if (stage > 0 && (state->texture_states[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE
|
||||
|| state->texture_states[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP))
|
||||
if (stage > 0
|
||||
&& (state->texture_states[stage - 1][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_BUMPENVMAP_LUMINANCE
|
||||
|| state->texture_states[stage - 1][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_BUMPENVMAP))
|
||||
{
|
||||
bumpmap = TRUE;
|
||||
context->texShaderBumpMap |= (1 << stage);
|
||||
@@ -70,11 +71,12 @@ static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD st
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
struct tex_op_args
|
||||
{
|
||||
GLenum input[3];
|
||||
GLenum mapping[3];
|
||||
GLenum component_usage[3];
|
||||
} tex_op_args;
|
||||
};
|
||||
|
||||
static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT texture_idx) {
|
||||
switch (d3dta) {
|
||||
@@ -99,7 +101,7 @@ static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT texture_idx)
|
||||
return GL_SPARE1_NV;
|
||||
|
||||
case WINED3DTA_CONSTANT:
|
||||
/* TODO: Support per stage constants (WINED3DTSS_CONSTANT, NV_register_combiners2) */
|
||||
/* TODO: Support per stage constants (WINED3D_TSS_CONSTANT, NV_register_combiners2) */
|
||||
FIXME("WINED3DTA_CONSTANT, not properly supported.\n");
|
||||
return GL_CONSTANT_COLOR1_NV;
|
||||
|
||||
@@ -132,9 +134,9 @@ static void get_src_and_opr_nvrc(DWORD stage, DWORD arg, BOOL is_alpha, GLenum*
|
||||
}
|
||||
|
||||
void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, BOOL is_alpha,
|
||||
int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst)
|
||||
int stage, enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst)
|
||||
{
|
||||
tex_op_args tex_op_args = {{0}, {0}, {0}};
|
||||
struct tex_op_args tex_op_args = {{0}, {0}, {0}};
|
||||
GLenum portion = is_alpha ? GL_ALPHA : GL_RGB;
|
||||
GLenum target = GL_COMBINER0_NV + stage;
|
||||
GLenum output;
|
||||
@@ -147,7 +149,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
if (is_invalid_op(state, stage, op, arg1, arg2, arg3))
|
||||
{
|
||||
arg1 = WINED3DTA_CURRENT;
|
||||
op = WINED3DTOP_SELECTARG1;
|
||||
op = WINED3D_TOP_SELECT_ARG1;
|
||||
}
|
||||
|
||||
get_src_and_opr_nvrc(stage, arg1, is_alpha, &tex_op_args.input[0],
|
||||
@@ -165,11 +167,12 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
}
|
||||
|
||||
/* This is called by a state handler which has the gl lock held and a context for the thread */
|
||||
switch(op)
|
||||
switch (op)
|
||||
{
|
||||
case WINED3DTOP_DISABLE:
|
||||
case WINED3D_TOP_DISABLE:
|
||||
/* Only for alpha */
|
||||
if (!is_alpha) ERR("Shouldn't be called for WINED3DTSS_COLOROP (WINED3DTOP_DISABLE)\n");
|
||||
if (!is_alpha)
|
||||
ERR("Shouldn't be called for WINED3D_TSS_COLOR_OP (WINED3DTOP_DISABLE).\n");
|
||||
/* Input, prev_alpha*1 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA));
|
||||
@@ -181,16 +184,15 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_SELECTARG1:
|
||||
case WINED3DTOP_SELECTARG2:
|
||||
case WINED3D_TOP_SELECT_ARG1:
|
||||
case WINED3D_TOP_SELECT_ARG2:
|
||||
/* Input, arg*1 */
|
||||
if (op == WINED3DTOP_SELECTARG1) {
|
||||
if (op == WINED3D_TOP_SELECT_ARG1)
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
} else {
|
||||
else
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
|
||||
}
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
|
||||
|
||||
@@ -199,9 +201,9 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATE:
|
||||
case WINED3DTOP_MODULATE2X:
|
||||
case WINED3DTOP_MODULATE4X:
|
||||
case WINED3D_TOP_MODULATE:
|
||||
case WINED3D_TOP_MODULATE_2X:
|
||||
case WINED3D_TOP_MODULATE_4X:
|
||||
/* Input, arg1*arg2 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
@@ -209,21 +211,20 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
|
||||
|
||||
/* Output */
|
||||
if (op == WINED3DTOP_MODULATE) {
|
||||
if (op == WINED3D_TOP_MODULATE)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV,
|
||||
GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
} else if (op == WINED3DTOP_MODULATE2X) {
|
||||
else if (op == WINED3D_TOP_MODULATE_2X)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV,
|
||||
GL_DISCARD_NV, GL_SCALE_BY_TWO_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
} else if (op == WINED3DTOP_MODULATE4X) {
|
||||
else if (op == WINED3D_TOP_MODULATE_4X)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV,
|
||||
GL_DISCARD_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
}
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADD:
|
||||
case WINED3DTOP_ADDSIGNED:
|
||||
case WINED3DTOP_ADDSIGNED2X:
|
||||
case WINED3D_TOP_ADD:
|
||||
case WINED3D_TOP_ADD_SIGNED:
|
||||
case WINED3D_TOP_ADD_SIGNED_2X:
|
||||
/* Input, arg1*1+arg2*1 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
@@ -235,19 +236,18 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
|
||||
|
||||
/* Output */
|
||||
if (op == WINED3DTOP_ADD) {
|
||||
if (op == WINED3D_TOP_ADD)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
} else if (op == WINED3DTOP_ADDSIGNED) {
|
||||
else if (op == WINED3D_TOP_ADD_SIGNED)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
|
||||
output, GL_NONE, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
} else if (op == WINED3DTOP_ADDSIGNED2X) {
|
||||
else if (op == WINED3D_TOP_ADD_SIGNED_2X)
|
||||
GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
|
||||
output, GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
}
|
||||
break;
|
||||
|
||||
case WINED3DTOP_SUBTRACT:
|
||||
case WINED3D_TOP_SUBTRACT:
|
||||
/* Input, arg1*1+-arg2*1 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
@@ -263,7 +263,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_ADDSMOOTH:
|
||||
case WINED3D_TOP_ADD_SMOOTH:
|
||||
/* Input, arg1*1+(1-arg1)*arg2 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
@@ -279,24 +279,30 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BLENDDIFFUSEALPHA:
|
||||
case WINED3DTOP_BLENDTEXTUREALPHA:
|
||||
case WINED3DTOP_BLENDFACTORALPHA:
|
||||
case WINED3DTOP_BLENDTEXTUREALPHAPM:
|
||||
case WINED3DTOP_BLENDCURRENTALPHA:
|
||||
case WINED3D_TOP_BLEND_DIFFUSE_ALPHA:
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA:
|
||||
case WINED3D_TOP_BLEND_FACTOR_ALPHA:
|
||||
case WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM:
|
||||
case WINED3D_TOP_BLEND_CURRENT_ALPHA:
|
||||
{
|
||||
GLenum alpha_src = GL_PRIMARY_COLOR_NV;
|
||||
if (op == WINED3DTOP_BLENDDIFFUSEALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_DIFFUSE, stage, texture_idx);
|
||||
else if (op == WINED3DTOP_BLENDTEXTUREALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
|
||||
else if (op == WINED3DTOP_BLENDFACTORALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_TFACTOR, stage, texture_idx);
|
||||
else if (op == WINED3DTOP_BLENDTEXTUREALPHAPM) alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
|
||||
else if (op == WINED3DTOP_BLENDCURRENTALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_CURRENT, stage, texture_idx);
|
||||
else FIXME("Unhandled WINED3DTOP %s, shouldn't happen\n", debug_d3dtop(op));
|
||||
if (op == WINED3D_TOP_BLEND_DIFFUSE_ALPHA)
|
||||
alpha_src = d3dta_to_combiner_input(WINED3DTA_DIFFUSE, stage, texture_idx);
|
||||
else if (op == WINED3D_TOP_BLEND_TEXTURE_ALPHA)
|
||||
alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
|
||||
else if (op == WINED3D_TOP_BLEND_FACTOR_ALPHA)
|
||||
alpha_src = d3dta_to_combiner_input(WINED3DTA_TFACTOR, stage, texture_idx);
|
||||
else if (op == WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM)
|
||||
alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
|
||||
else if (op == WINED3D_TOP_BLEND_CURRENT_ALPHA)
|
||||
alpha_src = d3dta_to_combiner_input(WINED3DTA_CURRENT, stage, texture_idx);
|
||||
else
|
||||
FIXME("Unhandled texture op %s, shouldn't happen.\n", debug_d3dtop(op));
|
||||
|
||||
/* Input, arg1*alpha_src+arg2*(1-alpha_src) */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
if (op == WINED3DTOP_BLENDTEXTUREALPHAPM)
|
||||
if (op == WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM)
|
||||
{
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
|
||||
@@ -315,9 +321,10 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
break;
|
||||
}
|
||||
|
||||
case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
|
||||
case WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR:
|
||||
/* Input, arg1_alpha*arg2_rgb+arg1_rgb*1 */
|
||||
if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEALPHA_ADDCOLOR)\n");
|
||||
if (is_alpha)
|
||||
ERR("Only supported for WINED3D_TSS_COLOR_OP (WINED3DTOP_MODULATEALPHA_ADDCOLOR).\n");
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], GL_ALPHA));
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
@@ -332,9 +339,10 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATECOLOR_ADDALPHA:
|
||||
case WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA:
|
||||
/* Input, arg1_rgb*arg2_rgb+arg1_alpha*1 */
|
||||
if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATECOLOR_ADDALPHA)\n");
|
||||
if (is_alpha)
|
||||
ERR("Only supported for WINED3D_TSS_COLOR_OP (WINED3DTOP_MODULATECOLOR_ADDALPHA).\n");
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
@@ -349,9 +357,10 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
|
||||
case WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR:
|
||||
/* Input, (1-arg1_alpha)*arg2_rgb+arg1_rgb*1 */
|
||||
if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEINVALPHA_ADDCOLOR)\n");
|
||||
if (is_alpha)
|
||||
ERR("Only supported for WINED3D_TSS_COLOR_OP (WINED3DTOP_MODULATEINVALPHA_ADDCOLOR).\n");
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), GL_ALPHA));
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
@@ -366,9 +375,10 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
|
||||
case WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA:
|
||||
/* Input, (1-arg1_rgb)*arg2_rgb+arg1_alpha*1 */
|
||||
if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEINVCOLOR_ADDALPHA)\n");
|
||||
if (is_alpha)
|
||||
ERR("Only supported for WINED3D_TSS_COLOR_OP (WINED3DTOP_MODULATEINVCOLOR_ADDALPHA).\n");
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
|
||||
@@ -383,7 +393,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_DOTPRODUCT3:
|
||||
case WINED3D_TOP_DOTPRODUCT3:
|
||||
/* Input, arg1 . arg2 */
|
||||
/* FIXME: DX7 uses a different calculation? */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
@@ -396,7 +406,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_MULTIPLYADD:
|
||||
case WINED3D_TOP_MULTIPLY_ADD:
|
||||
/* Input, arg3*1+arg1*arg2 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[2], tex_op_args.mapping[2], tex_op_args.component_usage[2]));
|
||||
@@ -412,7 +422,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_LERP:
|
||||
case WINED3D_TOP_LERP:
|
||||
/* Input, arg3*arg1+(1-arg3)*arg2 */
|
||||
GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
|
||||
tex_op_args.input[2], tex_op_args.mapping[2], tex_op_args.component_usage[2]));
|
||||
@@ -428,8 +438,8 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
|
||||
break;
|
||||
|
||||
case WINED3DTOP_BUMPENVMAPLUMINANCE:
|
||||
case WINED3DTOP_BUMPENVMAP:
|
||||
case WINED3D_TOP_BUMPENVMAP_LUMINANCE:
|
||||
case WINED3D_TOP_BUMPENVMAP:
|
||||
if (gl_info->supported[NV_TEXTURE_SHADER])
|
||||
{
|
||||
/* The bump map stage itself isn't exciting, just read the texture. But tell the next stage to
|
||||
@@ -448,7 +458,7 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
}
|
||||
|
||||
default:
|
||||
FIXME("Unhandled WINED3DTOP: stage %d, is_alpha %d, op %s (%#x), arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",
|
||||
FIXME("Unhandled texture op: stage %d, is_alpha %d, op %s (%#x), arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d.\n",
|
||||
stage, is_alpha, debug_d3dtop(op), op, arg1, arg2, arg3, texture_idx);
|
||||
}
|
||||
|
||||
@@ -456,13 +466,13 @@ void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d
|
||||
}
|
||||
|
||||
|
||||
static void nvrc_colorop(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void nvrc_colorop(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||
BOOL tex_used = stateblock->device->fixed_function_usage_map & (1 << stage);
|
||||
DWORD mapped_stage = stateblock->device->texUnitMap[stage];
|
||||
const struct wined3d_device *device = context->swapchain->device;
|
||||
BOOL tex_used = device->fixed_function_usage_map & (1 << stage);
|
||||
DWORD mapped_stage = device->texUnitMap[stage];
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
const struct wined3d_state *state = &stateblock->state;
|
||||
|
||||
TRACE("Setting color op for stage %u.\n", stage);
|
||||
|
||||
@@ -478,8 +488,7 @@ static void nvrc_colorop(DWORD state_id, struct wined3d_stateblock *stateblock,
|
||||
FIXME("Attempt to enable unsupported stage!\n");
|
||||
return;
|
||||
}
|
||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
||||
checkGLcall("glActiveTextureARB");
|
||||
context_active_texture(context, gl_info, mapped_stage);
|
||||
}
|
||||
|
||||
if (state->lowest_disabled_stage > 0)
|
||||
@@ -540,53 +549,52 @@ static void nvrc_colorop(DWORD state_id, struct wined3d_stateblock *stateblock,
|
||||
|
||||
/* Set the texture combiners */
|
||||
set_tex_op_nvrc(gl_info, state, FALSE, stage,
|
||||
state->texture_states[stage][WINED3DTSS_COLOROP],
|
||||
state->texture_states[stage][WINED3DTSS_COLORARG1],
|
||||
state->texture_states[stage][WINED3DTSS_COLORARG2],
|
||||
state->texture_states[stage][WINED3DTSS_COLORARG0],
|
||||
state->texture_states[stage][WINED3D_TSS_COLOR_OP],
|
||||
state->texture_states[stage][WINED3D_TSS_COLOR_ARG1],
|
||||
state->texture_states[stage][WINED3D_TSS_COLOR_ARG2],
|
||||
state->texture_states[stage][WINED3D_TSS_COLOR_ARG0],
|
||||
mapped_stage,
|
||||
state->texture_states[stage][WINED3DTSS_RESULTARG]);
|
||||
state->texture_states[stage][WINED3D_TSS_RESULT_ARG]);
|
||||
|
||||
/* In register combiners bump mapping is done in the stage AFTER the one that has the bump map operation set,
|
||||
* thus the texture shader may have to be updated
|
||||
*/
|
||||
if (gl_info->supported[NV_TEXTURE_SHADER2])
|
||||
{
|
||||
BOOL usesBump = (state->texture_states[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE
|
||||
|| state->texture_states[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP);
|
||||
BOOL usesBump = (state->texture_states[stage][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_BUMPENVMAP_LUMINANCE
|
||||
|| state->texture_states[stage][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_BUMPENVMAP);
|
||||
BOOL usedBump = !!(context->texShaderBumpMap & 1 << (stage + 1));
|
||||
if (usesBump != usedBump)
|
||||
{
|
||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage + 1));
|
||||
checkGLcall("glActiveTextureARB");
|
||||
context_active_texture(context, gl_info, mapped_stage + 1);
|
||||
nvts_activate_dimensions(state, stage + 1, context);
|
||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
||||
checkGLcall("glActiveTextureARB");
|
||||
context_active_texture(context, gl_info, mapped_stage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void nvts_texdim(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void nvts_texdim(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
DWORD sampler = state_id - STATE_SAMPLER(0);
|
||||
DWORD mapped_stage = stateblock->device->texUnitMap[sampler];
|
||||
const struct wined3d_state *state = &stateblock->state;
|
||||
DWORD mapped_stage = context->swapchain->device->texUnitMap[sampler];
|
||||
|
||||
/* No need to enable / disable anything here for unused samplers. The tex_colorop
|
||||
* handler takes care. Also no action is needed with pixel shaders, or if tex_colorop
|
||||
* will take care of this business
|
||||
*/
|
||||
if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures) return;
|
||||
if (sampler >= state->lowest_disabled_stage) return;
|
||||
if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return;
|
||||
* will take care of this business. */
|
||||
if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures)
|
||||
return;
|
||||
if (sampler >= state->lowest_disabled_stage)
|
||||
return;
|
||||
if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3D_TSS_COLOR_OP)))
|
||||
return;
|
||||
|
||||
nvts_activate_dimensions(state, sampler, context);
|
||||
}
|
||||
|
||||
static void nvts_bumpenvmat(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void nvts_bumpenvmat(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||
DWORD mapped_stage = stateblock->device->texUnitMap[stage + 1];
|
||||
DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||
DWORD mapped_stage = context->swapchain->device->texUnitMap[stage + 1];
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
float mat[2][2];
|
||||
|
||||
@@ -598,25 +606,25 @@ static void nvts_bumpenvmat(DWORD state, struct wined3d_stateblock *stateblock,
|
||||
*/
|
||||
if (mapped_stage < gl_info->limits.textures)
|
||||
{
|
||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
||||
checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage))");
|
||||
context_active_texture(context, gl_info, mapped_stage);
|
||||
|
||||
/* We can't just pass a pointer to the stateblock to GL due to the
|
||||
/* We can't just pass a pointer to the state to GL due to the
|
||||
* different matrix format (column major vs row major). */
|
||||
mat[0][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT00]);
|
||||
mat[1][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT01]);
|
||||
mat[0][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT10]);
|
||||
mat[1][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT11]);
|
||||
mat[0][0] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT00]);
|
||||
mat[1][0] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT01]);
|
||||
mat[0][1] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT10]);
|
||||
mat[1][1] = *((float *)&state->texture_states[stage][WINED3D_TSS_BUMPENV_MAT11]);
|
||||
glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float *)mat);
|
||||
checkGLcall("glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, mat)");
|
||||
}
|
||||
}
|
||||
|
||||
static void nvrc_texfactor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||
static void nvrc_texfactor(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
float col[4];
|
||||
D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col);
|
||||
|
||||
D3DCOLORTOGLFLOAT4(state->render_states[WINED3D_RS_TEXTUREFACTOR], col);
|
||||
GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));
|
||||
}
|
||||
|
||||
@@ -719,121 +727,122 @@ static BOOL nvts_color_fixup_supported(struct color_fixup_desc fixup)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static const struct StateEntryTemplate nvrc_fragmentstate_template[] = {
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
static const struct StateEntryTemplate nvrc_fragmentstate_template[] =
|
||||
{
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(0, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(0, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(1, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(1, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(2, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(2, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(3, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(3, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(4, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(4, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(5, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(5, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(6, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(6, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), { STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG1), { STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG2), { STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), { STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), tex_alphaop }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG1), { STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG2), { STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT01), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT10), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT11), { STATE_TEXTURESTAGE(7, WINED3D_TSS_BUMPENV_MAT00), NULL }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG0), { STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG0), { STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_TEXTURESTAGE(7, WINED3D_TSS_RESULT_ARG), { STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_texfactor }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), { STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), nvrc_texfactor }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGCOLOR), { STATE_RENDER(WINED3D_RS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGDENSITY), { STATE_RENDER(WINED3D_RS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGENABLE), { STATE_RENDER(WINED3D_RS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGTABLEMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGSTART), { STATE_RENDER(WINED3D_RS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_RENDER(WINED3D_RS_FOGEND), { STATE_RENDER(WINED3D_RS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), nvts_texdim }, NV_TEXTURE_SHADER2 },
|
||||
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
|
||||
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), nvts_texdim }, NV_TEXTURE_SHADER2 },
|
||||
|
||||
@@ -133,7 +133,7 @@ HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette,
|
||||
/* If the palette is attached to the render target, update all render targets */
|
||||
LIST_FOR_EACH_ENTRY(resource, &palette->device->resources, struct wined3d_resource, resource_list_entry)
|
||||
{
|
||||
if (resource->resourceType == WINED3DRTYPE_SURFACE)
|
||||
if (resource->type == WINED3D_RTYPE_SURFACE)
|
||||
{
|
||||
struct wined3d_surface *surface = surface_from_resource(resource);
|
||||
if (surface->palette == palette)
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* IWineD3DQuery implementation
|
||||
*
|
||||
* Copyright 2005 Oliver Stieber
|
||||
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
|
||||
* Copyright 2009-2010 Henri Verbeet for CodeWeavers.
|
||||
@@ -37,8 +35,8 @@ void wined3d_event_query_destroy(struct wined3d_event_query *query)
|
||||
HeapFree(GetProcessHeap(), 0, query);
|
||||
}
|
||||
|
||||
static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query,
|
||||
struct wined3d_device *device)
|
||||
static enum wined3d_event_query_result wined3d_event_query_test(const struct wined3d_event_query *query,
|
||||
const struct wined3d_device *device)
|
||||
{
|
||||
struct wined3d_context *context;
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
@@ -112,8 +110,8 @@ static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_e
|
||||
return ret;
|
||||
}
|
||||
|
||||
enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_query *query,
|
||||
struct wined3d_device *device)
|
||||
enum wined3d_event_query_result wined3d_event_query_finish(const struct wined3d_event_query *query,
|
||||
const struct wined3d_device *device)
|
||||
{
|
||||
struct wined3d_context *context;
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
@@ -181,7 +179,7 @@ enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_
|
||||
return ret;
|
||||
}
|
||||
|
||||
void wined3d_event_query_issue(struct wined3d_event_query *query, struct wined3d_device *device)
|
||||
void wined3d_event_query_issue(struct wined3d_event_query *query, const struct wined3d_device *device)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
struct wined3d_context *context;
|
||||
@@ -253,12 +251,12 @@ ULONG CDECL wined3d_query_decref(struct wined3d_query *query)
|
||||
* deleting the query will obviously leak it, but that's still better
|
||||
* than potentially deleting a different query with the same id in this
|
||||
* context, and (still) leaking the actual query. */
|
||||
if (query->type == WINED3DQUERYTYPE_EVENT)
|
||||
if (query->type == WINED3D_QUERY_TYPE_EVENT)
|
||||
{
|
||||
struct wined3d_event_query *event_query = query->extendedData;
|
||||
if (event_query) wined3d_event_query_destroy(event_query);
|
||||
}
|
||||
else if (query->type == WINED3DQUERYTYPE_OCCLUSION)
|
||||
else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION)
|
||||
{
|
||||
struct wined3d_occlusion_query *oq = query->extendedData;
|
||||
|
||||
@@ -414,7 +412,7 @@ static HRESULT wined3d_event_query_ops_get_data(struct wined3d_query *query,
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
WINED3DQUERYTYPE CDECL wined3d_query_get_type(const struct wined3d_query *query)
|
||||
enum wined3d_query_type CDECL wined3d_query_get_type(const struct wined3d_query *query)
|
||||
{
|
||||
TRACE("query %p.\n", query);
|
||||
|
||||
@@ -549,13 +547,13 @@ static const struct wined3d_query_ops occlusion_query_ops =
|
||||
wined3d_occlusion_query_ops_issue,
|
||||
};
|
||||
|
||||
static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *device, WINED3DQUERYTYPE type)
|
||||
static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *device, enum wined3d_query_type type)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case WINED3DQUERYTYPE_OCCLUSION:
|
||||
case WINED3D_QUERY_TYPE_OCCLUSION:
|
||||
TRACE("Occlusion query.\n");
|
||||
if (!gl_info->supported[ARB_OCCLUSION_QUERY])
|
||||
{
|
||||
@@ -573,7 +571,7 @@ static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *de
|
||||
((struct wined3d_occlusion_query *)query->extendedData)->context = NULL;
|
||||
break;
|
||||
|
||||
case WINED3DQUERYTYPE_EVENT:
|
||||
case WINED3D_QUERY_TYPE_EVENT:
|
||||
TRACE("Event query.\n");
|
||||
if (!wined3d_event_query_supported(gl_info))
|
||||
{
|
||||
@@ -593,18 +591,18 @@ static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *de
|
||||
}
|
||||
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:
|
||||
case WINED3D_QUERY_TYPE_VCACHE:
|
||||
case WINED3D_QUERY_TYPE_RESOURCE_MANAGER:
|
||||
case WINED3D_QUERY_TYPE_VERTEX_STATS:
|
||||
case WINED3D_QUERY_TYPE_TIMESTAMP:
|
||||
case WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT:
|
||||
case WINED3D_QUERY_TYPE_TIMESTAMP_FREQ:
|
||||
case WINED3D_QUERY_TYPE_PIPELINE_TIMINGS:
|
||||
case WINED3D_QUERY_TYPE_INTERFACE_TIMINGS:
|
||||
case WINED3D_QUERY_TYPE_VERTEX_TIMINGS:
|
||||
case WINED3D_QUERY_TYPE_PIXEL_TIMINGS:
|
||||
case WINED3D_QUERY_TYPE_BANDWIDTH_TIMINGS:
|
||||
case WINED3D_QUERY_TYPE_CACHE_UTILIZATION:
|
||||
default:
|
||||
FIXME("Unhandled query type %#x.\n", type);
|
||||
return WINED3DERR_NOTAVAILABLE;
|
||||
@@ -619,7 +617,7 @@ static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *de
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_query_create(struct wined3d_device *device,
|
||||
WINED3DQUERYTYPE type, struct wined3d_query **query)
|
||||
enum wined3d_query_type type, struct wined3d_query **query)
|
||||
{
|
||||
struct wined3d_query *object;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* IWineD3DResource Implementation
|
||||
*
|
||||
* Copyright 2002-2004 Jason Edmeades
|
||||
* Copyright 2003-2004 Raphael Junqueira
|
||||
* Copyright 2004 Christian Costa
|
||||
@@ -43,20 +41,20 @@ struct private_data
|
||||
DWORD size;
|
||||
};
|
||||
|
||||
static DWORD resource_access_from_pool(WINED3DPOOL pool)
|
||||
static DWORD resource_access_from_pool(enum wined3d_pool pool)
|
||||
{
|
||||
switch (pool)
|
||||
{
|
||||
case WINED3DPOOL_DEFAULT:
|
||||
case WINED3D_POOL_DEFAULT:
|
||||
return WINED3D_RESOURCE_ACCESS_GPU;
|
||||
|
||||
case WINED3DPOOL_MANAGED:
|
||||
case WINED3D_POOL_MANAGED:
|
||||
return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU;
|
||||
|
||||
case WINED3DPOOL_SYSTEMMEM:
|
||||
case WINED3D_POOL_SYSTEM_MEM:
|
||||
return WINED3D_RESOURCE_ACCESS_CPU;
|
||||
|
||||
case WINED3DPOOL_SCRATCH:
|
||||
case WINED3D_POOL_SCRATCH:
|
||||
return WINED3D_RESOURCE_ACCESS_SCRATCH;
|
||||
|
||||
default:
|
||||
@@ -79,15 +77,15 @@ static void resource_check_usage(DWORD usage)
|
||||
}
|
||||
|
||||
HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *device,
|
||||
WINED3DRESOURCETYPE resource_type, const struct wined3d_format *format,
|
||||
WINED3DMULTISAMPLE_TYPE multisample_type, UINT multisample_quality,
|
||||
DWORD usage, WINED3DPOOL pool, UINT width, UINT height, UINT depth, UINT size,
|
||||
enum wined3d_resource_type type, const struct wined3d_format *format,
|
||||
enum wined3d_multisample_type multisample_type, UINT multisample_quality,
|
||||
DWORD usage, enum wined3d_pool pool, UINT width, UINT height, UINT depth, UINT size,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops,
|
||||
const struct wined3d_resource_ops *resource_ops)
|
||||
{
|
||||
resource->ref = 1;
|
||||
resource->device = device;
|
||||
resource->resourceType = resource_type;
|
||||
resource->type = type;
|
||||
resource->format = format;
|
||||
resource->multisample_type = multisample_type;
|
||||
resource->multisample_quality = multisample_quality;
|
||||
@@ -125,7 +123,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
|
||||
+ (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
|
||||
|
||||
/* Check that we have enough video ram left */
|
||||
if (pool == WINED3DPOOL_DEFAULT)
|
||||
if (pool == WINED3D_POOL_DEFAULT)
|
||||
{
|
||||
if (size > wined3d_device_get_available_texture_mem(device))
|
||||
{
|
||||
@@ -133,7 +131,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
|
||||
HeapFree(GetProcessHeap(), 0, resource->heapMemory);
|
||||
return WINED3DERR_OUTOFVIDEOMEMORY;
|
||||
}
|
||||
WineD3DAdapterChangeGLRam(device, size);
|
||||
adapter_adjust_memory(device->adapter, size);
|
||||
}
|
||||
|
||||
device_resource_add(device, resource);
|
||||
@@ -149,16 +147,16 @@ void resource_cleanup(struct wined3d_resource *resource)
|
||||
|
||||
TRACE("Cleaning up resource %p.\n", resource);
|
||||
|
||||
if (resource->pool == WINED3DPOOL_DEFAULT)
|
||||
if (resource->pool == WINED3D_POOL_DEFAULT)
|
||||
{
|
||||
TRACE("Decrementing device memory pool by %u.\n", resource->size);
|
||||
WineD3DAdapterChangeGLRam(resource->device, 0 - resource->size);
|
||||
adapter_adjust_memory(resource->device->adapter, 0 - resource->size);
|
||||
}
|
||||
|
||||
LIST_FOR_EACH_SAFE(e1, e2, &resource->privateData)
|
||||
{
|
||||
data = LIST_ENTRY(e1, struct private_data, entry);
|
||||
hr = resource_free_private_data(resource, &data->tag);
|
||||
hr = wined3d_resource_free_private_data(resource, &data->tag);
|
||||
if (FAILED(hr))
|
||||
ERR("Failed to free private data when destroying resource %p, hr = %#x.\n", resource, hr);
|
||||
}
|
||||
@@ -174,7 +172,7 @@ void resource_cleanup(struct wined3d_resource *resource)
|
||||
void resource_unload(struct wined3d_resource *resource)
|
||||
{
|
||||
context_resource_unloaded(resource->device,
|
||||
resource, resource->resourceType);
|
||||
resource, resource->type);
|
||||
}
|
||||
|
||||
static struct private_data *resource_find_private_data(const struct wined3d_resource *resource, REFGUID tag)
|
||||
@@ -195,7 +193,7 @@ static struct private_data *resource_find_private_data(const struct wined3d_reso
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HRESULT resource_set_private_data(struct wined3d_resource *resource, REFGUID guid,
|
||||
HRESULT CDECL wined3d_resource_set_private_data(struct wined3d_resource *resource, REFGUID guid,
|
||||
const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
struct private_data *d;
|
||||
@@ -203,7 +201,7 @@ HRESULT resource_set_private_data(struct wined3d_resource *resource, REFGUID gui
|
||||
TRACE("resource %p, riid %s, data %p, data_size %u, flags %#x.\n",
|
||||
resource, debugstr_guid(guid), data, data_size, flags);
|
||||
|
||||
resource_free_private_data(resource, guid);
|
||||
wined3d_resource_free_private_data(resource, guid);
|
||||
|
||||
d = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*d));
|
||||
if (!d) return E_OUTOFMEMORY;
|
||||
@@ -239,7 +237,8 @@ HRESULT resource_set_private_data(struct wined3d_resource *resource, REFGUID gui
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT resource_get_private_data(const struct wined3d_resource *resource, REFGUID guid, void *data, DWORD *data_size)
|
||||
HRESULT CDECL wined3d_resource_get_private_data(const struct wined3d_resource *resource, REFGUID guid,
|
||||
void *data, DWORD *data_size)
|
||||
{
|
||||
const struct private_data *d;
|
||||
|
||||
@@ -273,7 +272,7 @@ HRESULT resource_get_private_data(const struct wined3d_resource *resource, REFGU
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
HRESULT resource_free_private_data(struct wined3d_resource *resource, REFGUID guid)
|
||||
HRESULT CDECL wined3d_resource_free_private_data(struct wined3d_resource *resource, REFGUID guid)
|
||||
{
|
||||
struct private_data *data;
|
||||
|
||||
@@ -319,7 +318,7 @@ void * CDECL wined3d_resource_get_parent(const struct wined3d_resource *resource
|
||||
|
||||
void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, struct wined3d_resource_desc *desc)
|
||||
{
|
||||
desc->resource_type = resource->resourceType;
|
||||
desc->resource_type = resource->type;
|
||||
desc->format = resource->format->id;
|
||||
desc->multisample_type = resource->multisample_type;
|
||||
desc->multisample_quality = resource->multisample_quality;
|
||||
|
||||
@@ -64,10 +64,12 @@ static const char * const shader_opcode_names[] =
|
||||
/* WINED3DSIH_ENDIF */ "endif",
|
||||
/* WINED3DSIH_ENDLOOP */ "endloop",
|
||||
/* WINED3DSIH_ENDREP */ "endrep",
|
||||
/* WINED3DSIH_EQ */ "eq",
|
||||
/* WINED3DSIH_EXP */ "exp",
|
||||
/* WINED3DSIH_EXPP */ "expp",
|
||||
/* WINED3DSIH_FRC */ "frc",
|
||||
/* WINED3DSIH_FTOI */ "ftoi",
|
||||
/* WINED3DSIH_GE */ "ge",
|
||||
/* WINED3DSIH_IADD */ "iadd",
|
||||
/* WINED3DSIH_IEQ */ "ieq",
|
||||
/* WINED3DSIH_IF */ "if",
|
||||
@@ -102,6 +104,7 @@ static const char * const shader_opcode_names[] =
|
||||
/* WINED3DSIH_RCP */ "rcp",
|
||||
/* WINED3DSIH_REP */ "rep",
|
||||
/* WINED3DSIH_RET */ "ret",
|
||||
/* WINED3DSIH_ROUND_NI */ "round_ni",
|
||||
/* WINED3DSIH_RSQ */ "rsq",
|
||||
/* WINED3DSIH_SAMPLE */ "sample",
|
||||
/* WINED3DSIH_SAMPLE_GRAD */ "sample_d",
|
||||
@@ -135,7 +138,10 @@ static const char * const shader_opcode_names[] =
|
||||
/* WINED3DSIH_TEXREG2AR */ "texreg2ar",
|
||||
/* WINED3DSIH_TEXREG2GB */ "texreg2gb",
|
||||
/* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
|
||||
/* WINED3DSIH_UDIV */ "udiv",
|
||||
/* WINED3DSIH_USHR */ "ushr",
|
||||
/* WINED3DSIH_UTOF */ "utof",
|
||||
/* WINED3DSIH_XOR */ "xor",
|
||||
};
|
||||
|
||||
static const char * const semantic_names[] =
|
||||
@@ -311,7 +317,7 @@ static void shader_init(struct wined3d_shader *shader, struct wined3d_device *de
|
||||
|
||||
/* 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)
|
||||
static unsigned int shader_get_float_offset(enum wined3d_shader_register_type register_type, UINT register_idx)
|
||||
{
|
||||
switch (register_type)
|
||||
{
|
||||
@@ -327,13 +333,13 @@ static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE re
|
||||
|
||||
static void shader_delete_constant_list(struct list *clist)
|
||||
{
|
||||
struct local_constant *constant;
|
||||
struct wined3d_shader_lconst *constant;
|
||||
struct list *ptr;
|
||||
|
||||
ptr = list_head(clist);
|
||||
while (ptr)
|
||||
{
|
||||
constant = LIST_ENTRY(ptr, struct local_constant, entry);
|
||||
constant = LIST_ENTRY(ptr, struct wined3d_shader_lconst, entry);
|
||||
ptr = list_next(clist, ptr);
|
||||
HeapFree(GetProcessHeap(), 0, constant);
|
||||
}
|
||||
@@ -530,7 +536,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
|
||||
struct wined3d_shader_src_param rel_addr;
|
||||
struct wined3d_shader_dst_param dst;
|
||||
|
||||
local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
|
||||
struct wined3d_shader_lconst *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(*lconst));
|
||||
if (!lconst) return E_OUTOFMEMORY;
|
||||
|
||||
fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
|
||||
@@ -560,7 +566,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
|
||||
struct wined3d_shader_src_param rel_addr;
|
||||
struct wined3d_shader_dst_param dst;
|
||||
|
||||
local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
|
||||
struct wined3d_shader_lconst *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(*lconst));
|
||||
if (!lconst) return E_OUTOFMEMORY;
|
||||
|
||||
fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
|
||||
@@ -577,7 +583,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
|
||||
struct wined3d_shader_src_param rel_addr;
|
||||
struct wined3d_shader_dst_param dst;
|
||||
|
||||
local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
|
||||
struct wined3d_shader_lconst *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(*lconst));
|
||||
if (!lconst) return E_OUTOFMEMORY;
|
||||
|
||||
fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
|
||||
@@ -589,33 +595,6 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
|
||||
list_add_head(&shader->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)
|
||||
{
|
||||
@@ -789,6 +768,16 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
|
||||
else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
|
||||
else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
|
||||
else if (ins.handler_idx == WINED3DSIH_POW) reg_maps->usespow = 1;
|
||||
else if (ins.handler_idx == WINED3DSIH_LOOP
|
||||
|| ins.handler_idx == WINED3DSIH_REP)
|
||||
{
|
||||
++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;
|
||||
|
||||
limit = ins.src_count + (ins.predicate ? 1 : 0);
|
||||
for (i = 0; i < limit; ++i)
|
||||
@@ -1099,7 +1088,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
|
||||
void shader_dump_src_param(const struct wined3d_shader_src_param *param,
|
||||
const struct wined3d_shader_version *shader_version)
|
||||
{
|
||||
DWORD src_modifier = param->modifiers;
|
||||
enum wined3d_shader_src_modifier src_modifier = param->modifiers;
|
||||
DWORD swizzle = param->swizzle;
|
||||
|
||||
if (src_modifier == WINED3DSPSM_NEG
|
||||
@@ -1164,7 +1153,7 @@ void shader_dump_src_param(const struct wined3d_shader_src_param *param,
|
||||
|
||||
/* 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(struct wined3d_shader *shader, struct wined3d_shader_buffer *buffer,
|
||||
void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_shader_buffer *buffer,
|
||||
const struct wined3d_shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx)
|
||||
{
|
||||
struct wined3d_device *device = shader->device;
|
||||
@@ -1439,12 +1428,12 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
|
||||
{
|
||||
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;
|
||||
case WINED3D_SHADER_REL_OP_GT: TRACE("_gt"); break;
|
||||
case WINED3D_SHADER_REL_OP_EQ: TRACE("_eq"); break;
|
||||
case WINED3D_SHADER_REL_OP_GE: TRACE("_ge"); break;
|
||||
case WINED3D_SHADER_REL_OP_LT: TRACE("_lt"); break;
|
||||
case WINED3D_SHADER_REL_OP_NE: TRACE("_ne"); break;
|
||||
case WINED3D_SHADER_REL_OP_LE: TRACE("_le"); break;
|
||||
default: TRACE("_(%u)", ins.flags);
|
||||
}
|
||||
}
|
||||
@@ -1502,7 +1491,7 @@ static void shader_none_load_np2fixup_constants(void *shader_priv,
|
||||
static void shader_none_destroy(struct wined3d_shader *shader) {}
|
||||
static HRESULT shader_none_alloc(struct wined3d_device *device) {return WINED3D_OK;}
|
||||
static void shader_none_free(struct wined3d_device *device) {}
|
||||
static BOOL shader_none_dirty_const(void) {return FALSE;}
|
||||
static void shader_none_context_destroyed(void *shader_priv, const struct wined3d_context *context) {}
|
||||
|
||||
static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
|
||||
{
|
||||
@@ -1547,17 +1536,19 @@ const struct wined3d_shader_backend_ops none_shader_backend =
|
||||
shader_none_destroy,
|
||||
shader_none_alloc,
|
||||
shader_none_free,
|
||||
shader_none_dirty_const,
|
||||
shader_none_context_destroyed,
|
||||
shader_none_get_caps,
|
||||
shader_none_color_fixup_supported,
|
||||
};
|
||||
|
||||
static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *byte_code,
|
||||
const struct wined3d_shader_signature *output_signature, DWORD float_const_count)
|
||||
const struct wined3d_shader_signature *output_signature, DWORD float_const_count,
|
||||
enum wined3d_shader_type type, unsigned int max_version)
|
||||
{
|
||||
struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
|
||||
const struct wined3d_shader_frontend *fe;
|
||||
HRESULT hr;
|
||||
unsigned int backend_version;
|
||||
|
||||
TRACE("shader %p, byte_code %p, output_signature %p, float_const_count %u.\n",
|
||||
shader, byte_code, output_signature, float_const_count);
|
||||
@@ -1591,6 +1582,35 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
|
||||
byte_code, float_const_count);
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
if (reg_maps->shader_version.type != type)
|
||||
{
|
||||
WARN("Wrong shader type %d.\n", reg_maps->shader_version.type);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
if (reg_maps->shader_version.major > max_version)
|
||||
{
|
||||
WARN("Shader version %d not supported by this D3D API version.\n", reg_maps->shader_version.major);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
switch (type)
|
||||
{
|
||||
case WINED3D_SHADER_TYPE_VERTEX:
|
||||
backend_version = shader->device->vshader_version;
|
||||
break;
|
||||
case WINED3D_SHADER_TYPE_PIXEL:
|
||||
backend_version = shader->device->pshader_version;
|
||||
break;
|
||||
default:
|
||||
FIXME("No backend version-checking for this shader type\n");
|
||||
backend_version = 0;
|
||||
}
|
||||
if (reg_maps->shader_version.major > backend_version)
|
||||
{
|
||||
WARN("Shader version %d.%d not supported by your GPU with the current shader backend.\n",
|
||||
reg_maps->shader_version.major, reg_maps->shader_version.minor);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
shader->function = HeapAlloc(GetProcessHeap(), 0, shader->functionLength);
|
||||
if (!shader->function)
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1674,7 +1694,7 @@ HRESULT CDECL wined3d_shader_set_local_constants_float(struct wined3d_shader *sh
|
||||
|
||||
for (i = start_idx; i < end_idx; ++i)
|
||||
{
|
||||
struct local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
|
||||
struct wined3d_shader_lconst *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(*lconst));
|
||||
if (!lconst)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
@@ -1689,10 +1709,10 @@ HRESULT CDECL wined3d_shader_set_local_constants_float(struct wined3d_shader *sh
|
||||
void find_vs_compile_args(const struct wined3d_state *state,
|
||||
const struct wined3d_shader *shader, struct vs_compile_args *args)
|
||||
{
|
||||
args->fog_src = state->render_states[WINED3DRS_FOGTABLEMODE]
|
||||
== WINED3DFOG_NONE ? VS_FOG_COORD : VS_FOG_Z;
|
||||
args->clip_enabled = state->render_states[WINED3DRS_CLIPPING]
|
||||
&& state->render_states[WINED3DRS_CLIPPLANEENABLE];
|
||||
args->fog_src = state->render_states[WINED3D_RS_FOGTABLEMODE]
|
||||
== WINED3D_FOG_NONE ? VS_FOG_COORD : VS_FOG_Z;
|
||||
args->clip_enabled = state->render_states[WINED3D_RS_CLIPPING]
|
||||
&& state->render_states[WINED3D_RS_CLIPPLANEENABLE];
|
||||
args->swizzle_map = shader->device->strided_streams.swizzle_map;
|
||||
}
|
||||
|
||||
@@ -1706,7 +1726,7 @@ static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_id
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL vshader_get_input(struct wined3d_shader *shader,
|
||||
BOOL vshader_get_input(const struct wined3d_shader *shader,
|
||||
BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum)
|
||||
{
|
||||
WORD map = shader->reg_maps.input_registers;
|
||||
@@ -1802,7 +1822,7 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
|
||||
|
||||
static HRESULT vertexshader_init(struct wined3d_shader *shader, struct wined3d_device *device,
|
||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops, unsigned int max_version)
|
||||
{
|
||||
struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
|
||||
unsigned int i;
|
||||
@@ -1812,7 +1832,8 @@ static HRESULT vertexshader_init(struct wined3d_shader *shader, struct wined3d_d
|
||||
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
||||
|
||||
shader_init(shader, device, parent, parent_ops);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, device->d3d_vshader_constantF);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, device->d3d_vshader_constantF,
|
||||
WINED3D_SHADER_TYPE_VERTEX, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to set function, hr %#x.\n", hr);
|
||||
@@ -1851,12 +1872,13 @@ static HRESULT vertexshader_init(struct wined3d_shader *shader, struct wined3d_d
|
||||
|
||||
static HRESULT geometryshader_init(struct wined3d_shader *shader, struct wined3d_device *device,
|
||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops, unsigned int max_version)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
shader_init(shader, device, parent, parent_ops);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, 0);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, 0,
|
||||
WINED3D_SHADER_TYPE_GEOMETRY, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to set function, hr %#x.\n", hr);
|
||||
@@ -1877,9 +1899,9 @@ void find_ps_compile_args(const struct wined3d_state *state,
|
||||
UINT i;
|
||||
|
||||
memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
|
||||
if (state->render_states[WINED3DRS_SRGBWRITEENABLE])
|
||||
if (state->render_states[WINED3D_RS_SRGBWRITEENABLE])
|
||||
{
|
||||
struct wined3d_surface *rt = device->fb.render_targets[0];
|
||||
const struct wined3d_surface *rt = state->fb->render_targets[0];
|
||||
if (rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE) args->srgb_correction = 1;
|
||||
}
|
||||
|
||||
@@ -1888,11 +1910,48 @@ void find_ps_compile_args(const struct wined3d_state *state,
|
||||
{
|
||||
for (i = 0; i < 4; ++i)
|
||||
{
|
||||
DWORD flags = state->texture_states[i][WINED3DTSS_TEXTURETRANSFORMFLAGS];
|
||||
DWORD tex_transform = flags & ~WINED3DTTFF_PROJECTED;
|
||||
if (flags & WINED3DTTFF_PROJECTED)
|
||||
tex_transform |= WINED3D_PSARGS_PROJECTED;
|
||||
args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT;
|
||||
DWORD flags = state->texture_states[i][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS];
|
||||
|
||||
if (flags & WINED3D_TTFF_PROJECTED)
|
||||
{
|
||||
enum wined3d_sampler_texture_type sampler_type = shader->reg_maps.sampler_type[i];
|
||||
DWORD tex_transform = flags & ~WINED3D_TTFF_PROJECTED;
|
||||
DWORD max_valid = WINED3D_TTFF_COUNT4;
|
||||
|
||||
if (!state->vertex_shader)
|
||||
{
|
||||
unsigned int j;
|
||||
unsigned int index = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
|
||||
for (j = 0; j < state->vertex_declaration->element_count; ++j)
|
||||
{
|
||||
struct wined3d_vertex_declaration_element *element =
|
||||
&state->vertex_declaration->elements[j];
|
||||
|
||||
if (element->usage == WINED3DDECLUSAGE_TEXCOORD
|
||||
&& element->usage_idx == index)
|
||||
{
|
||||
max_valid = element->format->component_count;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!tex_transform || tex_transform > max_valid)
|
||||
{
|
||||
WARN("Fixing up projected texture transform flags from %#x to %#x.\n",
|
||||
tex_transform, max_valid);
|
||||
tex_transform = max_valid;
|
||||
}
|
||||
|
||||
if ((sampler_type == WINED3DSTT_1D && tex_transform > WINED3D_TTFF_COUNT1)
|
||||
|| (sampler_type == WINED3DSTT_2D && tex_transform > WINED3D_TTFF_COUNT2)
|
||||
|| (sampler_type == WINED3DSTT_VOLUME && tex_transform > WINED3D_TTFF_COUNT3))
|
||||
tex_transform |= WINED3D_PSARGS_PROJECTED;
|
||||
else
|
||||
WARN("Application requested projected texture with unsuitable texture coordinates.\n");
|
||||
|
||||
args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1935,29 +1994,29 @@ void find_ps_compile_args(const struct wined3d_state *state,
|
||||
else
|
||||
{
|
||||
args->vp_mode = vertexshader;
|
||||
if (state->render_states[WINED3DRS_FOGENABLE])
|
||||
if (state->render_states[WINED3D_RS_FOGENABLE])
|
||||
{
|
||||
switch (state->render_states[WINED3DRS_FOGTABLEMODE])
|
||||
switch (state->render_states[WINED3D_RS_FOGTABLEMODE])
|
||||
{
|
||||
case WINED3DFOG_NONE:
|
||||
case WINED3D_FOG_NONE:
|
||||
if (device->strided_streams.position_transformed || use_vs(state))
|
||||
{
|
||||
args->fog = FOG_LINEAR;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (state->render_states[WINED3DRS_FOGVERTEXMODE])
|
||||
switch (state->render_states[WINED3D_RS_FOGVERTEXMODE])
|
||||
{
|
||||
case WINED3DFOG_NONE: /* Fall through. */
|
||||
case WINED3DFOG_LINEAR: args->fog = FOG_LINEAR; break;
|
||||
case WINED3DFOG_EXP: args->fog = FOG_EXP; break;
|
||||
case WINED3DFOG_EXP2: args->fog = FOG_EXP2; break;
|
||||
case WINED3D_FOG_NONE: /* Fall through. */
|
||||
case WINED3D_FOG_LINEAR: args->fog = FOG_LINEAR; break;
|
||||
case WINED3D_FOG_EXP: args->fog = FOG_EXP; break;
|
||||
case WINED3D_FOG_EXP2: args->fog = FOG_EXP2; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WINED3DFOG_LINEAR: args->fog = FOG_LINEAR; break;
|
||||
case WINED3DFOG_EXP: args->fog = FOG_EXP; break;
|
||||
case WINED3DFOG_EXP2: args->fog = FOG_EXP2; break;
|
||||
case WINED3D_FOG_LINEAR: args->fog = FOG_LINEAR; break;
|
||||
case WINED3D_FOG_EXP: args->fog = FOG_EXP; break;
|
||||
case WINED3D_FOG_EXP2: args->fog = FOG_EXP2; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -2057,7 +2116,7 @@ static void pixelshader_set_limits(struct wined3d_shader *shader)
|
||||
|
||||
static HRESULT pixelshader_init(struct wined3d_shader *shader, struct wined3d_device *device,
|
||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops, unsigned int max_version)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
|
||||
@@ -2066,7 +2125,8 @@ static HRESULT pixelshader_init(struct wined3d_shader *shader, struct wined3d_de
|
||||
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
||||
|
||||
shader_init(shader, device, parent, parent_ops);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, device->d3d_pshader_constantF);
|
||||
hr = shader_set_function(shader, byte_code, output_signature, device->d3d_pshader_constantF,
|
||||
WINED3D_SHADER_TYPE_PIXEL, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to set function, hr %#x.\n", hr);
|
||||
@@ -2123,7 +2183,7 @@ static HRESULT pixelshader_init(struct wined3d_shader *shader, struct wined3d_de
|
||||
|
||||
void pixelshader_update_samplers(struct wined3d_shader_reg_maps *reg_maps, struct wined3d_texture * const *textures)
|
||||
{
|
||||
WINED3DSAMPLER_TEXTURE_TYPE *sampler_type = reg_maps->sampler_type;
|
||||
enum wined3d_sampler_texture_type *sampler_type = reg_maps->sampler_type;
|
||||
unsigned int i;
|
||||
|
||||
if (reg_maps->shader_version.major != 1) return;
|
||||
@@ -2167,7 +2227,7 @@ void pixelshader_update_samplers(struct wined3d_shader_reg_maps *reg_maps, struc
|
||||
|
||||
HRESULT CDECL wined3d_shader_create_gs(struct wined3d_device *device, const DWORD *byte_code,
|
||||
const struct wined3d_shader_signature *output_signature, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader, unsigned int max_version)
|
||||
{
|
||||
struct wined3d_shader *object;
|
||||
HRESULT hr;
|
||||
@@ -2182,7 +2242,7 @@ HRESULT CDECL wined3d_shader_create_gs(struct wined3d_device *device, const DWOR
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = geometryshader_init(object, device, byte_code, output_signature, parent, parent_ops);
|
||||
hr = geometryshader_init(object, device, byte_code, output_signature, parent, parent_ops, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize geometry shader, hr %#x.\n", hr);
|
||||
@@ -2198,7 +2258,7 @@ HRESULT CDECL wined3d_shader_create_gs(struct wined3d_device *device, const DWOR
|
||||
|
||||
HRESULT CDECL wined3d_shader_create_ps(struct wined3d_device *device, const DWORD *byte_code,
|
||||
const struct wined3d_shader_signature *output_signature, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader, unsigned int max_version)
|
||||
{
|
||||
struct wined3d_shader *object;
|
||||
HRESULT hr;
|
||||
@@ -2216,7 +2276,7 @@ HRESULT CDECL wined3d_shader_create_ps(struct wined3d_device *device, const DWOR
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = pixelshader_init(object, device, byte_code, output_signature, parent, parent_ops);
|
||||
hr = pixelshader_init(object, device, byte_code, output_signature, parent, parent_ops, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize pixel shader, hr %#x.\n", hr);
|
||||
@@ -2232,7 +2292,7 @@ HRESULT CDECL wined3d_shader_create_ps(struct wined3d_device *device, const DWOR
|
||||
|
||||
HRESULT CDECL wined3d_shader_create_vs(struct wined3d_device *device, const DWORD *byte_code,
|
||||
const struct wined3d_shader_signature *output_signature, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader, unsigned int max_version)
|
||||
{
|
||||
struct wined3d_shader *object;
|
||||
HRESULT hr;
|
||||
@@ -2250,7 +2310,7 @@ HRESULT CDECL wined3d_shader_create_vs(struct wined3d_device *device, const DWOR
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = vertexshader_init(object, device, byte_code, output_signature, parent, parent_ops);
|
||||
hr = vertexshader_init(object, device, byte_code, output_signature, parent, parent_ops, max_version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize vertex shader, hr %#x.\n", hr);
|
||||
|
||||
@@ -57,15 +57,19 @@ enum wined3d_sm4_opcode
|
||||
WINED3D_SM4_OP_BREAK = 0x02,
|
||||
WINED3D_SM4_OP_BREAKC = 0x03,
|
||||
WINED3D_SM4_OP_CUT = 0x09,
|
||||
WINED3D_SM4_OP_DERIV_RTX = 0x0b,
|
||||
WINED3D_SM4_OP_DERIV_RTY = 0x0c,
|
||||
WINED3D_SM4_OP_DIV = 0x0e,
|
||||
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_EQ = 0x18,
|
||||
WINED3D_SM4_OP_EXP = 0x19,
|
||||
WINED3D_SM4_OP_FRC = 0x1a,
|
||||
WINED3D_SM4_OP_FTOI = 0x1b,
|
||||
WINED3D_SM4_OP_GE = 0x1d,
|
||||
WINED3D_SM4_OP_IADD = 0x1e,
|
||||
WINED3D_SM4_OP_IF = 0x1f,
|
||||
WINED3D_SM4_OP_IEQ = 0x20,
|
||||
@@ -83,13 +87,17 @@ enum wined3d_sm4_opcode
|
||||
WINED3D_SM4_OP_MOVC = 0x37,
|
||||
WINED3D_SM4_OP_MUL = 0x38,
|
||||
WINED3D_SM4_OP_RET = 0x3e,
|
||||
WINED3D_SM4_OP_ROUND_NI = 0x41,
|
||||
WINED3D_SM4_OP_RSQ = 0x44,
|
||||
WINED3D_SM4_OP_SAMPLE = 0x45,
|
||||
WINED3D_SM4_OP_SAMPLE_LOD = 0x48,
|
||||
WINED3D_SM4_OP_SAMPLE_GRAD = 0x49,
|
||||
WINED3D_SM4_OP_SQRT = 0x4b,
|
||||
WINED3D_SM4_OP_SINCOS = 0x4d,
|
||||
WINED3D_SM4_OP_UDIV = 0x4e,
|
||||
WINED3D_SM4_OP_USHR = 0x55,
|
||||
WINED3D_SM4_OP_UTOF = 0x56,
|
||||
WINED3D_SM4_OP_XOR = 0x57,
|
||||
};
|
||||
|
||||
enum wined3d_sm4_register_type
|
||||
@@ -127,7 +135,7 @@ struct wined3d_sm4_opcode_info
|
||||
struct sysval_map
|
||||
{
|
||||
enum wined3d_sysval_semantic sysval;
|
||||
WINED3DSHADER_PARAM_REGISTER_TYPE register_type;
|
||||
enum wined3d_shader_register_type register_type;
|
||||
UINT register_idx;
|
||||
};
|
||||
|
||||
@@ -138,15 +146,19 @@ static const struct wined3d_sm4_opcode_info opcode_table[] =
|
||||
{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_DERIV_RTX, WINED3DSIH_DSX, 1, 1},
|
||||
{WINED3D_SM4_OP_DERIV_RTY, WINED3DSIH_DSY, 1, 1},
|
||||
{WINED3D_SM4_OP_DIV, WINED3DSIH_DIV, 1, 2},
|
||||
{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_EQ, WINED3DSIH_EQ, 1, 2},
|
||||
{WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1},
|
||||
{WINED3D_SM4_OP_FRC, WINED3DSIH_FRC, 1, 1},
|
||||
{WINED3D_SM4_OP_FTOI, WINED3DSIH_FTOI, 1, 1},
|
||||
{WINED3D_SM4_OP_GE, WINED3DSIH_GE, 1, 2},
|
||||
{WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, 1, 2},
|
||||
{WINED3D_SM4_OP_IF, WINED3DSIH_IF, 0, 1},
|
||||
{WINED3D_SM4_OP_IEQ, WINED3DSIH_IEQ, 1, 2},
|
||||
@@ -164,16 +176,20 @@ static const struct wined3d_sm4_opcode_info opcode_table[] =
|
||||
{WINED3D_SM4_OP_MOVC, WINED3DSIH_MOVC, 1, 3},
|
||||
{WINED3D_SM4_OP_MUL, WINED3DSIH_MUL, 1, 2},
|
||||
{WINED3D_SM4_OP_RET, WINED3DSIH_RET, 0, 0},
|
||||
{WINED3D_SM4_OP_ROUND_NI, WINED3DSIH_ROUND_NI, 1, 1},
|
||||
{WINED3D_SM4_OP_RSQ, WINED3DSIH_RSQ, 1, 1},
|
||||
{WINED3D_SM4_OP_SAMPLE, WINED3DSIH_SAMPLE, 1, 3},
|
||||
{WINED3D_SM4_OP_SAMPLE_LOD, WINED3DSIH_SAMPLE_LOD, 1, 4},
|
||||
{WINED3D_SM4_OP_SAMPLE_GRAD,WINED3DSIH_SAMPLE_GRAD, 1, 5},
|
||||
{WINED3D_SM4_OP_SQRT, WINED3DSIH_SQRT, 1, 1},
|
||||
{WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, 2, 1},
|
||||
{WINED3D_SM4_OP_UDIV, WINED3DSIH_UDIV, 2, 2},
|
||||
{WINED3D_SM4_OP_USHR, WINED3DSIH_USHR, 1, 2},
|
||||
{WINED3D_SM4_OP_UTOF, WINED3DSIH_UTOF, 1, 1},
|
||||
{WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, 1, 2},
|
||||
};
|
||||
|
||||
static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] =
|
||||
static const enum wined3d_shader_register_type register_type_table[] =
|
||||
{
|
||||
/* WINED3D_SM4_RT_TEMP */ WINED3DSPR_TEMP,
|
||||
/* WINED3D_SM4_RT_INPUT */ WINED3DSPR_INPUT,
|
||||
@@ -230,7 +246,7 @@ static void map_sysval(enum wined3d_sysval_semantic sysval, struct wined3d_shade
|
||||
}
|
||||
}
|
||||
|
||||
static void map_register(struct wined3d_sm4_data *priv, struct wined3d_shader_register *reg)
|
||||
static void map_register(const struct wined3d_sm4_data *priv, struct wined3d_shader_register *reg)
|
||||
{
|
||||
switch (priv->shader_version.type)
|
||||
{
|
||||
|
||||
+1802
-1794
File diff suppressed because it is too large
Load Diff
@@ -29,163 +29,163 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
|
||||
|
||||
static const DWORD pixel_states_render[] =
|
||||
{
|
||||
WINED3DRS_ALPHABLENDENABLE,
|
||||
WINED3DRS_ALPHAFUNC,
|
||||
WINED3DRS_ALPHAREF,
|
||||
WINED3DRS_ALPHATESTENABLE,
|
||||
WINED3DRS_ANTIALIASEDLINEENABLE,
|
||||
WINED3DRS_BLENDFACTOR,
|
||||
WINED3DRS_BLENDOP,
|
||||
WINED3DRS_BLENDOPALPHA,
|
||||
WINED3DRS_CCW_STENCILFAIL,
|
||||
WINED3DRS_CCW_STENCILPASS,
|
||||
WINED3DRS_CCW_STENCILZFAIL,
|
||||
WINED3DRS_COLORWRITEENABLE,
|
||||
WINED3DRS_COLORWRITEENABLE1,
|
||||
WINED3DRS_COLORWRITEENABLE2,
|
||||
WINED3DRS_COLORWRITEENABLE3,
|
||||
WINED3DRS_DEPTHBIAS,
|
||||
WINED3DRS_DESTBLEND,
|
||||
WINED3DRS_DESTBLENDALPHA,
|
||||
WINED3DRS_DITHERENABLE,
|
||||
WINED3DRS_FILLMODE,
|
||||
WINED3DRS_FOGDENSITY,
|
||||
WINED3DRS_FOGEND,
|
||||
WINED3DRS_FOGSTART,
|
||||
WINED3DRS_LASTPIXEL,
|
||||
WINED3DRS_SCISSORTESTENABLE,
|
||||
WINED3DRS_SEPARATEALPHABLENDENABLE,
|
||||
WINED3DRS_SHADEMODE,
|
||||
WINED3DRS_SLOPESCALEDEPTHBIAS,
|
||||
WINED3DRS_SRCBLEND,
|
||||
WINED3DRS_SRCBLENDALPHA,
|
||||
WINED3DRS_SRGBWRITEENABLE,
|
||||
WINED3DRS_STENCILENABLE,
|
||||
WINED3DRS_STENCILFAIL,
|
||||
WINED3DRS_STENCILFUNC,
|
||||
WINED3DRS_STENCILMASK,
|
||||
WINED3DRS_STENCILPASS,
|
||||
WINED3DRS_STENCILREF,
|
||||
WINED3DRS_STENCILWRITEMASK,
|
||||
WINED3DRS_STENCILZFAIL,
|
||||
WINED3DRS_TEXTUREFACTOR,
|
||||
WINED3DRS_TWOSIDEDSTENCILMODE,
|
||||
WINED3DRS_WRAP0,
|
||||
WINED3DRS_WRAP1,
|
||||
WINED3DRS_WRAP10,
|
||||
WINED3DRS_WRAP11,
|
||||
WINED3DRS_WRAP12,
|
||||
WINED3DRS_WRAP13,
|
||||
WINED3DRS_WRAP14,
|
||||
WINED3DRS_WRAP15,
|
||||
WINED3DRS_WRAP2,
|
||||
WINED3DRS_WRAP3,
|
||||
WINED3DRS_WRAP4,
|
||||
WINED3DRS_WRAP5,
|
||||
WINED3DRS_WRAP6,
|
||||
WINED3DRS_WRAP7,
|
||||
WINED3DRS_WRAP8,
|
||||
WINED3DRS_WRAP9,
|
||||
WINED3DRS_ZENABLE,
|
||||
WINED3DRS_ZFUNC,
|
||||
WINED3DRS_ZWRITEENABLE,
|
||||
WINED3D_RS_ALPHABLENDENABLE,
|
||||
WINED3D_RS_ALPHAFUNC,
|
||||
WINED3D_RS_ALPHAREF,
|
||||
WINED3D_RS_ALPHATESTENABLE,
|
||||
WINED3D_RS_ANTIALIASEDLINEENABLE,
|
||||
WINED3D_RS_BLENDFACTOR,
|
||||
WINED3D_RS_BLENDOP,
|
||||
WINED3D_RS_BLENDOPALPHA,
|
||||
WINED3D_RS_CCW_STENCILFAIL,
|
||||
WINED3D_RS_CCW_STENCILPASS,
|
||||
WINED3D_RS_CCW_STENCILZFAIL,
|
||||
WINED3D_RS_COLORWRITEENABLE,
|
||||
WINED3D_RS_COLORWRITEENABLE1,
|
||||
WINED3D_RS_COLORWRITEENABLE2,
|
||||
WINED3D_RS_COLORWRITEENABLE3,
|
||||
WINED3D_RS_DEPTHBIAS,
|
||||
WINED3D_RS_DESTBLEND,
|
||||
WINED3D_RS_DESTBLENDALPHA,
|
||||
WINED3D_RS_DITHERENABLE,
|
||||
WINED3D_RS_FILLMODE,
|
||||
WINED3D_RS_FOGDENSITY,
|
||||
WINED3D_RS_FOGEND,
|
||||
WINED3D_RS_FOGSTART,
|
||||
WINED3D_RS_LASTPIXEL,
|
||||
WINED3D_RS_SCISSORTESTENABLE,
|
||||
WINED3D_RS_SEPARATEALPHABLENDENABLE,
|
||||
WINED3D_RS_SHADEMODE,
|
||||
WINED3D_RS_SLOPESCALEDEPTHBIAS,
|
||||
WINED3D_RS_SRCBLEND,
|
||||
WINED3D_RS_SRCBLENDALPHA,
|
||||
WINED3D_RS_SRGBWRITEENABLE,
|
||||
WINED3D_RS_STENCILENABLE,
|
||||
WINED3D_RS_STENCILFAIL,
|
||||
WINED3D_RS_STENCILFUNC,
|
||||
WINED3D_RS_STENCILMASK,
|
||||
WINED3D_RS_STENCILPASS,
|
||||
WINED3D_RS_STENCILREF,
|
||||
WINED3D_RS_STENCILWRITEMASK,
|
||||
WINED3D_RS_STENCILZFAIL,
|
||||
WINED3D_RS_TEXTUREFACTOR,
|
||||
WINED3D_RS_TWOSIDEDSTENCILMODE,
|
||||
WINED3D_RS_WRAP0,
|
||||
WINED3D_RS_WRAP1,
|
||||
WINED3D_RS_WRAP10,
|
||||
WINED3D_RS_WRAP11,
|
||||
WINED3D_RS_WRAP12,
|
||||
WINED3D_RS_WRAP13,
|
||||
WINED3D_RS_WRAP14,
|
||||
WINED3D_RS_WRAP15,
|
||||
WINED3D_RS_WRAP2,
|
||||
WINED3D_RS_WRAP3,
|
||||
WINED3D_RS_WRAP4,
|
||||
WINED3D_RS_WRAP5,
|
||||
WINED3D_RS_WRAP6,
|
||||
WINED3D_RS_WRAP7,
|
||||
WINED3D_RS_WRAP8,
|
||||
WINED3D_RS_WRAP9,
|
||||
WINED3D_RS_ZENABLE,
|
||||
WINED3D_RS_ZFUNC,
|
||||
WINED3D_RS_ZWRITEENABLE,
|
||||
};
|
||||
|
||||
static const DWORD pixel_states_texture[] =
|
||||
{
|
||||
WINED3DTSS_ALPHAARG0,
|
||||
WINED3DTSS_ALPHAARG1,
|
||||
WINED3DTSS_ALPHAARG2,
|
||||
WINED3DTSS_ALPHAOP,
|
||||
WINED3DTSS_BUMPENVLOFFSET,
|
||||
WINED3DTSS_BUMPENVLSCALE,
|
||||
WINED3DTSS_BUMPENVMAT00,
|
||||
WINED3DTSS_BUMPENVMAT01,
|
||||
WINED3DTSS_BUMPENVMAT10,
|
||||
WINED3DTSS_BUMPENVMAT11,
|
||||
WINED3DTSS_COLORARG0,
|
||||
WINED3DTSS_COLORARG1,
|
||||
WINED3DTSS_COLORARG2,
|
||||
WINED3DTSS_COLOROP,
|
||||
WINED3DTSS_RESULTARG,
|
||||
WINED3DTSS_TEXCOORDINDEX,
|
||||
WINED3DTSS_TEXTURETRANSFORMFLAGS,
|
||||
WINED3D_TSS_ALPHA_ARG0,
|
||||
WINED3D_TSS_ALPHA_ARG1,
|
||||
WINED3D_TSS_ALPHA_ARG2,
|
||||
WINED3D_TSS_ALPHA_OP,
|
||||
WINED3D_TSS_BUMPENV_LOFFSET,
|
||||
WINED3D_TSS_BUMPENV_LSCALE,
|
||||
WINED3D_TSS_BUMPENV_MAT00,
|
||||
WINED3D_TSS_BUMPENV_MAT01,
|
||||
WINED3D_TSS_BUMPENV_MAT10,
|
||||
WINED3D_TSS_BUMPENV_MAT11,
|
||||
WINED3D_TSS_COLOR_ARG0,
|
||||
WINED3D_TSS_COLOR_ARG1,
|
||||
WINED3D_TSS_COLOR_ARG2,
|
||||
WINED3D_TSS_COLOR_OP,
|
||||
WINED3D_TSS_RESULT_ARG,
|
||||
WINED3D_TSS_TEXCOORD_INDEX,
|
||||
WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS,
|
||||
};
|
||||
|
||||
static const DWORD pixel_states_sampler[] =
|
||||
{
|
||||
WINED3DSAMP_ADDRESSU,
|
||||
WINED3DSAMP_ADDRESSV,
|
||||
WINED3DSAMP_ADDRESSW,
|
||||
WINED3DSAMP_BORDERCOLOR,
|
||||
WINED3DSAMP_MAGFILTER,
|
||||
WINED3DSAMP_MINFILTER,
|
||||
WINED3DSAMP_MIPFILTER,
|
||||
WINED3DSAMP_MIPMAPLODBIAS,
|
||||
WINED3DSAMP_MAXMIPLEVEL,
|
||||
WINED3DSAMP_MAXANISOTROPY,
|
||||
WINED3DSAMP_SRGBTEXTURE,
|
||||
WINED3DSAMP_ELEMENTINDEX,
|
||||
WINED3D_SAMP_ADDRESS_U,
|
||||
WINED3D_SAMP_ADDRESS_V,
|
||||
WINED3D_SAMP_ADDRESS_W,
|
||||
WINED3D_SAMP_BORDER_COLOR,
|
||||
WINED3D_SAMP_MAG_FILTER,
|
||||
WINED3D_SAMP_MIN_FILTER,
|
||||
WINED3D_SAMP_MIP_FILTER,
|
||||
WINED3D_SAMP_MIPMAP_LOD_BIAS,
|
||||
WINED3D_SAMP_MAX_MIP_LEVEL,
|
||||
WINED3D_SAMP_MAX_ANISOTROPY,
|
||||
WINED3D_SAMP_SRGB_TEXTURE,
|
||||
WINED3D_SAMP_ELEMENT_INDEX,
|
||||
};
|
||||
|
||||
static const DWORD vertex_states_render[] =
|
||||
{
|
||||
WINED3DRS_ADAPTIVETESS_W,
|
||||
WINED3DRS_ADAPTIVETESS_X,
|
||||
WINED3DRS_ADAPTIVETESS_Y,
|
||||
WINED3DRS_ADAPTIVETESS_Z,
|
||||
WINED3DRS_AMBIENT,
|
||||
WINED3DRS_AMBIENTMATERIALSOURCE,
|
||||
WINED3DRS_CLIPPING,
|
||||
WINED3DRS_CLIPPLANEENABLE,
|
||||
WINED3DRS_COLORVERTEX,
|
||||
WINED3DRS_CULLMODE,
|
||||
WINED3DRS_DIFFUSEMATERIALSOURCE,
|
||||
WINED3DRS_EMISSIVEMATERIALSOURCE,
|
||||
WINED3DRS_ENABLEADAPTIVETESSELLATION,
|
||||
WINED3DRS_FOGCOLOR,
|
||||
WINED3DRS_FOGDENSITY,
|
||||
WINED3DRS_FOGENABLE,
|
||||
WINED3DRS_FOGEND,
|
||||
WINED3DRS_FOGSTART,
|
||||
WINED3DRS_FOGTABLEMODE,
|
||||
WINED3DRS_FOGVERTEXMODE,
|
||||
WINED3DRS_INDEXEDVERTEXBLENDENABLE,
|
||||
WINED3DRS_LIGHTING,
|
||||
WINED3DRS_LOCALVIEWER,
|
||||
WINED3DRS_MAXTESSELLATIONLEVEL,
|
||||
WINED3DRS_MINTESSELLATIONLEVEL,
|
||||
WINED3DRS_MULTISAMPLEANTIALIAS,
|
||||
WINED3DRS_MULTISAMPLEMASK,
|
||||
WINED3DRS_NORMALDEGREE,
|
||||
WINED3DRS_NORMALIZENORMALS,
|
||||
WINED3DRS_PATCHEDGESTYLE,
|
||||
WINED3DRS_POINTSCALE_A,
|
||||
WINED3DRS_POINTSCALE_B,
|
||||
WINED3DRS_POINTSCALE_C,
|
||||
WINED3DRS_POINTSCALEENABLE,
|
||||
WINED3DRS_POINTSIZE,
|
||||
WINED3DRS_POINTSIZE_MAX,
|
||||
WINED3DRS_POINTSIZE_MIN,
|
||||
WINED3DRS_POINTSPRITEENABLE,
|
||||
WINED3DRS_POSITIONDEGREE,
|
||||
WINED3DRS_RANGEFOGENABLE,
|
||||
WINED3DRS_SHADEMODE,
|
||||
WINED3DRS_SPECULARENABLE,
|
||||
WINED3DRS_SPECULARMATERIALSOURCE,
|
||||
WINED3DRS_TWEENFACTOR,
|
||||
WINED3DRS_VERTEXBLEND,
|
||||
WINED3D_RS_ADAPTIVETESS_W,
|
||||
WINED3D_RS_ADAPTIVETESS_X,
|
||||
WINED3D_RS_ADAPTIVETESS_Y,
|
||||
WINED3D_RS_ADAPTIVETESS_Z,
|
||||
WINED3D_RS_AMBIENT,
|
||||
WINED3D_RS_AMBIENTMATERIALSOURCE,
|
||||
WINED3D_RS_CLIPPING,
|
||||
WINED3D_RS_CLIPPLANEENABLE,
|
||||
WINED3D_RS_COLORVERTEX,
|
||||
WINED3D_RS_CULLMODE,
|
||||
WINED3D_RS_DIFFUSEMATERIALSOURCE,
|
||||
WINED3D_RS_EMISSIVEMATERIALSOURCE,
|
||||
WINED3D_RS_ENABLEADAPTIVETESSELLATION,
|
||||
WINED3D_RS_FOGCOLOR,
|
||||
WINED3D_RS_FOGDENSITY,
|
||||
WINED3D_RS_FOGENABLE,
|
||||
WINED3D_RS_FOGEND,
|
||||
WINED3D_RS_FOGSTART,
|
||||
WINED3D_RS_FOGTABLEMODE,
|
||||
WINED3D_RS_FOGVERTEXMODE,
|
||||
WINED3D_RS_INDEXEDVERTEXBLENDENABLE,
|
||||
WINED3D_RS_LIGHTING,
|
||||
WINED3D_RS_LOCALVIEWER,
|
||||
WINED3D_RS_MAXTESSELLATIONLEVEL,
|
||||
WINED3D_RS_MINTESSELLATIONLEVEL,
|
||||
WINED3D_RS_MULTISAMPLEANTIALIAS,
|
||||
WINED3D_RS_MULTISAMPLEMASK,
|
||||
WINED3D_RS_NORMALDEGREE,
|
||||
WINED3D_RS_NORMALIZENORMALS,
|
||||
WINED3D_RS_PATCHEDGESTYLE,
|
||||
WINED3D_RS_POINTSCALE_A,
|
||||
WINED3D_RS_POINTSCALE_B,
|
||||
WINED3D_RS_POINTSCALE_C,
|
||||
WINED3D_RS_POINTSCALEENABLE,
|
||||
WINED3D_RS_POINTSIZE,
|
||||
WINED3D_RS_POINTSIZE_MAX,
|
||||
WINED3D_RS_POINTSIZE_MIN,
|
||||
WINED3D_RS_POINTSPRITEENABLE,
|
||||
WINED3D_RS_POSITIONDEGREE,
|
||||
WINED3D_RS_RANGEFOGENABLE,
|
||||
WINED3D_RS_SHADEMODE,
|
||||
WINED3D_RS_SPECULARENABLE,
|
||||
WINED3D_RS_SPECULARMATERIALSOURCE,
|
||||
WINED3D_RS_TWEENFACTOR,
|
||||
WINED3D_RS_VERTEXBLEND,
|
||||
};
|
||||
|
||||
static const DWORD vertex_states_texture[] =
|
||||
{
|
||||
WINED3DTSS_TEXCOORDINDEX,
|
||||
WINED3DTSS_TEXTURETRANSFORMFLAGS,
|
||||
WINED3D_TSS_TEXCOORD_INDEX,
|
||||
WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS,
|
||||
};
|
||||
|
||||
static const DWORD vertex_states_sampler[] =
|
||||
{
|
||||
WINED3DSAMP_DMAPOFFSET,
|
||||
WINED3D_SAMP_DMAP_OFFSET,
|
||||
};
|
||||
|
||||
/* Allocates the correct amount of space for pixel and vertex shader constants,
|
||||
@@ -241,7 +241,7 @@ static inline void stateblock_set_bits(DWORD *map, UINT map_size)
|
||||
}
|
||||
|
||||
/* Set all members of a stateblock savedstate to the given value */
|
||||
static void stateblock_savedstates_set_all(SAVEDSTATES *states, DWORD vs_consts, DWORD ps_consts)
|
||||
static void stateblock_savedstates_set_all(struct wined3d_saved_states *states, DWORD vs_consts, DWORD ps_consts)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@@ -274,7 +274,7 @@ static void stateblock_savedstates_set_all(SAVEDSTATES *states, DWORD vs_consts,
|
||||
memset(states->vertexShaderConstantsF, TRUE, sizeof(BOOL) * vs_consts);
|
||||
}
|
||||
|
||||
static void stateblock_savedstates_set_pixel(SAVEDSTATES *states, const DWORD num_constants)
|
||||
static void stateblock_savedstates_set_pixel(struct wined3d_saved_states *states, const DWORD num_constants)
|
||||
{
|
||||
DWORD texture_mask = 0;
|
||||
WORD sampler_mask = 0;
|
||||
@@ -300,7 +300,7 @@ static void stateblock_savedstates_set_pixel(SAVEDSTATES *states, const DWORD nu
|
||||
memset(states->pixelShaderConstantsF, TRUE, sizeof(BOOL) * num_constants);
|
||||
}
|
||||
|
||||
static void stateblock_savedstates_set_vertex(SAVEDSTATES *states, const DWORD num_constants)
|
||||
static void stateblock_savedstates_set_vertex(struct wined3d_saved_states *states, const DWORD num_constants)
|
||||
{
|
||||
DWORD texture_mask = 0;
|
||||
WORD sampler_mask = 0;
|
||||
@@ -466,6 +466,58 @@ ULONG CDECL wined3d_stateblock_incref(struct wined3d_stateblock *stateblock)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
void stateblock_unbind_resources(struct wined3d_stateblock *stateblock)
|
||||
{
|
||||
struct wined3d_state *state = &stateblock->state;
|
||||
struct wined3d_vertex_declaration *decl;
|
||||
struct wined3d_texture *texture;
|
||||
struct wined3d_buffer *buffer;
|
||||
struct wined3d_shader *shader;
|
||||
unsigned int i;
|
||||
|
||||
if ((decl = state->vertex_declaration))
|
||||
{
|
||||
state->vertex_declaration = NULL;
|
||||
wined3d_vertex_declaration_decref(decl);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
|
||||
{
|
||||
if ((texture = state->textures[i]))
|
||||
{
|
||||
state->textures[i] = NULL;
|
||||
wined3d_texture_decref(texture);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_STREAMS; ++i)
|
||||
{
|
||||
if ((buffer = state->streams[i].buffer))
|
||||
{
|
||||
state->streams[i].buffer = NULL;
|
||||
wined3d_buffer_decref(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if ((buffer = state->index_buffer))
|
||||
{
|
||||
state->index_buffer = NULL;
|
||||
wined3d_buffer_decref(buffer);
|
||||
}
|
||||
|
||||
if ((shader = state->vertex_shader))
|
||||
{
|
||||
state->vertex_shader = NULL;
|
||||
wined3d_shader_decref(shader);
|
||||
}
|
||||
|
||||
if ((shader = state->pixel_shader))
|
||||
{
|
||||
state->pixel_shader = NULL;
|
||||
wined3d_shader_decref(shader);
|
||||
}
|
||||
}
|
||||
|
||||
ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
|
||||
{
|
||||
ULONG refcount = InterlockedDecrement(&stateblock->ref);
|
||||
@@ -474,46 +526,9 @@ ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
|
||||
|
||||
if (!refcount)
|
||||
{
|
||||
struct wined3d_buffer *buffer;
|
||||
int counter;
|
||||
|
||||
if (stateblock->state.vertex_declaration)
|
||||
wined3d_vertex_declaration_decref(stateblock->state.vertex_declaration);
|
||||
|
||||
for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++)
|
||||
{
|
||||
struct wined3d_texture *texture = stateblock->state.textures[counter];
|
||||
if (texture)
|
||||
{
|
||||
stateblock->state.textures[counter] = NULL;
|
||||
wined3d_texture_decref(texture);
|
||||
}
|
||||
}
|
||||
|
||||
for (counter = 0; counter < MAX_STREAMS; ++counter)
|
||||
{
|
||||
buffer = stateblock->state.streams[counter].buffer;
|
||||
if (buffer)
|
||||
{
|
||||
stateblock->state.streams[counter].buffer = NULL;
|
||||
if (wined3d_buffer_decref(buffer))
|
||||
{
|
||||
WARN("Buffer %p still referenced by stateblock, stream %u.\n", buffer, counter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buffer = stateblock->state.index_buffer;
|
||||
if (buffer)
|
||||
{
|
||||
stateblock->state.index_buffer = NULL;
|
||||
wined3d_buffer_decref(buffer);
|
||||
}
|
||||
|
||||
if (stateblock->state.vertex_shader)
|
||||
wined3d_shader_decref(stateblock->state.vertex_shader);
|
||||
if (stateblock->state.pixel_shader)
|
||||
wined3d_shader_decref(stateblock->state.pixel_shader);
|
||||
stateblock_unbind_resources(stateblock);
|
||||
|
||||
for (counter = 0; counter < LIGHTMAP_SIZE; ++counter)
|
||||
{
|
||||
@@ -708,7 +723,7 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
|
||||
/* Others + Render & Texture */
|
||||
for (i = 0; i < stateblock->num_contained_transform_states; ++i)
|
||||
{
|
||||
WINED3DTRANSFORMSTATETYPE transform = stateblock->contained_transform_states[i];
|
||||
enum wined3d_transform_state transform = stateblock->contained_transform_states[i];
|
||||
|
||||
TRACE("Updating transform %#x.\n", transform);
|
||||
|
||||
@@ -823,7 +838,7 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
|
||||
/* Render */
|
||||
for (i = 0; i < stateblock->num_contained_render_states; ++i)
|
||||
{
|
||||
WINED3DRENDERSTATETYPE rs = stateblock->contained_render_states[i];
|
||||
enum wined3d_render_state rs = stateblock->contained_render_states[i];
|
||||
|
||||
TRACE("Updating render state %#x to %u.\n", rs, src_state->render_states[rs]);
|
||||
|
||||
@@ -880,7 +895,7 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
|
||||
|
||||
wined3d_state_record_lights(&stateblock->state, src_state);
|
||||
|
||||
TRACE("Captue done.\n");
|
||||
TRACE("Capture done.\n");
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
@@ -909,8 +924,8 @@ HRESULT CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblo
|
||||
unsigned int i;
|
||||
DWORD map;
|
||||
|
||||
TRACE("Applying stateblock %p to device %p.\n", stateblock, device);
|
||||
TRACE("Blocktype: %#x.\n", stateblock->blockType);
|
||||
TRACE("Applying stateblock %p of type %#x to device %p.\n",
|
||||
stateblock, stateblock->blockType, device);
|
||||
|
||||
if (stateblock->changed.vertexShader)
|
||||
wined3d_device_set_vertex_shader(device, stateblock->state.vertex_shader);
|
||||
@@ -1057,7 +1072,7 @@ HRESULT CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblo
|
||||
stateblock->device->stateBlock->state.lowest_disabled_stage = MAX_TEXTURES - 1;
|
||||
for (i = 0; i < MAX_TEXTURES - 1; ++i)
|
||||
{
|
||||
if (stateblock->device->stateBlock->state.texture_states[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE)
|
||||
if (stateblock->device->stateBlock->state.texture_states[i][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_DISABLE)
|
||||
{
|
||||
stateblock->device->stateBlock->state.lowest_disabled_stage = i;
|
||||
break;
|
||||
@@ -1074,8 +1089,9 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
struct wined3d_device *device = stateblock->device;
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
struct wined3d_state *state = &stateblock->state;
|
||||
union {
|
||||
WINED3DLINEPATTERN lp;
|
||||
union
|
||||
{
|
||||
struct wined3d_line_pattern lp;
|
||||
DWORD d;
|
||||
} lp;
|
||||
union {
|
||||
@@ -1089,174 +1105,175 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
|
||||
TRACE("stateblock %p.\n", stateblock);
|
||||
|
||||
stateblock->blockType = WINED3DSBT_INIT;
|
||||
stateblock->blockType = WINED3D_SBT_INIT;
|
||||
|
||||
memset(stateblock->changed.pixelShaderConstantsF, 0, device->d3d_pshader_constantF * sizeof(BOOL));
|
||||
memset(stateblock->changed.vertexShaderConstantsF, 0, device->d3d_vshader_constantF * sizeof(BOOL));
|
||||
|
||||
/* Set some of the defaults for lights, transforms etc */
|
||||
memcpy(&state->transforms[WINED3DTS_PROJECTION], identity, sizeof(identity));
|
||||
memcpy(&state->transforms[WINED3DTS_VIEW], identity, sizeof(identity));
|
||||
memcpy(&state->transforms[WINED3D_TS_PROJECTION], identity, sizeof(identity));
|
||||
memcpy(&state->transforms[WINED3D_TS_VIEW], identity, sizeof(identity));
|
||||
for (i = 0; i < 256; ++i)
|
||||
{
|
||||
memcpy(&state->transforms[WINED3DTS_WORLDMATRIX(i)], identity, sizeof(identity));
|
||||
memcpy(&state->transforms[WINED3D_TS_WORLD_MATRIX(i)], identity, sizeof(identity));
|
||||
}
|
||||
|
||||
state->fb = &device->fb;
|
||||
|
||||
TRACE("Render states\n");
|
||||
/* Render states: */
|
||||
if (device->auto_depth_stencil)
|
||||
state->render_states[WINED3DRS_ZENABLE] = WINED3DZB_TRUE;
|
||||
state->render_states[WINED3D_RS_ZENABLE] = WINED3D_ZB_TRUE;
|
||||
else
|
||||
state->render_states[WINED3DRS_ZENABLE] = WINED3DZB_FALSE;
|
||||
state->render_states[WINED3DRS_FILLMODE] = WINED3DFILL_SOLID;
|
||||
state->render_states[WINED3DRS_SHADEMODE] = WINED3DSHADE_GOURAUD;
|
||||
lp.lp.wRepeatFactor = 0;
|
||||
lp.lp.wLinePattern = 0;
|
||||
state->render_states[WINED3DRS_LINEPATTERN] = lp.d;
|
||||
state->render_states[WINED3DRS_ZWRITEENABLE] = TRUE;
|
||||
state->render_states[WINED3DRS_ALPHATESTENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_LASTPIXEL] = TRUE;
|
||||
state->render_states[WINED3DRS_SRCBLEND] = WINED3DBLEND_ONE;
|
||||
state->render_states[WINED3DRS_DESTBLEND] = WINED3DBLEND_ZERO;
|
||||
state->render_states[WINED3DRS_CULLMODE] = WINED3DCULL_CCW;
|
||||
state->render_states[WINED3DRS_ZFUNC] = WINED3DCMP_LESSEQUAL;
|
||||
state->render_states[WINED3DRS_ALPHAFUNC] = WINED3DCMP_ALWAYS;
|
||||
state->render_states[WINED3DRS_ALPHAREF] = 0;
|
||||
state->render_states[WINED3DRS_DITHERENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_ALPHABLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_FOGENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_SPECULARENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_ZVISIBLE] = 0;
|
||||
state->render_states[WINED3DRS_FOGCOLOR] = 0;
|
||||
state->render_states[WINED3DRS_FOGTABLEMODE] = WINED3DFOG_NONE;
|
||||
state->render_states[WINED3D_RS_ZENABLE] = WINED3D_ZB_FALSE;
|
||||
state->render_states[WINED3D_RS_FILLMODE] = WINED3D_FILL_SOLID;
|
||||
state->render_states[WINED3D_RS_SHADEMODE] = WINED3D_SHADE_GOURAUD;
|
||||
lp.lp.repeat_factor = 0;
|
||||
lp.lp.line_pattern = 0;
|
||||
state->render_states[WINED3D_RS_LINEPATTERN] = lp.d;
|
||||
state->render_states[WINED3D_RS_ZWRITEENABLE] = TRUE;
|
||||
state->render_states[WINED3D_RS_ALPHATESTENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_LASTPIXEL] = TRUE;
|
||||
state->render_states[WINED3D_RS_SRCBLEND] = WINED3D_BLEND_ONE;
|
||||
state->render_states[WINED3D_RS_DESTBLEND] = WINED3D_BLEND_ZERO;
|
||||
state->render_states[WINED3D_RS_CULLMODE] = WINED3D_CULL_CCW;
|
||||
state->render_states[WINED3D_RS_ZFUNC] = WINED3D_CMP_LESSEQUAL;
|
||||
state->render_states[WINED3D_RS_ALPHAFUNC] = WINED3D_CMP_ALWAYS;
|
||||
state->render_states[WINED3D_RS_ALPHAREF] = 0;
|
||||
state->render_states[WINED3D_RS_DITHERENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_ALPHABLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_FOGENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_SPECULARENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_ZVISIBLE] = 0;
|
||||
state->render_states[WINED3D_RS_FOGCOLOR] = 0;
|
||||
state->render_states[WINED3D_RS_FOGTABLEMODE] = WINED3D_FOG_NONE;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_FOGSTART] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_FOGSTART] = tmpfloat.d;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_FOGEND] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_FOGEND] = tmpfloat.d;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_FOGDENSITY] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_EDGEANTIALIAS] = FALSE;
|
||||
state->render_states[WINED3DRS_RANGEFOGENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_STENCILENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_STENCILFAIL] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_STENCILZFAIL] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_STENCILPASS] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_STENCILREF] = 0;
|
||||
state->render_states[WINED3DRS_STENCILMASK] = 0xffffffff;
|
||||
state->render_states[WINED3DRS_STENCILFUNC] = WINED3DCMP_ALWAYS;
|
||||
state->render_states[WINED3DRS_STENCILWRITEMASK] = 0xffffffff;
|
||||
state->render_states[WINED3DRS_TEXTUREFACTOR] = 0xffffffff;
|
||||
state->render_states[WINED3DRS_WRAP0] = 0;
|
||||
state->render_states[WINED3DRS_WRAP1] = 0;
|
||||
state->render_states[WINED3DRS_WRAP2] = 0;
|
||||
state->render_states[WINED3DRS_WRAP3] = 0;
|
||||
state->render_states[WINED3DRS_WRAP4] = 0;
|
||||
state->render_states[WINED3DRS_WRAP5] = 0;
|
||||
state->render_states[WINED3DRS_WRAP6] = 0;
|
||||
state->render_states[WINED3DRS_WRAP7] = 0;
|
||||
state->render_states[WINED3DRS_CLIPPING] = TRUE;
|
||||
state->render_states[WINED3DRS_LIGHTING] = TRUE;
|
||||
state->render_states[WINED3DRS_AMBIENT] = 0;
|
||||
state->render_states[WINED3DRS_FOGVERTEXMODE] = WINED3DFOG_NONE;
|
||||
state->render_states[WINED3DRS_COLORVERTEX] = TRUE;
|
||||
state->render_states[WINED3DRS_LOCALVIEWER] = TRUE;
|
||||
state->render_states[WINED3DRS_NORMALIZENORMALS] = FALSE;
|
||||
state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE] = WINED3DMCS_COLOR1;
|
||||
state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] = WINED3DMCS_COLOR2;
|
||||
state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] = WINED3DMCS_MATERIAL;
|
||||
state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] = WINED3DMCS_MATERIAL;
|
||||
state->render_states[WINED3DRS_VERTEXBLEND] = WINED3DVBF_DISABLE;
|
||||
state->render_states[WINED3DRS_CLIPPLANEENABLE] = 0;
|
||||
state->render_states[WINED3DRS_SOFTWAREVERTEXPROCESSING] = FALSE;
|
||||
state->render_states[WINED3D_RS_FOGDENSITY] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_EDGEANTIALIAS] = FALSE;
|
||||
state->render_states[WINED3D_RS_RANGEFOGENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_STENCILENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_STENCILFAIL] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_STENCILZFAIL] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_STENCILPASS] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_STENCILREF] = 0;
|
||||
state->render_states[WINED3D_RS_STENCILMASK] = 0xffffffff;
|
||||
state->render_states[WINED3D_RS_STENCILFUNC] = WINED3D_CMP_ALWAYS;
|
||||
state->render_states[WINED3D_RS_STENCILWRITEMASK] = 0xffffffff;
|
||||
state->render_states[WINED3D_RS_TEXTUREFACTOR] = 0xffffffff;
|
||||
state->render_states[WINED3D_RS_WRAP0] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP1] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP2] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP3] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP4] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP5] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP6] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP7] = 0;
|
||||
state->render_states[WINED3D_RS_CLIPPING] = TRUE;
|
||||
state->render_states[WINED3D_RS_LIGHTING] = TRUE;
|
||||
state->render_states[WINED3D_RS_AMBIENT] = 0;
|
||||
state->render_states[WINED3D_RS_FOGVERTEXMODE] = WINED3D_FOG_NONE;
|
||||
state->render_states[WINED3D_RS_COLORVERTEX] = TRUE;
|
||||
state->render_states[WINED3D_RS_LOCALVIEWER] = TRUE;
|
||||
state->render_states[WINED3D_RS_NORMALIZENORMALS] = FALSE;
|
||||
state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE] = WINED3D_MCS_COLOR1;
|
||||
state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE] = WINED3D_MCS_COLOR2;
|
||||
state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE] = WINED3D_MCS_MATERIAL;
|
||||
state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE] = WINED3D_MCS_MATERIAL;
|
||||
state->render_states[WINED3D_RS_VERTEXBLEND] = WINED3D_VBF_DISABLE;
|
||||
state->render_states[WINED3D_RS_CLIPPLANEENABLE] = 0;
|
||||
state->render_states[WINED3D_RS_SOFTWAREVERTEXPROCESSING] = FALSE;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_POINTSIZE] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_POINTSIZE] = tmpfloat.d;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_POINTSIZE_MIN] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_POINTSPRITEENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_POINTSCALEENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_POINTSIZE_MIN] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_POINTSPRITEENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_POINTSCALEENABLE] = FALSE;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_POINTSCALE_A] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_POINTSCALE_A] = tmpfloat.d;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_POINTSCALE_B] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_POINTSCALE_B] = tmpfloat.d;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_POINTSCALE_C] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_MULTISAMPLEANTIALIAS] = TRUE;
|
||||
state->render_states[WINED3DRS_MULTISAMPLEMASK] = 0xffffffff;
|
||||
state->render_states[WINED3DRS_PATCHEDGESTYLE] = WINED3DPATCHEDGE_DISCRETE;
|
||||
state->render_states[WINED3D_RS_POINTSCALE_C] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_MULTISAMPLEANTIALIAS] = TRUE;
|
||||
state->render_states[WINED3D_RS_MULTISAMPLEMASK] = 0xffffffff;
|
||||
state->render_states[WINED3D_RS_PATCHEDGESTYLE] = WINED3D_PATCH_EDGE_DISCRETE;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_PATCHSEGMENTS] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_DEBUGMONITORTOKEN] = 0xbaadcafe;
|
||||
state->render_states[WINED3D_RS_PATCHSEGMENTS] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_DEBUGMONITORTOKEN] = 0xbaadcafe;
|
||||
tmpfloat.f = gl_info->limits.pointsize_max;
|
||||
state->render_states[WINED3DRS_POINTSIZE_MAX] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_INDEXEDVERTEXBLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_COLORWRITEENABLE] = 0x0000000f;
|
||||
state->render_states[WINED3D_RS_POINTSIZE_MAX] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_INDEXEDVERTEXBLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_COLORWRITEENABLE] = 0x0000000f;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_TWEENFACTOR] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_BLENDOP] = WINED3DBLENDOP_ADD;
|
||||
state->render_states[WINED3DRS_POSITIONDEGREE] = WINED3DDEGREE_CUBIC;
|
||||
state->render_states[WINED3DRS_NORMALDEGREE] = WINED3DDEGREE_LINEAR;
|
||||
state->render_states[WINED3D_RS_TWEENFACTOR] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_BLENDOP] = WINED3D_BLEND_OP_ADD;
|
||||
state->render_states[WINED3D_RS_POSITIONDEGREE] = WINED3D_DEGREE_CUBIC;
|
||||
state->render_states[WINED3D_RS_NORMALDEGREE] = WINED3D_DEGREE_LINEAR;
|
||||
/* states new in d3d9 */
|
||||
state->render_states[WINED3DRS_SCISSORTESTENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_SLOPESCALEDEPTHBIAS] = 0;
|
||||
state->render_states[WINED3D_RS_SCISSORTESTENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_SLOPESCALEDEPTHBIAS] = 0;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_MINTESSELLATIONLEVEL] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_MAXTESSELLATIONLEVEL] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_ANTIALIASEDLINEENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_MINTESSELLATIONLEVEL] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_MAXTESSELLATIONLEVEL] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_ANTIALIASEDLINEENABLE] = FALSE;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_ADAPTIVETESS_X] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_ADAPTIVETESS_Y] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_ADAPTIVETESS_X] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_ADAPTIVETESS_Y] = tmpfloat.d;
|
||||
tmpfloat.f = 1.0f;
|
||||
state->render_states[WINED3DRS_ADAPTIVETESS_Z] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_ADAPTIVETESS_Z] = tmpfloat.d;
|
||||
tmpfloat.f = 0.0f;
|
||||
state->render_states[WINED3DRS_ADAPTIVETESS_W] = tmpfloat.d;
|
||||
state->render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION] = FALSE;
|
||||
state->render_states[WINED3DRS_TWOSIDEDSTENCILMODE] = FALSE;
|
||||
state->render_states[WINED3DRS_CCW_STENCILFAIL] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_CCW_STENCILZFAIL] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_CCW_STENCILPASS] = WINED3DSTENCILOP_KEEP;
|
||||
state->render_states[WINED3DRS_CCW_STENCILFUNC] = WINED3DCMP_ALWAYS;
|
||||
state->render_states[WINED3DRS_COLORWRITEENABLE1] = 0x0000000f;
|
||||
state->render_states[WINED3DRS_COLORWRITEENABLE2] = 0x0000000f;
|
||||
state->render_states[WINED3DRS_COLORWRITEENABLE3] = 0x0000000f;
|
||||
state->render_states[WINED3DRS_BLENDFACTOR] = 0xFFFFFFFF;
|
||||
state->render_states[WINED3DRS_SRGBWRITEENABLE] = 0;
|
||||
state->render_states[WINED3DRS_DEPTHBIAS] = 0;
|
||||
state->render_states[WINED3DRS_WRAP8] = 0;
|
||||
state->render_states[WINED3DRS_WRAP9] = 0;
|
||||
state->render_states[WINED3DRS_WRAP10] = 0;
|
||||
state->render_states[WINED3DRS_WRAP11] = 0;
|
||||
state->render_states[WINED3DRS_WRAP12] = 0;
|
||||
state->render_states[WINED3DRS_WRAP13] = 0;
|
||||
state->render_states[WINED3DRS_WRAP14] = 0;
|
||||
state->render_states[WINED3DRS_WRAP15] = 0;
|
||||
state->render_states[WINED3DRS_SEPARATEALPHABLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3DRS_SRCBLENDALPHA] = WINED3DBLEND_ONE;
|
||||
state->render_states[WINED3DRS_DESTBLENDALPHA] = WINED3DBLEND_ZERO;
|
||||
state->render_states[WINED3DRS_BLENDOPALPHA] = WINED3DBLENDOP_ADD;
|
||||
|
||||
/* clipping status */
|
||||
state->clip_status.ClipUnion = 0;
|
||||
state->clip_status.ClipIntersection = 0xFFFFFFFF;
|
||||
state->render_states[WINED3D_RS_ADAPTIVETESS_W] = tmpfloat.d;
|
||||
state->render_states[WINED3D_RS_ENABLEADAPTIVETESSELLATION] = FALSE;
|
||||
state->render_states[WINED3D_RS_TWOSIDEDSTENCILMODE] = FALSE;
|
||||
state->render_states[WINED3D_RS_CCW_STENCILFAIL] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_CCW_STENCILZFAIL] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_CCW_STENCILPASS] = WINED3D_STENCIL_OP_KEEP;
|
||||
state->render_states[WINED3D_RS_CCW_STENCILFUNC] = WINED3D_CMP_ALWAYS;
|
||||
state->render_states[WINED3D_RS_COLORWRITEENABLE1] = 0x0000000f;
|
||||
state->render_states[WINED3D_RS_COLORWRITEENABLE2] = 0x0000000f;
|
||||
state->render_states[WINED3D_RS_COLORWRITEENABLE3] = 0x0000000f;
|
||||
state->render_states[WINED3D_RS_BLENDFACTOR] = 0xFFFFFFFF;
|
||||
state->render_states[WINED3D_RS_SRGBWRITEENABLE] = 0;
|
||||
state->render_states[WINED3D_RS_DEPTHBIAS] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP8] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP9] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP10] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP11] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP12] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP13] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP14] = 0;
|
||||
state->render_states[WINED3D_RS_WRAP15] = 0;
|
||||
state->render_states[WINED3D_RS_SEPARATEALPHABLENDENABLE] = FALSE;
|
||||
state->render_states[WINED3D_RS_SRCBLENDALPHA] = WINED3D_BLEND_ONE;
|
||||
state->render_states[WINED3D_RS_DESTBLENDALPHA] = WINED3D_BLEND_ZERO;
|
||||
state->render_states[WINED3D_RS_BLENDOPALPHA] = WINED3D_BLEND_OP_ADD;
|
||||
|
||||
/* Texture Stage States - Put directly into state block, we will call function below */
|
||||
for (i = 0; i < MAX_TEXTURES; ++i)
|
||||
{
|
||||
TRACE("Setting up default texture states for texture Stage %u.\n", i);
|
||||
memcpy(&state->transforms[WINED3DTS_TEXTURE0 + i], identity, sizeof(identity));
|
||||
state->texture_states[i][WINED3DTSS_COLOROP] = i ? WINED3DTOP_DISABLE : WINED3DTOP_MODULATE;
|
||||
state->texture_states[i][WINED3DTSS_COLORARG1] = WINED3DTA_TEXTURE;
|
||||
state->texture_states[i][WINED3DTSS_COLORARG2] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3DTSS_ALPHAOP] = i ? WINED3DTOP_DISABLE : WINED3DTOP_SELECTARG1;
|
||||
state->texture_states[i][WINED3DTSS_ALPHAARG1] = WINED3DTA_TEXTURE;
|
||||
state->texture_states[i][WINED3DTSS_ALPHAARG2] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVMAT00] = 0;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVMAT01] = 0;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVMAT10] = 0;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVMAT11] = 0;
|
||||
state->texture_states[i][WINED3DTSS_TEXCOORDINDEX] = i;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVLSCALE] = 0;
|
||||
state->texture_states[i][WINED3DTSS_BUMPENVLOFFSET] = 0;
|
||||
state->texture_states[i][WINED3DTSS_TEXTURETRANSFORMFLAGS] = WINED3DTTFF_DISABLE;
|
||||
state->texture_states[i][WINED3DTSS_COLORARG0] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3DTSS_ALPHAARG0] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3DTSS_RESULTARG] = WINED3DTA_CURRENT;
|
||||
memcpy(&state->transforms[WINED3D_TS_TEXTURE0 + i], identity, sizeof(identity));
|
||||
state->texture_states[i][WINED3D_TSS_COLOR_OP] = i ? WINED3D_TOP_DISABLE : WINED3D_TOP_MODULATE;
|
||||
state->texture_states[i][WINED3D_TSS_COLOR_ARG1] = WINED3DTA_TEXTURE;
|
||||
state->texture_states[i][WINED3D_TSS_COLOR_ARG2] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3D_TSS_ALPHA_OP] = i ? WINED3D_TOP_DISABLE : WINED3D_TOP_SELECT_ARG1;
|
||||
state->texture_states[i][WINED3D_TSS_ALPHA_ARG1] = WINED3DTA_TEXTURE;
|
||||
state->texture_states[i][WINED3D_TSS_ALPHA_ARG2] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_MAT00] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_MAT01] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_MAT10] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_MAT11] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] = i;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_LSCALE] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_BUMPENV_LOFFSET] = 0;
|
||||
state->texture_states[i][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS] = WINED3D_TTFF_DISABLE;
|
||||
state->texture_states[i][WINED3D_TSS_COLOR_ARG0] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3D_TSS_ALPHA_ARG0] = WINED3DTA_CURRENT;
|
||||
state->texture_states[i][WINED3D_TSS_RESULT_ARG] = WINED3DTA_CURRENT;
|
||||
}
|
||||
state->lowest_disabled_stage = 1;
|
||||
|
||||
@@ -1264,21 +1281,21 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
for (i = 0 ; i < MAX_COMBINED_SAMPLERS; ++i)
|
||||
{
|
||||
TRACE("Setting up default samplers states for sampler %u.\n", i);
|
||||
state->sampler_states[i][WINED3DSAMP_ADDRESSU] = WINED3DTADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3DSAMP_ADDRESSV] = WINED3DTADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3DSAMP_ADDRESSW] = WINED3DTADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3DSAMP_BORDERCOLOR] = 0;
|
||||
state->sampler_states[i][WINED3DSAMP_MAGFILTER] = WINED3DTEXF_POINT;
|
||||
state->sampler_states[i][WINED3DSAMP_MINFILTER] = WINED3DTEXF_POINT;
|
||||
state->sampler_states[i][WINED3DSAMP_MIPFILTER] = WINED3DTEXF_NONE;
|
||||
state->sampler_states[i][WINED3DSAMP_MIPMAPLODBIAS] = 0;
|
||||
state->sampler_states[i][WINED3DSAMP_MAXMIPLEVEL] = 0;
|
||||
state->sampler_states[i][WINED3DSAMP_MAXANISOTROPY] = 1;
|
||||
state->sampler_states[i][WINED3DSAMP_SRGBTEXTURE] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_ADDRESS_U] = WINED3D_TADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3D_SAMP_ADDRESS_V] = WINED3D_TADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3D_SAMP_ADDRESS_W] = WINED3D_TADDRESS_WRAP;
|
||||
state->sampler_states[i][WINED3D_SAMP_BORDER_COLOR] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_MAG_FILTER] = WINED3D_TEXF_POINT;
|
||||
state->sampler_states[i][WINED3D_SAMP_MIN_FILTER] = WINED3D_TEXF_POINT;
|
||||
state->sampler_states[i][WINED3D_SAMP_MIP_FILTER] = WINED3D_TEXF_NONE;
|
||||
state->sampler_states[i][WINED3D_SAMP_MIPMAP_LOD_BIAS] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_MAX_MIP_LEVEL] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_MAX_ANISOTROPY] = 1;
|
||||
state->sampler_states[i][WINED3D_SAMP_SRGB_TEXTURE] = 0;
|
||||
/* TODO: Indicates which element of a multielement texture to use. */
|
||||
state->sampler_states[i][WINED3DSAMP_ELEMENTINDEX] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_ELEMENT_INDEX] = 0;
|
||||
/* TODO: Vertex offset in the presampled displacement map. */
|
||||
state->sampler_states[i][WINED3DSAMP_DMAPOFFSET] = 0;
|
||||
state->sampler_states[i][WINED3D_SAMP_DMAP_OFFSET] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < gl_info->limits.textures; ++i)
|
||||
@@ -1290,7 +1307,7 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
hr = wined3d_device_get_swapchain(device, 0, &swapchain);
|
||||
if (SUCCEEDED(hr) && swapchain)
|
||||
{
|
||||
hr = wined3d_swapchain_get_back_buffer(swapchain, 0, WINED3DBACKBUFFER_TYPE_MONO, &backbuffer);
|
||||
hr = wined3d_swapchain_get_back_buffer(swapchain, 0, WINED3D_BACKBUFFER_TYPE_MONO, &backbuffer);
|
||||
if (SUCCEEDED(hr) && backbuffer)
|
||||
{
|
||||
struct wined3d_resource_desc desc;
|
||||
@@ -1306,12 +1323,12 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
}
|
||||
|
||||
/* Set the default viewport */
|
||||
state->viewport.X = 0;
|
||||
state->viewport.Y = 0;
|
||||
state->viewport.Width = swapchain->presentParms.BackBufferWidth;
|
||||
state->viewport.Height = swapchain->presentParms.BackBufferHeight;
|
||||
state->viewport.MinZ = 0.0f;
|
||||
state->viewport.MaxZ = 1.0f;
|
||||
state->viewport.x = 0;
|
||||
state->viewport.y = 0;
|
||||
state->viewport.width = swapchain->desc.backbuffer_width;
|
||||
state->viewport.height = swapchain->desc.backbuffer_height;
|
||||
state->viewport.min_z = 0.0f;
|
||||
state->viewport.max_z = 1.0f;
|
||||
|
||||
wined3d_swapchain_decref(swapchain);
|
||||
}
|
||||
@@ -1320,7 +1337,7 @@ void stateblock_init_default_state(struct wined3d_stateblock *stateblock)
|
||||
}
|
||||
|
||||
static HRESULT stateblock_init(struct wined3d_stateblock *stateblock,
|
||||
struct wined3d_device *device, WINED3DSTATEBLOCKTYPE type)
|
||||
struct wined3d_device *device, enum wined3d_stateblock_type type)
|
||||
{
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
@@ -1337,26 +1354,26 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock,
|
||||
hr = stateblock_allocate_shader_constants(stateblock);
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
/* The WINED3DSBT_INIT stateblock type is used during initialization to
|
||||
/* The WINED3D_SBT_INIT stateblock type is used during initialization to
|
||||
* produce a placeholder stateblock so other functions called can update a
|
||||
* state block. */
|
||||
if (type == WINED3DSBT_INIT || type == WINED3DSBT_RECORDED) return WINED3D_OK;
|
||||
if (type == WINED3D_SBT_INIT || type == WINED3D_SBT_RECORDED) return WINED3D_OK;
|
||||
|
||||
TRACE("Updating changed flags appropriate for type %#x.\n", type);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case WINED3DSBT_ALL:
|
||||
case WINED3D_SBT_ALL:
|
||||
stateblock_init_lights(stateblock, device->stateBlock->state.light_map);
|
||||
stateblock_savedstates_set_all(&stateblock->changed, device->d3d_vshader_constantF,
|
||||
device->d3d_pshader_constantF);
|
||||
break;
|
||||
|
||||
case WINED3DSBT_PIXELSTATE:
|
||||
case WINED3D_SBT_PIXEL_STATE:
|
||||
stateblock_savedstates_set_pixel(&stateblock->changed, device->d3d_pshader_constantF);
|
||||
break;
|
||||
|
||||
case WINED3DSBT_VERTEXSTATE:
|
||||
case WINED3D_SBT_VERTEX_STATE:
|
||||
stateblock_init_lights(stateblock, device->stateBlock->state.light_map);
|
||||
stateblock_savedstates_set_vertex(&stateblock->changed, device->d3d_vshader_constantF);
|
||||
break;
|
||||
@@ -1373,7 +1390,7 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock,
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_stateblock_create(struct wined3d_device *device,
|
||||
WINED3DSTATEBLOCKTYPE type, struct wined3d_stateblock **stateblock)
|
||||
enum wined3d_stateblock_type type, struct wined3d_stateblock **stateblock)
|
||||
{
|
||||
struct wined3d_stateblock *object;
|
||||
HRESULT hr;
|
||||
|
||||
+1970
-2103
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,7 @@ WINE_DECLARE_DEBUG_CHANNEL(fps);
|
||||
/* Do not call while under the GL lock. */
|
||||
static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
WINED3DDISPLAYMODE mode;
|
||||
struct wined3d_display_mode mode;
|
||||
UINT i;
|
||||
|
||||
TRACE("Destroying swapchain %p.\n", swapchain);
|
||||
@@ -48,7 +48,7 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
|
||||
|
||||
if (swapchain->back_buffers)
|
||||
{
|
||||
i = swapchain->presentParms.BackBufferCount;
|
||||
i = swapchain->desc.backbuffer_count;
|
||||
|
||||
while (i--)
|
||||
{
|
||||
@@ -72,12 +72,12 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
|
||||
* desktop resolution. In case of d3d7 this will be a NOP because ddraw
|
||||
* sets the resolution before starting up Direct3D, thus orig_width and
|
||||
* orig_height will be equal to the modes in the presentation params. */
|
||||
if (!swapchain->presentParms.Windowed && swapchain->presentParms.AutoRestoreDisplayMode)
|
||||
if (!swapchain->desc.windowed && swapchain->desc.auto_restore_display_mode)
|
||||
{
|
||||
mode.Width = swapchain->orig_width;
|
||||
mode.Height = swapchain->orig_height;
|
||||
mode.RefreshRate = 0;
|
||||
mode.Format = swapchain->orig_fmt;
|
||||
mode.width = swapchain->orig_width;
|
||||
mode.height = swapchain->orig_height;
|
||||
mode.refresh_rate = 0;
|
||||
mode.format_id = swapchain->orig_fmt;
|
||||
wined3d_device_set_display_mode(swapchain->device, 0, &mode);
|
||||
}
|
||||
|
||||
@@ -154,20 +154,27 @@ HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
|
||||
HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapchain *swapchain,
|
||||
struct wined3d_surface *dst_surface)
|
||||
{
|
||||
POINT offset = {0, 0};
|
||||
struct wined3d_surface *src_surface;
|
||||
RECT src_rect, dst_rect;
|
||||
|
||||
TRACE("swapchain %p, dst_surface %p.\n", swapchain, dst_surface);
|
||||
|
||||
if (swapchain->presentParms.Windowed)
|
||||
MapWindowPoints(swapchain->win_handle, NULL, &offset, 1);
|
||||
src_surface = swapchain->front_buffer;
|
||||
SetRect(&src_rect, 0, 0, src_surface->resource.width, src_surface->resource.height);
|
||||
dst_rect = src_rect;
|
||||
|
||||
wined3d_surface_bltfast(dst_surface, offset.x, offset.y, swapchain->front_buffer, NULL, 0);
|
||||
if (swapchain->desc.windowed)
|
||||
{
|
||||
MapWindowPoints(swapchain->win_handle, NULL, (POINT *)&dst_rect, 2);
|
||||
FIXME("Using destination rect %s in windowed mode, this is likely wrong.\n",
|
||||
wine_dbgstr_rect(&dst_rect));
|
||||
}
|
||||
|
||||
return WINED3D_OK;
|
||||
return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, 0, NULL, WINED3D_TEXF_POINT);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain,
|
||||
UINT back_buffer_idx, WINED3DBACKBUFFER_TYPE type, struct wined3d_surface **back_buffer)
|
||||
UINT back_buffer_idx, enum wined3d_backbuffer_type type, struct wined3d_surface **back_buffer)
|
||||
{
|
||||
TRACE("swapchain %p, back_buffer_idx %u, type %#x, back_buffer %p.\n",
|
||||
swapchain, back_buffer_idx, type, back_buffer);
|
||||
@@ -177,7 +184,7 @@ HRESULT CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *
|
||||
* NULL). We need this because this function is called from
|
||||
* stateblock_init_default_state() to get the default scissorrect
|
||||
* dimensions. */
|
||||
if (!swapchain->back_buffers || back_buffer_idx >= swapchain->presentParms.BackBufferCount)
|
||||
if (!swapchain->back_buffers || back_buffer_idx >= swapchain->desc.backbuffer_count)
|
||||
{
|
||||
WARN("Invalid back buffer index.\n");
|
||||
/* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it
|
||||
@@ -196,7 +203,7 @@ HRESULT CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain,
|
||||
WINED3DRASTER_STATUS *raster_status)
|
||||
struct wined3d_raster_status *raster_status)
|
||||
{
|
||||
static BOOL warned;
|
||||
/* No OpenGL equivalent */
|
||||
@@ -214,7 +221,8 @@ HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain, WINED3DDISPLAYMODE *mode)
|
||||
HRESULT CDECL wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain,
|
||||
struct wined3d_display_mode *mode)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -223,7 +231,7 @@ HRESULT CDECL wined3d_swapchain_get_display_mode(const struct wined3d_swapchain
|
||||
hr = wined3d_get_adapter_display_mode(swapchain->device->wined3d, swapchain->device->adapter->ordinal, mode);
|
||||
|
||||
TRACE("Returning w %u, h %u, refresh rate %u, format %s.\n",
|
||||
mode->Width, mode->Height, mode->RefreshRate, debug_d3dformat(mode->Format));
|
||||
mode->width, mode->height, mode->refresh_rate, debug_d3dformat(mode->format_id));
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -235,18 +243,18 @@ struct wined3d_device * CDECL wined3d_swapchain_get_device(const struct wined3d_
|
||||
return swapchain->device;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_get_present_parameters(const struct wined3d_swapchain *swapchain,
|
||||
WINED3DPRESENT_PARAMETERS *present_parameters)
|
||||
HRESULT CDECL wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchain,
|
||||
struct wined3d_swapchain_desc *desc)
|
||||
{
|
||||
TRACE("swapchain %p, present_parameters %p.\n", swapchain, present_parameters);
|
||||
TRACE("swapchain %p, desc %p.\n", swapchain, desc);
|
||||
|
||||
*present_parameters = swapchain->presentParms;
|
||||
*desc = swapchain->desc;
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *swapchain,
|
||||
DWORD flags, const WINED3DGAMMARAMP *ramp)
|
||||
DWORD flags, const struct wined3d_gamma_ramp *ramp)
|
||||
{
|
||||
HDC dc;
|
||||
|
||||
@@ -263,7 +271,7 @@ HRESULT CDECL wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *s
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *swapchain,
|
||||
WINED3DGAMMARAMP *ramp)
|
||||
struct wined3d_gamma_ramp *ramp)
|
||||
{
|
||||
HDC dc;
|
||||
|
||||
@@ -277,11 +285,10 @@ HRESULT CDECL wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *s
|
||||
}
|
||||
|
||||
/* A GL context is provided by the caller */
|
||||
static void swapchain_blit(struct wined3d_swapchain *swapchain,
|
||||
static void swapchain_blit(const struct wined3d_swapchain *swapchain,
|
||||
struct wined3d_context *context, const RECT *src_rect, const RECT *dst_rect)
|
||||
{
|
||||
struct wined3d_surface *backbuffer = swapchain->back_buffers[0];
|
||||
struct wined3d_device *device = swapchain->device;
|
||||
UINT src_w = src_rect->right - src_rect->left;
|
||||
UINT src_h = src_rect->bottom - src_rect->top;
|
||||
GLenum gl_filter;
|
||||
@@ -302,22 +309,31 @@ static void swapchain_blit(struct wined3d_swapchain *swapchain,
|
||||
|
||||
if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format->color_fixup))
|
||||
{
|
||||
DWORD location = SFLAG_INTEXTURE;
|
||||
|
||||
if (backbuffer->resource.multisample_type)
|
||||
{
|
||||
location = SFLAG_INRB_RESOLVED;
|
||||
surface_load_location(backbuffer, location, NULL);
|
||||
}
|
||||
|
||||
ENTER_GL();
|
||||
context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, SFLAG_INTEXTURE);
|
||||
context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, location);
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||
context_check_fbo_status(context, GL_READ_FRAMEBUFFER);
|
||||
|
||||
context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL);
|
||||
context_apply_fbo_state_blit(context, GL_DRAW_FRAMEBUFFER, swapchain->front_buffer, NULL, SFLAG_INDRAWABLE);
|
||||
context_set_draw_buffer(context, GL_BACK);
|
||||
context_invalidate_state(context, STATE_FRAMEBUFFER);
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE));
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1));
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2));
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_COLORWRITEENABLE));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_COLORWRITEENABLE1));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_COLORWRITEENABLE2));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_COLORWRITEENABLE3));
|
||||
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
|
||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_SCISSORTESTENABLE));
|
||||
|
||||
/* Note that the texture is upside down */
|
||||
gl_info->fbo_ops.glBlitFramebuffer(src_rect->left, src_rect->top, src_rect->right, src_rect->bottom,
|
||||
@@ -328,6 +344,7 @@ static void swapchain_blit(struct wined3d_swapchain *swapchain,
|
||||
}
|
||||
else
|
||||
{
|
||||
struct wined3d_device *device = swapchain->device;
|
||||
struct wined3d_context *context2;
|
||||
float tex_left = src_rect->left;
|
||||
float tex_top = src_rect->top;
|
||||
@@ -349,12 +366,11 @@ static void swapchain_blit(struct wined3d_swapchain *swapchain,
|
||||
gl_filter = GL_NEAREST;
|
||||
|
||||
ENTER_GL();
|
||||
context_bind_fbo(context2, GL_FRAMEBUFFER, NULL);
|
||||
context_apply_fbo_state_blit(context2, GL_FRAMEBUFFER, swapchain->front_buffer, NULL, SFLAG_INDRAWABLE);
|
||||
|
||||
/* Set up the texture. The surface is not in a IWineD3D*Texture container,
|
||||
* so there are no d3d texture settings to dirtify
|
||||
*/
|
||||
device->blitter->set_shader(device->blit_priv, context2->gl_info, backbuffer);
|
||||
/* Set up the texture. The surface is not in a wined3d_texture
|
||||
* container, so there are no D3D texture settings to dirtify. */
|
||||
device->blitter->set_shader(device->blit_priv, context2, backbuffer);
|
||||
glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MIN_FILTER, gl_filter);
|
||||
glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MAG_FILTER, gl_filter);
|
||||
|
||||
@@ -443,9 +459,9 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
memset(&cursor, 0, sizeof(cursor));
|
||||
cursor.resource.ref = 1;
|
||||
cursor.resource.device = swapchain->device;
|
||||
cursor.resource.pool = WINED3DPOOL_SCRATCH;
|
||||
cursor.resource.pool = WINED3D_POOL_SCRATCH;
|
||||
cursor.resource.format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM);
|
||||
cursor.resource.resourceType = WINED3DRTYPE_SURFACE;
|
||||
cursor.resource.type = WINED3D_RTYPE_SURFACE;
|
||||
cursor.texture_name = swapchain->device->cursorTexture;
|
||||
cursor.texture_target = GL_TEXTURE_2D;
|
||||
cursor.texture_level = 0;
|
||||
@@ -459,17 +475,20 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
/* DDBLT_KEYSRC will cause BltOverride to enable the alpha test with GL_NOTEQUAL, 0.0,
|
||||
* which is exactly what we want :-)
|
||||
*/
|
||||
if (swapchain->presentParms.Windowed)
|
||||
MapWindowPoints(NULL, swapchain->win_handle, (LPPOINT)&destRect, 2);
|
||||
if (swapchain->desc.windowed)
|
||||
MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&destRect, 2);
|
||||
wined3d_surface_blt(swapchain->back_buffers[0], &destRect,
|
||||
&cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT);
|
||||
&cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3D_TEXF_POINT);
|
||||
}
|
||||
|
||||
if (swapchain->device->logo_surface)
|
||||
{
|
||||
struct wined3d_surface *src_surface = swapchain->device->logo_surface;
|
||||
RECT rect = {0, 0, src_surface->resource.width, src_surface->resource.height};
|
||||
|
||||
/* Blit the logo into the upper left corner of the drawable. */
|
||||
wined3d_surface_bltfast(swapchain->back_buffers[0], 0, 0,
|
||||
swapchain->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
|
||||
wined3d_surface_blt(swapchain->back_buffers[0], &rect, src_surface, &rect,
|
||||
WINEDDBLT_KEYSRC, NULL, WINED3D_TEXF_POINT);
|
||||
}
|
||||
|
||||
TRACE("Presenting HDC %p.\n", context->hdc);
|
||||
@@ -480,8 +499,8 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
{
|
||||
src_rect = *src_rect_in;
|
||||
if (!render_to_fbo && (src_rect.left || src_rect.top
|
||||
|| src_rect.right != swapchain->presentParms.BackBufferWidth
|
||||
|| src_rect.bottom != swapchain->presentParms.BackBufferHeight))
|
||||
|| src_rect.right != swapchain->desc.backbuffer_width
|
||||
|| src_rect.bottom != swapchain->desc.backbuffer_height))
|
||||
{
|
||||
render_to_fbo = TRUE;
|
||||
}
|
||||
@@ -490,8 +509,8 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
{
|
||||
src_rect.left = 0;
|
||||
src_rect.top = 0;
|
||||
src_rect.right = swapchain->presentParms.BackBufferWidth;
|
||||
src_rect.bottom = swapchain->presentParms.BackBufferHeight;
|
||||
src_rect.right = swapchain->desc.backbuffer_width;
|
||||
src_rect.bottom = swapchain->desc.backbuffer_height;
|
||||
}
|
||||
|
||||
if (dst_rect_in)
|
||||
@@ -500,11 +519,9 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
GetClientRect(swapchain->win_handle, &dst_rect);
|
||||
|
||||
if (!render_to_fbo && (dst_rect.left || dst_rect.top
|
||||
|| dst_rect.right != swapchain->presentParms.BackBufferWidth
|
||||
|| dst_rect.bottom != swapchain->presentParms.BackBufferHeight))
|
||||
{
|
||||
|| dst_rect.right != swapchain->desc.backbuffer_width
|
||||
|| dst_rect.bottom != swapchain->desc.backbuffer_height))
|
||||
render_to_fbo = TRUE;
|
||||
}
|
||||
|
||||
/* Rendering to a window of different size, presenting partial rectangles,
|
||||
* or rendering to a different window needs help from FBO_blit or a textured
|
||||
@@ -518,6 +535,7 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
surface_load_location(swapchain->back_buffers[0], SFLAG_INTEXTURE, NULL);
|
||||
surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, FALSE);
|
||||
swapchain->render_to_fbo = TRUE;
|
||||
swapchain_update_draw_bindings(swapchain);
|
||||
}
|
||||
|
||||
if (swapchain->render_to_fbo)
|
||||
@@ -528,8 +546,8 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
*
|
||||
* The DISCARD swap effect is ok as well since any backbuffer content is allowed after
|
||||
* the swap. */
|
||||
if (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP)
|
||||
FIXME("Render-to-fbo with WINED3DSWAPEFFECT_FLIP\n");
|
||||
if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP)
|
||||
FIXME("Render-to-fbo with WINED3D_SWAP_EFFECT_FLIP\n");
|
||||
|
||||
swapchain_blit(swapchain, context, &src_rect, &dst_rect);
|
||||
}
|
||||
@@ -570,12 +588,14 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
* bug shows up much more than it does on Windows, and the players see single pixels
|
||||
* with wrong colors.
|
||||
* (The Max Payne bug has been confirmed on Windows with the debug runtime) */
|
||||
if (FALSE && swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD)
|
||||
if (FALSE && swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_DISCARD)
|
||||
{
|
||||
static const struct wined3d_color cyan = {0.0f, 1.0f, 1.0f, 1.0f};
|
||||
|
||||
TRACE("Clearing the color buffer with cyan color\n");
|
||||
|
||||
wined3d_device_clear(swapchain->device, 0, NULL,
|
||||
WINED3DCLEAR_TARGET, 0xff00ffff, 1.0f, 0);
|
||||
WINED3DCLEAR_TARGET, &cyan, 1.0f, 0);
|
||||
}
|
||||
|
||||
if (!swapchain->render_to_fbo && ((swapchain->front_buffer->flags & SFLAG_INSYSMEM)
|
||||
@@ -612,16 +632,16 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
|
||||
* If the swapeffect is COPY, the content remains the same. If it is FLIP however,
|
||||
* the texture / sysmem copy needs to be reloaded from the drawable
|
||||
*/
|
||||
if (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP)
|
||||
surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, TRUE);
|
||||
if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP)
|
||||
surface_modify_location(swapchain->back_buffers[0], swapchain->back_buffers[0]->draw_binding, TRUE);
|
||||
}
|
||||
|
||||
if (fb->depth_stencil)
|
||||
{
|
||||
if (swapchain->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
|
||||
if (swapchain->desc.flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
|
||||
|| fb->depth_stencil->flags & SFLAG_DISCARD)
|
||||
{
|
||||
surface_modify_ds_location(fb->depth_stencil, SFLAG_DS_DISCARDED,
|
||||
surface_modify_ds_location(fb->depth_stencil, SFLAG_LOST,
|
||||
fb->depth_stencil->resource.width,
|
||||
fb->depth_stencil->resource.height);
|
||||
if (fb->depth_stencil == swapchain->device->onscreen_depth_stencil)
|
||||
@@ -644,9 +664,9 @@ static const struct wined3d_swapchain_ops swapchain_gl_ops =
|
||||
};
|
||||
|
||||
/* Helper function that blits the front buffer contents to the target window. */
|
||||
void x11_copy_to_screen(struct wined3d_swapchain *swapchain, const RECT *rect)
|
||||
void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *rect)
|
||||
{
|
||||
struct wined3d_surface *front;
|
||||
const struct wined3d_surface *front;
|
||||
POINT offset = {0, 0};
|
||||
HDC src_dc, dst_dc;
|
||||
RECT draw_rect;
|
||||
@@ -658,6 +678,9 @@ void x11_copy_to_screen(struct wined3d_swapchain *swapchain, const RECT *rect)
|
||||
if (!(front->resource.usage & WINED3DUSAGE_RENDERTARGET))
|
||||
return;
|
||||
|
||||
if (front->flags & SFLAG_LOCKED)
|
||||
ERR("Trying to blit a mapped surface.\n");
|
||||
|
||||
TRACE("Copying surface %p to screen.\n", front);
|
||||
|
||||
src_dc = front->hDC;
|
||||
@@ -666,53 +689,18 @@ void x11_copy_to_screen(struct wined3d_swapchain *swapchain, const RECT *rect)
|
||||
|
||||
/* Front buffer coordinates are screen coordinates. Map them to the
|
||||
* destination window if not fullscreened. */
|
||||
if (swapchain->presentParms.Windowed)
|
||||
if (swapchain->desc.windowed)
|
||||
ClientToScreen(window, &offset);
|
||||
|
||||
TRACE("offset %s.\n", wine_dbgstr_point(&offset));
|
||||
|
||||
#if 0
|
||||
/* FIXME: This doesn't work... if users really want to run
|
||||
* X in 8bpp, then we need to call directly into display.drv
|
||||
* (or Wine's equivalent), and force a private colormap
|
||||
* without default entries. */
|
||||
if (front->palette)
|
||||
{
|
||||
SelectPalette(dst_dc, front->palette->hpal, FALSE);
|
||||
RealizePalette(dst_dc); /* sends messages => deadlocks */
|
||||
}
|
||||
#endif
|
||||
|
||||
draw_rect.left = 0;
|
||||
draw_rect.right = front->resource.width;
|
||||
draw_rect.top = 0;
|
||||
draw_rect.bottom = front->resource.height;
|
||||
|
||||
#if 0
|
||||
/* TODO: Support clippers. */
|
||||
if (front->clipper)
|
||||
{
|
||||
RECT xrc;
|
||||
HWND hwnd = ((IWineD3DClipperImpl *)front->clipper)->hWnd;
|
||||
if (hwnd && GetClientRect(hwnd,&xrc))
|
||||
{
|
||||
OffsetRect(&xrc, offset.x, offset.y);
|
||||
IntersectRect(&draw_rect, &draw_rect, &xrc);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!rect)
|
||||
{
|
||||
/* Only use this if the caller did not pass a rectangle, since
|
||||
* due to double locking this could be the wrong one... */
|
||||
if (front->lockedRect.left != front->lockedRect.right)
|
||||
IntersectRect(&draw_rect, &draw_rect, &front->lockedRect);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rect)
|
||||
IntersectRect(&draw_rect, &draw_rect, rect);
|
||||
}
|
||||
|
||||
BitBlt(dst_dc, draw_rect.left - offset.x, draw_rect.top - offset.y,
|
||||
draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top,
|
||||
@@ -768,14 +756,6 @@ static HRESULT swapchain_gdi_present(struct wined3d_swapchain *swapchain, const
|
||||
ERR("GDI Surface %p has heap memory allocated.\n", back);
|
||||
}
|
||||
|
||||
/* Client_memory should not be different, but just in case. */
|
||||
{
|
||||
BOOL tmp;
|
||||
tmp = front->dib.client_memory;
|
||||
front->dib.client_memory = back->dib.client_memory;
|
||||
back->dib.client_memory = tmp;
|
||||
}
|
||||
|
||||
/* FPS support */
|
||||
if (TRACE_ON(fps))
|
||||
{
|
||||
@@ -803,28 +783,65 @@ static const struct wined3d_swapchain_ops swapchain_gdi_ops =
|
||||
swapchain_gdi_present,
|
||||
};
|
||||
|
||||
void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
RECT client_rect;
|
||||
|
||||
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
|
||||
return;
|
||||
|
||||
if (!swapchain->desc.backbuffer_count)
|
||||
{
|
||||
TRACE("Single buffered rendering.\n");
|
||||
swapchain->render_to_fbo = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
GetClientRect(swapchain->win_handle, &client_rect);
|
||||
|
||||
TRACE("Backbuffer %ux%u, window %ux%u.\n",
|
||||
swapchain->desc.backbuffer_width,
|
||||
swapchain->desc.backbuffer_height,
|
||||
client_rect.right, client_rect.bottom);
|
||||
TRACE("Multisample type %#x, quality %#x.\n",
|
||||
swapchain->desc.multisample_type,
|
||||
swapchain->desc.multisample_quality);
|
||||
|
||||
if (!wined3d_settings.always_offscreen && !swapchain->desc.multisample_type
|
||||
&& swapchain->desc.backbuffer_width == client_rect.right
|
||||
&& swapchain->desc.backbuffer_height == client_rect.bottom)
|
||||
{
|
||||
TRACE("Backbuffer dimensions match window dimensions, rendering onscreen.\n");
|
||||
swapchain->render_to_fbo = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
TRACE("Rendering to FBO.\n");
|
||||
swapchain->render_to_fbo = TRUE;
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTYPE surface_type,
|
||||
struct wined3d_device *device, WINED3DPRESENT_PARAMETERS *present_parameters,
|
||||
struct wined3d_device *device, struct wined3d_swapchain_desc *desc,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_adapter *adapter = device->adapter;
|
||||
const struct wined3d_format *format;
|
||||
struct wined3d_display_mode mode;
|
||||
BOOL displaymode_set = FALSE;
|
||||
WINED3DDISPLAYMODE mode;
|
||||
RECT client_rect;
|
||||
HWND window;
|
||||
HRESULT hr;
|
||||
UINT i;
|
||||
|
||||
if (present_parameters->BackBufferCount > WINED3DPRESENT_BACK_BUFFER_MAX)
|
||||
if (desc->backbuffer_count > WINED3DPRESENT_BACK_BUFFER_MAX)
|
||||
{
|
||||
FIXME("The application requested %u back buffers, this is not supported.\n",
|
||||
present_parameters->BackBufferCount);
|
||||
desc->backbuffer_count);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
if (present_parameters->BackBufferCount > 1)
|
||||
if (desc->backbuffer_count > 1)
|
||||
{
|
||||
FIXME("The application requested more than one back buffer, this is not properly supported.\n"
|
||||
"Please configure the application to use double buffering (1 back buffer) if possible.\n");
|
||||
@@ -840,12 +857,12 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
swapchain->swapchain_ops = &swapchain_gl_ops;
|
||||
break;
|
||||
|
||||
case SURFACE_UNKNOWN:
|
||||
FIXME("Caller tried to create a SURFACE_UNKNOWN swapchain.\n");
|
||||
default:
|
||||
ERR("Invalid surface type %#x.\n", surface_type);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
window = present_parameters->hDeviceWindow ? present_parameters->hDeviceWindow : device->createParms.hFocusWindow;
|
||||
window = desc->device_window ? desc->device_window : device->create_parms.focus_window;
|
||||
|
||||
swapchain->device = device;
|
||||
swapchain->parent = parent;
|
||||
@@ -855,54 +872,43 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
swapchain->device_window = window;
|
||||
|
||||
wined3d_get_adapter_display_mode(device->wined3d, adapter->ordinal, &mode);
|
||||
swapchain->orig_width = mode.Width;
|
||||
swapchain->orig_height = mode.Height;
|
||||
swapchain->orig_fmt = mode.Format;
|
||||
format = wined3d_get_format(&adapter->gl_info, mode.Format);
|
||||
swapchain->orig_width = mode.width;
|
||||
swapchain->orig_height = mode.height;
|
||||
swapchain->orig_fmt = mode.format_id;
|
||||
format = wined3d_get_format(&adapter->gl_info, mode.format_id);
|
||||
|
||||
GetClientRect(window, &client_rect);
|
||||
if (present_parameters->Windowed
|
||||
&& (!present_parameters->BackBufferWidth || !present_parameters->BackBufferHeight
|
||||
|| present_parameters->BackBufferFormat == WINED3DFMT_UNKNOWN))
|
||||
if (desc->windowed
|
||||
&& (!desc->backbuffer_width || !desc->backbuffer_height
|
||||
|| desc->backbuffer_format == WINED3DFMT_UNKNOWN))
|
||||
{
|
||||
|
||||
if (!present_parameters->BackBufferWidth)
|
||||
if (!desc->backbuffer_width)
|
||||
{
|
||||
present_parameters->BackBufferWidth = client_rect.right;
|
||||
TRACE("Updating width to %u.\n", present_parameters->BackBufferWidth);
|
||||
desc->backbuffer_width = client_rect.right;
|
||||
TRACE("Updating width to %u.\n", desc->backbuffer_width);
|
||||
}
|
||||
|
||||
if (!present_parameters->BackBufferHeight)
|
||||
if (!desc->backbuffer_height)
|
||||
{
|
||||
present_parameters->BackBufferHeight = client_rect.bottom;
|
||||
TRACE("Updating height to %u.\n", present_parameters->BackBufferHeight);
|
||||
desc->backbuffer_height = client_rect.bottom;
|
||||
TRACE("Updating height to %u.\n", desc->backbuffer_height);
|
||||
}
|
||||
|
||||
if (present_parameters->BackBufferFormat == WINED3DFMT_UNKNOWN)
|
||||
if (desc->backbuffer_format == WINED3DFMT_UNKNOWN)
|
||||
{
|
||||
present_parameters->BackBufferFormat = swapchain->orig_fmt;
|
||||
desc->backbuffer_format = swapchain->orig_fmt;
|
||||
TRACE("Updating format to %s.\n", debug_d3dformat(swapchain->orig_fmt));
|
||||
}
|
||||
}
|
||||
swapchain->presentParms = *present_parameters;
|
||||
|
||||
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
|
||||
&& present_parameters->BackBufferCount
|
||||
&& (present_parameters->BackBufferWidth != client_rect.right
|
||||
|| present_parameters->BackBufferHeight != client_rect.bottom))
|
||||
{
|
||||
TRACE("Rendering to FBO. Backbuffer %ux%u, window %ux%u.\n",
|
||||
present_parameters->BackBufferWidth,
|
||||
present_parameters->BackBufferHeight,
|
||||
client_rect.right, client_rect.bottom);
|
||||
swapchain->render_to_fbo = TRUE;
|
||||
}
|
||||
swapchain->desc = *desc;
|
||||
swapchain_update_render_to_fbo(swapchain);
|
||||
|
||||
TRACE("Creating front buffer.\n");
|
||||
hr = device->device_parent->ops->create_rendertarget(device->device_parent, parent,
|
||||
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
|
||||
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
|
||||
swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
|
||||
swapchain->desc.backbuffer_width, swapchain->desc.backbuffer_height,
|
||||
swapchain->desc.backbuffer_format, swapchain->desc.multisample_type,
|
||||
swapchain->desc.multisample_quality, TRUE /* Lockable */,
|
||||
&swapchain->front_buffer);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -920,15 +926,15 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
* so we should really check to see if there is a fullscreen swapchain
|
||||
* already. Does a single head count as full screen? */
|
||||
|
||||
if (!present_parameters->Windowed)
|
||||
if (!desc->windowed)
|
||||
{
|
||||
WINED3DDISPLAYMODE mode;
|
||||
struct wined3d_display_mode mode;
|
||||
|
||||
/* Change the display settings */
|
||||
mode.Width = present_parameters->BackBufferWidth;
|
||||
mode.Height = present_parameters->BackBufferHeight;
|
||||
mode.Format = present_parameters->BackBufferFormat;
|
||||
mode.RefreshRate = present_parameters->FullScreen_RefreshRateInHz;
|
||||
mode.width = desc->backbuffer_width;
|
||||
mode.height = desc->backbuffer_height;
|
||||
mode.format_id = desc->backbuffer_format;
|
||||
mode.refresh_rate = desc->refresh_rate;
|
||||
|
||||
hr = wined3d_device_set_display_mode(device, 0, &mode);
|
||||
if (FAILED(hr))
|
||||
@@ -952,7 +958,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
|
||||
swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(swapchain->context));
|
||||
swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context));
|
||||
if (!swapchain->context)
|
||||
{
|
||||
ERR("Failed to create the context array.\n");
|
||||
@@ -988,18 +994,19 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!present_parameters->EnableAutoDepthStencil
|
||||
|| swapchain->presentParms.AutoDepthStencilFormat != swapchain->ds_format->id)
|
||||
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
|
||||
&& (!desc->enable_auto_depth_stencil
|
||||
|| swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id))
|
||||
{
|
||||
FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n");
|
||||
}
|
||||
context_release(swapchain->context[0]);
|
||||
}
|
||||
|
||||
if (swapchain->presentParms.BackBufferCount > 0)
|
||||
if (swapchain->desc.backbuffer_count > 0)
|
||||
{
|
||||
swapchain->back_buffers = HeapAlloc(GetProcessHeap(), 0,
|
||||
sizeof(*swapchain->back_buffers) * swapchain->presentParms.BackBufferCount);
|
||||
sizeof(*swapchain->back_buffers) * swapchain->desc.backbuffer_count);
|
||||
if (!swapchain->back_buffers)
|
||||
{
|
||||
ERR("Failed to allocate backbuffer array memory.\n");
|
||||
@@ -1007,13 +1014,13 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
|
||||
for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
|
||||
{
|
||||
TRACE("Creating back buffer %u.\n", i);
|
||||
hr = device->device_parent->ops->create_rendertarget(device->device_parent, parent,
|
||||
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
|
||||
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
|
||||
swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
|
||||
swapchain->desc.backbuffer_width, swapchain->desc.backbuffer_height,
|
||||
swapchain->desc.backbuffer_format, swapchain->desc.multisample_type,
|
||||
swapchain->desc.multisample_quality, TRUE /* Lockable */,
|
||||
&swapchain->back_buffers[i]);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -1026,15 +1033,15 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
|
||||
}
|
||||
|
||||
/* Swapchains share the depth/stencil buffer, so only create a single depthstencil surface. */
|
||||
if (present_parameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL)
|
||||
if (desc->enable_auto_depth_stencil && surface_type == SURFACE_OPENGL)
|
||||
{
|
||||
TRACE("Creating depth/stencil buffer.\n");
|
||||
if (!device->auto_depth_stencil)
|
||||
{
|
||||
hr = device->device_parent->ops->create_depth_stencil(device->device_parent,
|
||||
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
|
||||
swapchain->presentParms.AutoDepthStencilFormat, swapchain->presentParms.MultiSampleType,
|
||||
swapchain->presentParms.MultiSampleQuality, FALSE /* FIXME: Discard */,
|
||||
swapchain->desc.backbuffer_width, swapchain->desc.backbuffer_height,
|
||||
swapchain->desc.auto_depth_stencil_format, swapchain->desc.multisample_type,
|
||||
swapchain->desc.multisample_quality, FALSE /* FIXME: Discard */,
|
||||
&device->auto_depth_stencil);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -1069,10 +1076,13 @@ err:
|
||||
|
||||
if (swapchain->back_buffers)
|
||||
{
|
||||
for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
|
||||
for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
|
||||
{
|
||||
if (swapchain->back_buffers[i])
|
||||
{
|
||||
surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
|
||||
wined3d_surface_decref(swapchain->back_buffers[i]);
|
||||
}
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
|
||||
}
|
||||
@@ -1089,22 +1099,25 @@ err:
|
||||
}
|
||||
|
||||
if (swapchain->front_buffer)
|
||||
{
|
||||
surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL);
|
||||
wined3d_surface_decref(swapchain->front_buffer);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device,
|
||||
WINED3DPRESENT_PARAMETERS *present_parameters, WINED3DSURFTYPE surface_type,
|
||||
struct wined3d_swapchain_desc *desc, WINED3DSURFTYPE surface_type,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops,
|
||||
struct wined3d_swapchain **swapchain)
|
||||
{
|
||||
struct wined3d_swapchain *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("device %p, present_parameters %p, swapchain %p, parent %p, surface_type %#x.\n",
|
||||
device, present_parameters, swapchain, parent, surface_type);
|
||||
TRACE("device %p, desc %p, swapchain %p, parent %p, surface_type %#x.\n",
|
||||
device, desc, swapchain, parent, surface_type);
|
||||
|
||||
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
|
||||
if (!object)
|
||||
@@ -1113,7 +1126,7 @@ HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device,
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
hr = swapchain_init(object, surface_type, device, present_parameters, parent, parent_ops);
|
||||
hr = swapchain_init(object, surface_type, device, desc, parent, parent_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize swapchain, hr %#x.\n", hr);
|
||||
@@ -1158,6 +1171,17 @@ static struct wined3d_context *swapchain_create_context(struct wined3d_swapchain
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < swapchain->num_contexts; ++i)
|
||||
{
|
||||
context_destroy(swapchain->device, swapchain->context[i]);
|
||||
}
|
||||
swapchain->num_contexts = 0;
|
||||
}
|
||||
|
||||
struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
DWORD tid = GetCurrentThreadId();
|
||||
@@ -1173,10 +1197,47 @@ struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchai
|
||||
return swapchain_create_context(swapchain);
|
||||
}
|
||||
|
||||
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height)
|
||||
void get_drawable_size_swapchain(const struct wined3d_context *context, UINT *width, UINT *height)
|
||||
{
|
||||
/* The drawable size of an onscreen drawable is the surface size.
|
||||
* (Actually: The window size, but the surface is created in window size) */
|
||||
*width = context->current_rt->resource.width;
|
||||
*height = context->current_rt->resource.height;
|
||||
}
|
||||
|
||||
HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
if (!swapchain->backup_dc)
|
||||
{
|
||||
TRACE("Creating the backup window for swapchain %p.\n", swapchain);
|
||||
|
||||
if (!(swapchain->backup_wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
|
||||
WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL)))
|
||||
{
|
||||
ERR("Failed to create a window.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(swapchain->backup_dc = GetDC(swapchain->backup_wnd)))
|
||||
{
|
||||
ERR("Failed to get a DC.\n");
|
||||
DestroyWindow(swapchain->backup_wnd);
|
||||
swapchain->backup_wnd = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return swapchain->backup_dc;
|
||||
}
|
||||
|
||||
void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
|
||||
{
|
||||
UINT i;
|
||||
|
||||
surface_update_draw_binding(swapchain->front_buffer);
|
||||
|
||||
for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
|
||||
{
|
||||
surface_update_draw_binding(swapchain->back_buffers[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
|
||||
|
||||
static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struct wined3d_texture_ops *texture_ops,
|
||||
UINT layer_count, UINT level_count, WINED3DRESOURCETYPE resource_type, struct wined3d_device *device,
|
||||
DWORD usage, const struct wined3d_format *format, WINED3DPOOL pool, void *parent,
|
||||
UINT layer_count, UINT level_count, enum wined3d_resource_type resource_type, struct wined3d_device *device,
|
||||
DWORD usage, const struct wined3d_format *format, enum wined3d_pool pool, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, const struct wined3d_resource_ops *resource_ops)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = resource_init(&texture->resource, device, resource_type, format,
|
||||
WINED3DMULTISAMPLE_NONE, 0, usage, pool, 0, 0, 0, 0,
|
||||
WINED3D_MULTISAMPLE_NONE, 0, usage, pool, 0, 0, 0, 0,
|
||||
parent, parent_ops, resource_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -53,7 +53,7 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
|
||||
|
||||
texture->layer_count = layer_count;
|
||||
texture->level_count = level_count;
|
||||
texture->filter_type = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE;
|
||||
texture->filter_type = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3D_TEXF_LINEAR : WINED3D_TEXF_NONE;
|
||||
texture->lod = 0;
|
||||
texture->texture_rgb.dirty = TRUE;
|
||||
texture->texture_srgb.dirty = TRUE;
|
||||
@@ -133,14 +133,14 @@ void wined3d_texture_set_dirty(struct wined3d_texture *texture, BOOL dirty)
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
const struct wined3d_gl_info *gl_info, BOOL srgb, BOOL *set_surface_desc)
|
||||
struct wined3d_context *context, BOOL srgb, BOOL *set_surface_desc)
|
||||
{
|
||||
struct gl_texture *gl_tex;
|
||||
BOOL new_texture = FALSE;
|
||||
HRESULT hr = WINED3D_OK;
|
||||
GLenum target;
|
||||
|
||||
TRACE("texture %p, srgb %#x, set_surface_desc %p.\n", texture, srgb, set_surface_desc);
|
||||
TRACE("texture %p, context %p, srgb %#x, set_surface_desc %p.\n", texture, context, srgb, set_surface_desc);
|
||||
|
||||
/* sRGB mode cache for preload() calls outside drawprim. */
|
||||
if (srgb)
|
||||
@@ -148,7 +148,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
else
|
||||
texture->flags &= ~WINED3D_TEXTURE_IS_SRGB;
|
||||
|
||||
gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, srgb);
|
||||
gl_tex = wined3d_texture_get_gl_texture(texture, context->gl_info, srgb);
|
||||
target = texture->target;
|
||||
|
||||
ENTER_GL();
|
||||
@@ -159,7 +159,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
glGenTextures(1, &gl_tex->name);
|
||||
checkGLcall("glGenTextures");
|
||||
TRACE("Generated texture %d.\n", gl_tex->name);
|
||||
if (texture->resource.pool == WINED3DPOOL_DEFAULT)
|
||||
if (texture->resource.pool == WINED3D_POOL_DEFAULT)
|
||||
{
|
||||
/* Tell OpenGL to try and keep this texture in video ram (well mostly). */
|
||||
GLclampf tmp = 0.9f;
|
||||
@@ -167,16 +167,16 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
}
|
||||
/* Initialise the state of the texture object to the OpenGL defaults,
|
||||
* not the D3D defaults. */
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSW] = WINED3DTADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3D_TADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3D_TADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSW] = WINED3D_TADDRESS_WRAP;
|
||||
gl_tex->states[WINED3DTEXSTA_BORDERCOLOR] = 0;
|
||||
gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_LINEAR;
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */
|
||||
gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3D_TEXF_LINEAR;
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3D_TEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3D_TEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */
|
||||
gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = 0;
|
||||
gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = 1;
|
||||
if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
|
||||
if (context->gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
|
||||
gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = TRUE;
|
||||
else
|
||||
gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = srgb;
|
||||
@@ -189,8 +189,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
/* This means double binding the texture at creation, but keeps
|
||||
* the code simpler all in all, and the run-time path free from
|
||||
* additional checks. */
|
||||
glBindTexture(target, gl_tex->name);
|
||||
checkGLcall("glBindTexture");
|
||||
context_bind_texture(context, target, gl_tex->name);
|
||||
glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
|
||||
checkGLcall("glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE)");
|
||||
}
|
||||
@@ -202,8 +201,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
|
||||
if (gl_tex->name)
|
||||
{
|
||||
glBindTexture(target, gl_tex->name);
|
||||
checkGLcall("glBindTexture");
|
||||
context_bind_texture(context, target, gl_tex->name);
|
||||
if (new_texture)
|
||||
{
|
||||
/* For a new texture we have to set the texture levels after
|
||||
@@ -239,22 +237,22 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
|
||||
|
||||
/* GL locking is done by the caller */
|
||||
static void apply_wrap(const struct wined3d_gl_info *gl_info, GLenum target,
|
||||
WINED3DTEXTUREADDRESS d3d_wrap, GLenum param, BOOL cond_np2)
|
||||
enum wined3d_texture_address d3d_wrap, GLenum param, BOOL cond_np2)
|
||||
{
|
||||
GLint gl_wrap;
|
||||
|
||||
if (d3d_wrap < WINED3DTADDRESS_WRAP || d3d_wrap > WINED3DTADDRESS_MIRRORONCE)
|
||||
if (d3d_wrap < WINED3D_TADDRESS_WRAP || d3d_wrap > WINED3D_TADDRESS_MIRROR_ONCE)
|
||||
{
|
||||
FIXME("Unrecognized or unsupported WINED3DTEXTUREADDRESS %#x.\n", d3d_wrap);
|
||||
FIXME("Unrecognized or unsupported texture address mode %#x.\n", d3d_wrap);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Cubemaps are always set to clamp, regardless of the sampler state. */
|
||||
if (target == GL_TEXTURE_CUBE_MAP_ARB
|
||||
|| (cond_np2 && d3d_wrap == WINED3DTADDRESS_WRAP))
|
||||
|| (cond_np2 && d3d_wrap == WINED3D_TADDRESS_WRAP))
|
||||
gl_wrap = GL_CLAMP_TO_EDGE;
|
||||
else
|
||||
gl_wrap = gl_info->wrap_lookup[d3d_wrap - WINED3DTADDRESS_WRAP];
|
||||
gl_wrap = gl_info->wrap_lookup[d3d_wrap - WINED3D_TADDRESS_WRAP];
|
||||
|
||||
TRACE("Setting param %#x to %#x for target %#x.\n", param, gl_wrap, target);
|
||||
glTexParameteri(target, param, gl_wrap);
|
||||
@@ -279,32 +277,32 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
|
||||
|
||||
/* This function relies on the correct texture being bound and loaded. */
|
||||
|
||||
if (sampler_states[WINED3DSAMP_ADDRESSU] != gl_tex->states[WINED3DTEXSTA_ADDRESSU])
|
||||
if (sampler_states[WINED3D_SAMP_ADDRESS_U] != gl_tex->states[WINED3DTEXSTA_ADDRESSU])
|
||||
{
|
||||
state = sampler_states[WINED3DSAMP_ADDRESSU];
|
||||
state = sampler_states[WINED3D_SAMP_ADDRESS_U];
|
||||
apply_wrap(gl_info, target, state, GL_TEXTURE_WRAP_S, cond_np2);
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSU] = state;
|
||||
}
|
||||
|
||||
if (sampler_states[WINED3DSAMP_ADDRESSV] != gl_tex->states[WINED3DTEXSTA_ADDRESSV])
|
||||
if (sampler_states[WINED3D_SAMP_ADDRESS_V] != gl_tex->states[WINED3DTEXSTA_ADDRESSV])
|
||||
{
|
||||
state = sampler_states[WINED3DSAMP_ADDRESSV];
|
||||
state = sampler_states[WINED3D_SAMP_ADDRESS_V];
|
||||
apply_wrap(gl_info, target, state, GL_TEXTURE_WRAP_T, cond_np2);
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSV] = state;
|
||||
}
|
||||
|
||||
if (sampler_states[WINED3DSAMP_ADDRESSW] != gl_tex->states[WINED3DTEXSTA_ADDRESSW])
|
||||
if (sampler_states[WINED3D_SAMP_ADDRESS_W] != gl_tex->states[WINED3DTEXSTA_ADDRESSW])
|
||||
{
|
||||
state = sampler_states[WINED3DSAMP_ADDRESSW];
|
||||
state = sampler_states[WINED3D_SAMP_ADDRESS_W];
|
||||
apply_wrap(gl_info, target, state, GL_TEXTURE_WRAP_R, cond_np2);
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSW] = state;
|
||||
}
|
||||
|
||||
if (sampler_states[WINED3DSAMP_BORDERCOLOR] != gl_tex->states[WINED3DTEXSTA_BORDERCOLOR])
|
||||
if (sampler_states[WINED3D_SAMP_BORDER_COLOR] != gl_tex->states[WINED3DTEXSTA_BORDERCOLOR])
|
||||
{
|
||||
float col[4];
|
||||
|
||||
state = sampler_states[WINED3DSAMP_BORDERCOLOR];
|
||||
state = sampler_states[WINED3D_SAMP_BORDER_COLOR];
|
||||
D3DCOLORTOGLFLOAT4(state, col);
|
||||
TRACE("Setting border color for %#x to %#x.\n", target, state);
|
||||
glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, &col[0]);
|
||||
@@ -312,52 +310,52 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
|
||||
gl_tex->states[WINED3DTEXSTA_BORDERCOLOR] = state;
|
||||
}
|
||||
|
||||
if (sampler_states[WINED3DSAMP_MAGFILTER] != gl_tex->states[WINED3DTEXSTA_MAGFILTER])
|
||||
if (sampler_states[WINED3D_SAMP_MAG_FILTER] != gl_tex->states[WINED3DTEXSTA_MAGFILTER])
|
||||
{
|
||||
GLint gl_value;
|
||||
|
||||
state = sampler_states[WINED3DSAMP_MAGFILTER];
|
||||
if (state > WINED3DTEXF_ANISOTROPIC)
|
||||
state = sampler_states[WINED3D_SAMP_MAG_FILTER];
|
||||
if (state > WINED3D_TEXF_ANISOTROPIC)
|
||||
FIXME("Unrecognized or unsupported MAGFILTER* value %d.\n", state);
|
||||
|
||||
gl_value = wined3d_gl_mag_filter(texture->mag_lookup,
|
||||
min(max(state, WINED3DTEXF_POINT), WINED3DTEXF_LINEAR));
|
||||
min(max(state, WINED3D_TEXF_POINT), WINED3D_TEXF_LINEAR));
|
||||
TRACE("ValueMAG=%#x setting MAGFILTER to %#x.\n", state, gl_value);
|
||||
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, gl_value);
|
||||
|
||||
gl_tex->states[WINED3DTEXSTA_MAGFILTER] = state;
|
||||
}
|
||||
|
||||
if ((sampler_states[WINED3DSAMP_MINFILTER] != gl_tex->states[WINED3DTEXSTA_MINFILTER]
|
||||
|| sampler_states[WINED3DSAMP_MIPFILTER] != gl_tex->states[WINED3DTEXSTA_MIPFILTER]
|
||||
|| sampler_states[WINED3DSAMP_MAXMIPLEVEL] != gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL]))
|
||||
if ((sampler_states[WINED3D_SAMP_MIN_FILTER] != gl_tex->states[WINED3DTEXSTA_MINFILTER]
|
||||
|| sampler_states[WINED3D_SAMP_MIP_FILTER] != gl_tex->states[WINED3DTEXSTA_MIPFILTER]
|
||||
|| sampler_states[WINED3D_SAMP_MAX_MIP_LEVEL] != gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL]))
|
||||
{
|
||||
GLint gl_value;
|
||||
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = sampler_states[WINED3DSAMP_MIPFILTER];
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = sampler_states[WINED3DSAMP_MINFILTER];
|
||||
gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = sampler_states[WINED3DSAMP_MAXMIPLEVEL];
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = sampler_states[WINED3D_SAMP_MIP_FILTER];
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = sampler_states[WINED3D_SAMP_MIN_FILTER];
|
||||
gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = sampler_states[WINED3D_SAMP_MAX_MIP_LEVEL];
|
||||
|
||||
if (gl_tex->states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC
|
||||
|| gl_tex->states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_ANISOTROPIC)
|
||||
if (gl_tex->states[WINED3DTEXSTA_MINFILTER] > WINED3D_TEXF_ANISOTROPIC
|
||||
|| gl_tex->states[WINED3DTEXSTA_MIPFILTER] > WINED3D_TEXF_ANISOTROPIC)
|
||||
{
|
||||
FIXME("Unrecognized or unsupported D3DSAMP_MINFILTER value %#x D3DSAMP_MIPFILTER value %#x.\n",
|
||||
FIXME("Unrecognized or unsupported MIN_FILTER value %#x MIP_FILTER value %#x.\n",
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER],
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER]);
|
||||
}
|
||||
gl_value = wined3d_gl_min_mip_filter(texture->min_mip_lookup,
|
||||
min(max(sampler_states[WINED3DSAMP_MINFILTER], WINED3DTEXF_POINT), WINED3DTEXF_LINEAR),
|
||||
min(max(sampler_states[WINED3DSAMP_MIPFILTER], WINED3DTEXF_NONE), WINED3DTEXF_LINEAR));
|
||||
min(max(sampler_states[WINED3D_SAMP_MIN_FILTER], WINED3D_TEXF_POINT), WINED3D_TEXF_LINEAR),
|
||||
min(max(sampler_states[WINED3D_SAMP_MIP_FILTER], WINED3D_TEXF_NONE), WINED3D_TEXF_LINEAR));
|
||||
|
||||
TRACE("ValueMIN=%#x, ValueMIP=%#x, setting MINFILTER to %#x.\n",
|
||||
sampler_states[WINED3DSAMP_MINFILTER],
|
||||
sampler_states[WINED3DSAMP_MIPFILTER], gl_value);
|
||||
sampler_states[WINED3D_SAMP_MIN_FILTER],
|
||||
sampler_states[WINED3D_SAMP_MIP_FILTER], gl_value);
|
||||
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, gl_value);
|
||||
checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ...");
|
||||
|
||||
if (!cond_np2)
|
||||
{
|
||||
if (gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE)
|
||||
if (gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3D_TEXF_NONE)
|
||||
gl_value = texture->lod;
|
||||
else if (gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= texture->level_count)
|
||||
gl_value = texture->level_count - 1;
|
||||
@@ -367,21 +365,21 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
|
||||
else
|
||||
gl_value = gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL];
|
||||
|
||||
/* Note that WINED3DSAMP_MAXMIPLEVEL specifies the largest mipmap
|
||||
/* Note that WINED3D_SAMP_MAX_MIP_LEVEL specifies the largest mipmap
|
||||
* (default 0), while GL_TEXTURE_MAX_LEVEL specifies the smallest
|
||||
* mimap used (default 1000). So WINED3DSAMP_MAXMIPLEVEL
|
||||
* mimap used (default 1000). So WINED3D_SAMP_MAX_MIP_LEVEL
|
||||
* corresponds to GL_TEXTURE_BASE_LEVEL. */
|
||||
glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, gl_value);
|
||||
}
|
||||
}
|
||||
|
||||
if ((gl_tex->states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_ANISOTROPIC
|
||||
&& gl_tex->states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_ANISOTROPIC
|
||||
&& gl_tex->states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_ANISOTROPIC)
|
||||
if ((gl_tex->states[WINED3DTEXSTA_MAGFILTER] != WINED3D_TEXF_ANISOTROPIC
|
||||
&& gl_tex->states[WINED3DTEXSTA_MINFILTER] != WINED3D_TEXF_ANISOTROPIC
|
||||
&& gl_tex->states[WINED3DTEXSTA_MIPFILTER] != WINED3D_TEXF_ANISOTROPIC)
|
||||
|| cond_np2)
|
||||
aniso = 1;
|
||||
else
|
||||
aniso = sampler_states[WINED3DSAMP_MAXANISOTROPY];
|
||||
aniso = sampler_states[WINED3D_SAMP_MAX_ANISOTROPY];
|
||||
|
||||
if (gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] != aniso)
|
||||
{
|
||||
@@ -398,11 +396,12 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
|
||||
}
|
||||
|
||||
/* These should always be the same unless EXT_texture_sRGB_decode is supported. */
|
||||
if (sampler_states[WINED3DSAMP_SRGBTEXTURE] != gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE])
|
||||
if (sampler_states[WINED3D_SAMP_SRGB_TEXTURE] != gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE])
|
||||
{
|
||||
glTexParameteri(target, GL_TEXTURE_SRGB_DECODE_EXT,
|
||||
sampler_states[WINED3DSAMP_SRGBTEXTURE] ? GL_DECODE_EXT : GL_SKIP_DECODE_EXT);
|
||||
sampler_states[WINED3D_SAMP_SRGB_TEXTURE] ? GL_DECODE_EXT : GL_SKIP_DECODE_EXT);
|
||||
checkGLcall("glTexParameteri(GL_TEXTURE_SRGB_DECODE_EXT)");
|
||||
gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = sampler_states[WINED3D_SAMP_SRGB_TEXTURE];
|
||||
}
|
||||
|
||||
if (!(texture->resource.format->flags & WINED3DFMT_FLAG_SHADOW)
|
||||
@@ -450,21 +449,11 @@ ULONG CDECL wined3d_texture_decref(struct wined3d_texture *texture)
|
||||
return refcount;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_set_private_data(struct wined3d_texture *texture,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
struct wined3d_resource * CDECL wined3d_texture_get_resource(struct wined3d_texture *texture)
|
||||
{
|
||||
return resource_set_private_data(&texture->resource, guid, data, data_size, flags);
|
||||
}
|
||||
TRACE("texture %p.\n", texture);
|
||||
|
||||
HRESULT CDECL wined3d_texture_get_private_data(const struct wined3d_texture *texture,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
return resource_get_private_data(&texture->resource, guid, data, data_size);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_free_private_data(struct wined3d_texture *texture, REFGUID guid)
|
||||
{
|
||||
return resource_free_private_data(&texture->resource, guid);
|
||||
return &texture->resource;
|
||||
}
|
||||
|
||||
DWORD CDECL wined3d_texture_set_priority(struct wined3d_texture *texture, DWORD priority)
|
||||
@@ -483,13 +472,6 @@ void CDECL wined3d_texture_preload(struct wined3d_texture *texture)
|
||||
texture->texture_ops->texture_preload(texture, SRGB_ANY);
|
||||
}
|
||||
|
||||
WINED3DRESOURCETYPE CDECL wined3d_texture_get_type(const struct wined3d_texture *texture)
|
||||
{
|
||||
TRACE("texture %p.\n", texture);
|
||||
|
||||
return texture->resource.resourceType;
|
||||
}
|
||||
|
||||
void * CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture)
|
||||
{
|
||||
TRACE("texture %p.\n", texture);
|
||||
@@ -505,7 +487,7 @@ DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod)
|
||||
|
||||
/* The d3d9:texture test shows that SetLOD is ignored on non-managed
|
||||
* textures. The call always returns 0, and GetLOD always returns 0. */
|
||||
if (texture->resource.pool != WINED3DPOOL_MANAGED)
|
||||
if (texture->resource.pool != WINED3D_POOL_MANAGED)
|
||||
{
|
||||
TRACE("Ignoring SetLOD on %s texture, returning 0.\n", debug_d3dpool(texture->resource.pool));
|
||||
return 0;
|
||||
@@ -521,7 +503,7 @@ DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod)
|
||||
texture->texture_rgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U;
|
||||
texture->texture_srgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U;
|
||||
if (texture->bind_count)
|
||||
IWineD3DDeviceImpl_MarkStateDirty(texture->resource.device, STATE_SAMPLER(texture->sampler));
|
||||
device_invalidate_state(texture->resource.device, STATE_SAMPLER(texture->sampler));
|
||||
}
|
||||
|
||||
return old;
|
||||
@@ -542,7 +524,7 @@ DWORD CDECL wined3d_texture_get_level_count(const struct wined3d_texture *textur
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_set_autogen_filter_type(struct wined3d_texture *texture,
|
||||
WINED3DTEXTUREFILTERTYPE filter_type)
|
||||
enum wined3d_texture_filter_type filter_type)
|
||||
{
|
||||
FIXME("texture %p, filter_type %s stub!\n", texture, debug_d3dtexturefiltertype(filter_type));
|
||||
|
||||
@@ -557,7 +539,7 @@ HRESULT CDECL wined3d_texture_set_autogen_filter_type(struct wined3d_texture *te
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
WINED3DTEXTUREFILTERTYPE CDECL wined3d_texture_get_autogen_filter_type(const struct wined3d_texture *texture)
|
||||
enum wined3d_texture_filter_type CDECL wined3d_texture_get_autogen_filter_type(const struct wined3d_texture *texture)
|
||||
{
|
||||
TRACE("texture %p.\n", texture);
|
||||
|
||||
@@ -587,7 +569,7 @@ struct wined3d_resource * CDECL wined3d_texture_get_sub_resource(struct wined3d_
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
|
||||
UINT layer, const WINED3DBOX *dirty_region)
|
||||
UINT layer, const struct wined3d_box *dirty_region)
|
||||
{
|
||||
struct wined3d_resource *sub_resource;
|
||||
|
||||
@@ -607,23 +589,23 @@ HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static HRESULT texture2d_bind(struct wined3d_texture *texture,
|
||||
const struct wined3d_gl_info *gl_info, BOOL srgb)
|
||||
struct wined3d_context *context, BOOL srgb)
|
||||
{
|
||||
BOOL set_gl_texture_desc;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("texture %p, gl_info %p, srgb %#x.\n", texture, gl_info, srgb);
|
||||
TRACE("texture %p, context %p, srgb %#x.\n", texture, context, srgb);
|
||||
|
||||
hr = wined3d_texture_bind(texture, gl_info, srgb, &set_gl_texture_desc);
|
||||
hr = wined3d_texture_bind(texture, context, srgb, &set_gl_texture_desc);
|
||||
if (set_gl_texture_desc && SUCCEEDED(hr))
|
||||
{
|
||||
UINT sub_count = texture->level_count * texture->layer_count;
|
||||
BOOL srgb_tex = !gl_info->supported[EXT_TEXTURE_SRGB_DECODE]
|
||||
BOOL srgb_tex = !context->gl_info->supported[EXT_TEXTURE_SRGB_DECODE]
|
||||
&& (texture->flags & WINED3D_TEXTURE_IS_SRGB);
|
||||
struct gl_texture *gl_tex;
|
||||
UINT i;
|
||||
|
||||
gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, srgb_tex);
|
||||
gl_tex = wined3d_texture_get_gl_texture(texture, context->gl_info, srgb_tex);
|
||||
|
||||
for (i = 0; i < sub_count; ++i)
|
||||
{
|
||||
@@ -653,18 +635,18 @@ static HRESULT texture2d_bind(struct wined3d_texture *texture,
|
||||
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
|
||||
LEAVE_GL();
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_CLAMP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_CLAMP;
|
||||
gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3D_TADDRESS_CLAMP;
|
||||
gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3D_TADDRESS_CLAMP;
|
||||
gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3D_TEXF_POINT;
|
||||
gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3D_TEXF_POINT;
|
||||
gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3D_TEXF_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static BOOL texture_srgb_mode(struct wined3d_texture *texture, enum WINED3DSRGB srgb)
|
||||
static BOOL texture_srgb_mode(const struct wined3d_texture *texture, enum WINED3DSRGB srgb)
|
||||
{
|
||||
switch (srgb)
|
||||
{
|
||||
@@ -702,25 +684,6 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
|
||||
context = context_acquire(device, NULL);
|
||||
}
|
||||
|
||||
if (texture->resource.format->id == WINED3DFMT_P8_UINT
|
||||
|| texture->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM)
|
||||
{
|
||||
for (i = 0; i < sub_count; ++i)
|
||||
{
|
||||
struct wined3d_surface *surface = surface_from_resource(texture->sub_resources[i]);
|
||||
|
||||
if (palette9_changed(surface))
|
||||
{
|
||||
TRACE("Reloading surface %p because the d3d8/9 palette was changed.\n", surface);
|
||||
/* TODO: This is not necessarily needed with hw palettized texture support. */
|
||||
surface_load_location(surface, SFLAG_INSYSMEM, NULL);
|
||||
/* Make sure the texture is reloaded because of the palette
|
||||
* change, this kills performance though :( */
|
||||
surface_modify_location(surface, SFLAG_INTEXTURE, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gl_tex->dirty)
|
||||
{
|
||||
/* Reload the surfaces if the texture is marked dirty. */
|
||||
@@ -741,7 +704,7 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
|
||||
}
|
||||
|
||||
static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource,
|
||||
const WINED3DBOX *dirty_region)
|
||||
const struct wined3d_box *dirty_region)
|
||||
{
|
||||
surface_add_dirty_rect(surface_from_resource(sub_resource), dirty_region);
|
||||
}
|
||||
@@ -795,7 +758,7 @@ static const struct wined3d_resource_ops texture2d_resource_ops =
|
||||
};
|
||||
|
||||
static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_length, UINT levels,
|
||||
struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool,
|
||||
struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
@@ -813,7 +776,7 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP] && pool != WINED3DPOOL_SCRATCH)
|
||||
if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP] && pool != WINED3D_POOL_SCRATCH)
|
||||
{
|
||||
WARN("(%p) : Tried to create not supported cube texture.\n", texture);
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
@@ -843,7 +806,7 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||
}
|
||||
|
||||
hr = wined3d_texture_init(texture, &texture2d_ops, 6, levels,
|
||||
WINED3DRTYPE_CUBETEXTURE, device, usage, format, pool,
|
||||
WINED3D_RTYPE_CUBE_TEXTURE, device, usage, format, pool,
|
||||
parent, parent_ops, &texture2d_resource_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -914,7 +877,7 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||
}
|
||||
|
||||
static HRESULT texture_init(struct wined3d_texture *texture, UINT width, UINT height, UINT levels,
|
||||
struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool,
|
||||
struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
@@ -980,7 +943,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, UINT width, UINT he
|
||||
}
|
||||
|
||||
hr = wined3d_texture_init(texture, &texture2d_ops, 1, levels,
|
||||
WINED3DRTYPE_TEXTURE, device, usage, format, pool,
|
||||
WINED3D_RTYPE_TEXTURE, device, usage, format, pool,
|
||||
parent, parent_ops, &texture2d_resource_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -1072,28 +1035,28 @@ static HRESULT texture_init(struct wined3d_texture *texture, UINT width, UINT he
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static HRESULT texture3d_bind(struct wined3d_texture *texture,
|
||||
const struct wined3d_gl_info *gl_info, BOOL srgb)
|
||||
struct wined3d_context *context, BOOL srgb)
|
||||
{
|
||||
BOOL dummy;
|
||||
|
||||
TRACE("texture %p, gl_info %p, srgb %#x.\n", texture, gl_info, srgb);
|
||||
TRACE("texture %p, context %p, srgb %#x.\n", texture, context, srgb);
|
||||
|
||||
return wined3d_texture_bind(texture, gl_info, srgb, &dummy);
|
||||
return wined3d_texture_bind(texture, context, srgb, &dummy);
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB srgb)
|
||||
{
|
||||
struct wined3d_device *device = texture->resource.device;
|
||||
struct wined3d_context *context = NULL;
|
||||
struct wined3d_context *context;
|
||||
BOOL srgb_was_toggled = FALSE;
|
||||
unsigned int i;
|
||||
|
||||
TRACE("texture %p, srgb %#x.\n", texture, srgb);
|
||||
|
||||
if (!device->isInDraw)
|
||||
context = context_acquire(device, NULL);
|
||||
else if (texture->bind_count > 0)
|
||||
/* TODO: Use already acquired context when possible. */
|
||||
context = context_acquire(device, NULL);
|
||||
if (texture->bind_count > 0)
|
||||
{
|
||||
BOOL texture_srgb = texture->flags & WINED3D_TEXTURE_IS_SRGB;
|
||||
BOOL sampler_srgb = texture_srgb_mode(texture, srgb);
|
||||
@@ -1114,7 +1077,7 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
|
||||
{
|
||||
for (i = 0; i < texture->level_count; ++i)
|
||||
{
|
||||
volume_load(volume_from_resource(texture->sub_resources[i]), i,
|
||||
volume_load(volume_from_resource(texture->sub_resources[i]), context, i,
|
||||
texture->flags & WINED3D_TEXTURE_IS_SRGB);
|
||||
}
|
||||
}
|
||||
@@ -1124,7 +1087,7 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
|
||||
{
|
||||
struct wined3d_volume *volume = volume_from_resource(texture->sub_resources[i]);
|
||||
volume_add_dirty_box(volume, NULL);
|
||||
volume_load(volume, i, texture->flags & WINED3D_TEXTURE_IS_SRGB);
|
||||
volume_load(volume, context, i, texture->flags & WINED3D_TEXTURE_IS_SRGB);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1132,15 +1095,14 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
|
||||
TRACE("Texture %p not dirty, nothing to do.\n", texture);
|
||||
}
|
||||
|
||||
if (context)
|
||||
context_release(context);
|
||||
context_release(context);
|
||||
|
||||
/* No longer dirty */
|
||||
texture->texture_rgb.dirty = FALSE;
|
||||
}
|
||||
|
||||
static void texture3d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource,
|
||||
const WINED3DBOX *dirty_region)
|
||||
const struct wined3d_box *dirty_region)
|
||||
{
|
||||
volume_add_dirty_box(volume_from_resource(sub_resource), dirty_region);
|
||||
}
|
||||
@@ -1186,7 +1148,7 @@ static const struct wined3d_resource_ops texture3d_resource_ops =
|
||||
|
||||
static HRESULT volumetexture_init(struct wined3d_texture *texture, UINT width, UINT height,
|
||||
UINT depth, UINT levels, struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id,
|
||||
WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
enum wined3d_pool pool, void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
|
||||
@@ -1232,7 +1194,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, UINT width, U
|
||||
}
|
||||
|
||||
hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels,
|
||||
WINED3DRTYPE_VOLUMETEXTURE, device, usage, format, pool,
|
||||
WINED3D_RTYPE_VOLUME_TEXTURE, device, usage, format, pool,
|
||||
parent, parent_ops, &texture3d_resource_ops);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
@@ -1280,7 +1242,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, UINT width, U
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_create_2d(struct wined3d_device *device, UINT width, UINT height,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, void *parent,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
|
||||
{
|
||||
struct wined3d_texture *object;
|
||||
@@ -1316,7 +1278,7 @@ HRESULT CDECL wined3d_texture_create_2d(struct wined3d_device *device, UINT widt
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_create_3d(struct wined3d_device *device, UINT width, UINT height, UINT depth,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, void *parent,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
|
||||
{
|
||||
struct wined3d_texture *object;
|
||||
@@ -1352,7 +1314,7 @@ HRESULT CDECL wined3d_texture_create_3d(struct wined3d_device *device, UINT widt
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_texture_create_cube(struct wined3d_device *device, UINT edge_length,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, void *parent,
|
||||
UINT level_count, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
|
||||
{
|
||||
struct wined3d_texture *object;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,8 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d_decl);
|
||||
|
||||
static void dump_wined3dvertexelement(const WINED3DVERTEXELEMENT *element) {
|
||||
static void dump_wined3d_vertex_element(const struct wined3d_vertex_element *element)
|
||||
{
|
||||
TRACE(" format: %s (%#x)\n", debug_d3dformat(element->format), element->format);
|
||||
TRACE(" input_slot: %u\n", element->input_slot);
|
||||
TRACE(" offset: %u\n", element->offset);
|
||||
@@ -69,7 +70,7 @@ void * CDECL wined3d_vertex_declaration_get_parent(const struct wined3d_vertex_d
|
||||
return declaration->parent;
|
||||
}
|
||||
|
||||
static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element)
|
||||
static BOOL declaration_element_valid_ffp(const struct wined3d_vertex_element *element)
|
||||
{
|
||||
switch(element->usage)
|
||||
{
|
||||
@@ -158,7 +159,7 @@ static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element)
|
||||
}
|
||||
|
||||
static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declaration,
|
||||
struct wined3d_device *device, const WINED3DVERTEXELEMENT *elements, UINT element_count,
|
||||
struct wined3d_device *device, const struct wined3d_vertex_element *elements, UINT element_count,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
@@ -169,7 +170,7 @@ static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declara
|
||||
{
|
||||
for (i = 0; i < element_count; ++i)
|
||||
{
|
||||
dump_wined3dvertexelement(elements + i);
|
||||
dump_wined3d_vertex_element(elements + i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,7 +239,7 @@ static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declara
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_vertex_declaration_create(struct wined3d_device *device,
|
||||
const WINED3DVERTEXELEMENT *elements, UINT element_count, void *parent,
|
||||
const struct wined3d_vertex_element *elements, UINT element_count, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_vertex_declaration **declaration)
|
||||
{
|
||||
struct wined3d_vertex_declaration *object;
|
||||
@@ -271,7 +272,7 @@ HRESULT CDECL wined3d_vertex_declaration_create(struct wined3d_device *device,
|
||||
struct wined3d_fvf_convert_state
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info;
|
||||
WINED3DVERTEXELEMENT *elements;
|
||||
struct wined3d_vertex_element *elements;
|
||||
UINT offset;
|
||||
UINT idx;
|
||||
};
|
||||
@@ -279,7 +280,7 @@ struct wined3d_fvf_convert_state
|
||||
static void append_decl_element(struct wined3d_fvf_convert_state *state,
|
||||
enum wined3d_format_id format_id, WINED3DDECLUSAGE usage, UINT usage_idx)
|
||||
{
|
||||
WINED3DVERTEXELEMENT *elements = state->elements;
|
||||
struct wined3d_vertex_element *elements = state->elements;
|
||||
const struct wined3d_format *format;
|
||||
UINT offset = state->offset;
|
||||
UINT idx = state->idx;
|
||||
@@ -298,7 +299,7 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state,
|
||||
}
|
||||
|
||||
static unsigned int convert_fvf_to_declaration(const struct wined3d_gl_info *gl_info,
|
||||
DWORD fvf, WINED3DVERTEXELEMENT **elements)
|
||||
DWORD fvf, struct wined3d_vertex_element **elements)
|
||||
{
|
||||
BOOL has_pos = !!(fvf & WINED3DFVF_POSITION_MASK);
|
||||
BOOL has_blend = (fvf & WINED3DFVF_XYZB5) > WINED3DFVF_XYZRHW;
|
||||
@@ -408,7 +409,7 @@ HRESULT CDECL wined3d_vertex_declaration_create_from_fvf(struct wined3d_device *
|
||||
DWORD fvf, void *parent, const struct wined3d_parent_ops *parent_ops,
|
||||
struct wined3d_vertex_declaration **declaration)
|
||||
{
|
||||
WINED3DVERTEXELEMENT *elements;
|
||||
struct wined3d_vertex_element *elements;
|
||||
unsigned int size;
|
||||
DWORD hr;
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void volume_bind_and_dirtify(struct wined3d_volume *volume, const struct wined3d_gl_info *gl_info)
|
||||
static void volume_bind_and_dirtify(const struct wined3d_volume *volume, struct wined3d_context *context)
|
||||
{
|
||||
struct wined3d_texture *container = volume->container;
|
||||
DWORD active_sampler;
|
||||
@@ -37,49 +37,35 @@ static void volume_bind_and_dirtify(struct wined3d_volume *volume, const struct
|
||||
* To be more specific, this is tricky because we can implicitly be called
|
||||
* from sampler() in state.c. This means we can't touch anything other than
|
||||
* whatever happens to be the currently active texture, or we would risk
|
||||
* marking already applied sampler states dirty again.
|
||||
*
|
||||
* TODO: Track the current active texture per GL context instead of using glGet
|
||||
*/
|
||||
if (gl_info->supported[ARB_MULTITEXTURE])
|
||||
{
|
||||
GLint active_texture;
|
||||
ENTER_GL();
|
||||
glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);
|
||||
LEAVE_GL();
|
||||
active_sampler = volume->resource.device->rev_tex_unit_map[active_texture - GL_TEXTURE0_ARB];
|
||||
} else {
|
||||
active_sampler = 0;
|
||||
}
|
||||
* marking already applied sampler states dirty again. */
|
||||
active_sampler = volume->resource.device->rev_tex_unit_map[context->active_texture];
|
||||
|
||||
if (active_sampler != WINED3D_UNMAPPED_STAGE)
|
||||
{
|
||||
IWineD3DDeviceImpl_MarkStateDirty(volume->resource.device, STATE_SAMPLER(active_sampler));
|
||||
}
|
||||
device_invalidate_state(volume->resource.device, STATE_SAMPLER(active_sampler));
|
||||
|
||||
container->texture_ops->texture_bind(container, gl_info, FALSE);
|
||||
container->texture_ops->texture_bind(container, context, FALSE);
|
||||
}
|
||||
|
||||
void volume_add_dirty_box(struct wined3d_volume *volume, const WINED3DBOX *dirty_box)
|
||||
void volume_add_dirty_box(struct wined3d_volume *volume, const struct wined3d_box *dirty_box)
|
||||
{
|
||||
volume->dirty = TRUE;
|
||||
if (dirty_box)
|
||||
{
|
||||
volume->lockedBox.Left = min(volume->lockedBox.Left, dirty_box->Left);
|
||||
volume->lockedBox.Top = min(volume->lockedBox.Top, dirty_box->Top);
|
||||
volume->lockedBox.Front = min(volume->lockedBox.Front, dirty_box->Front);
|
||||
volume->lockedBox.Right = max(volume->lockedBox.Right, dirty_box->Right);
|
||||
volume->lockedBox.Bottom = max(volume->lockedBox.Bottom, dirty_box->Bottom);
|
||||
volume->lockedBox.Back = max(volume->lockedBox.Back, dirty_box->Back);
|
||||
volume->lockedBox.left = min(volume->lockedBox.left, dirty_box->left);
|
||||
volume->lockedBox.top = min(volume->lockedBox.top, dirty_box->top);
|
||||
volume->lockedBox.front = min(volume->lockedBox.front, dirty_box->front);
|
||||
volume->lockedBox.right = max(volume->lockedBox.right, dirty_box->right);
|
||||
volume->lockedBox.bottom = max(volume->lockedBox.bottom, dirty_box->bottom);
|
||||
volume->lockedBox.back = max(volume->lockedBox.back, dirty_box->back);
|
||||
}
|
||||
else
|
||||
{
|
||||
volume->lockedBox.Left = 0;
|
||||
volume->lockedBox.Top = 0;
|
||||
volume->lockedBox.Front = 0;
|
||||
volume->lockedBox.Right = volume->resource.width;
|
||||
volume->lockedBox.Bottom = volume->resource.height;
|
||||
volume->lockedBox.Back = volume->resource.depth;
|
||||
volume->lockedBox.left = 0;
|
||||
volume->lockedBox.top = 0;
|
||||
volume->lockedBox.front = 0;
|
||||
volume->lockedBox.right = volume->resource.width;
|
||||
volume->lockedBox.bottom = volume->resource.height;
|
||||
volume->lockedBox.back = volume->resource.depth;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,15 +77,15 @@ void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
void volume_load(struct wined3d_volume *volume, UINT level, BOOL srgb_mode)
|
||||
void volume_load(const struct wined3d_volume *volume, struct wined3d_context *context, UINT level, BOOL srgb_mode)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &volume->resource.device->adapter->gl_info;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
const struct wined3d_format *format = volume->resource.format;
|
||||
|
||||
TRACE("volume %p, level %u, srgb %#x, format %s (%#x).\n",
|
||||
volume, level, srgb_mode, debug_d3dformat(format->id), format->id);
|
||||
TRACE("volume %p, context %p, level %u, srgb %#x, format %s (%#x).\n",
|
||||
volume, context, level, srgb_mode, debug_d3dformat(format->id), format->id);
|
||||
|
||||
volume_bind_and_dirtify(volume, gl_info);
|
||||
volume_bind_and_dirtify(volume, context);
|
||||
|
||||
ENTER_GL();
|
||||
GL_EXTCALL(glTexImage3DEXT(GL_TEXTURE_3D, level, format->glInternal,
|
||||
@@ -175,23 +161,6 @@ void * CDECL wined3d_volume_get_parent(const struct wined3d_volume *volume)
|
||||
return volume->resource.parent;
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_volume_set_private_data(struct wined3d_volume *volume,
|
||||
REFGUID guid, const void *data, DWORD data_size, DWORD flags)
|
||||
{
|
||||
return resource_set_private_data(&volume->resource, guid, data, data_size, flags);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_volume_get_private_data(const struct wined3d_volume *volume,
|
||||
REFGUID guid, void *data, DWORD *data_size)
|
||||
{
|
||||
return resource_get_private_data(&volume->resource, guid, data, data_size);
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_volume_free_private_data(struct wined3d_volume *volume, REFGUID guid)
|
||||
{
|
||||
return resource_free_private_data(&volume->resource, guid);
|
||||
}
|
||||
|
||||
DWORD CDECL wined3d_volume_set_priority(struct wined3d_volume *volume, DWORD priority)
|
||||
{
|
||||
return resource_set_priority(&volume->resource, priority);
|
||||
@@ -216,44 +185,44 @@ struct wined3d_resource * CDECL wined3d_volume_get_resource(struct wined3d_volum
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume,
|
||||
WINED3DLOCKED_BOX *locked_box, const WINED3DBOX *box, DWORD flags)
|
||||
struct wined3d_mapped_box *mapped_box, const struct wined3d_box *box, DWORD flags)
|
||||
{
|
||||
TRACE("volume %p, locked_box %p, box %p, flags %#x.\n",
|
||||
volume, locked_box, box, flags);
|
||||
TRACE("volume %p, mapped_box %p, box %p, flags %#x.\n",
|
||||
volume, mapped_box, box, flags);
|
||||
|
||||
if (!volume->resource.allocatedMemory)
|
||||
volume->resource.allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, volume->resource.size);
|
||||
|
||||
TRACE("allocatedMemory %p.\n", volume->resource.allocatedMemory);
|
||||
|
||||
locked_box->RowPitch = volume->resource.format->byte_count * volume->resource.width; /* Bytes / row */
|
||||
locked_box->SlicePitch = volume->resource.format->byte_count
|
||||
mapped_box->row_pitch = volume->resource.format->byte_count * volume->resource.width; /* Bytes / row */
|
||||
mapped_box->slice_pitch = volume->resource.format->byte_count
|
||||
* volume->resource.width * volume->resource.height; /* Bytes / slice */
|
||||
if (!box)
|
||||
{
|
||||
TRACE("No box supplied - all is ok\n");
|
||||
locked_box->pBits = volume->resource.allocatedMemory;
|
||||
volume->lockedBox.Left = 0;
|
||||
volume->lockedBox.Top = 0;
|
||||
volume->lockedBox.Front = 0;
|
||||
volume->lockedBox.Right = volume->resource.width;
|
||||
volume->lockedBox.Bottom = volume->resource.height;
|
||||
volume->lockedBox.Back = volume->resource.depth;
|
||||
mapped_box->data = volume->resource.allocatedMemory;
|
||||
volume->lockedBox.left = 0;
|
||||
volume->lockedBox.top = 0;
|
||||
volume->lockedBox.front = 0;
|
||||
volume->lockedBox.right = volume->resource.width;
|
||||
volume->lockedBox.bottom = volume->resource.height;
|
||||
volume->lockedBox.back = volume->resource.depth;
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n",
|
||||
box, box->Left, box->Top, box->Right, box->Bottom, box->Front, box->Back);
|
||||
locked_box->pBits = volume->resource.allocatedMemory
|
||||
+ (locked_box->SlicePitch * box->Front) /* FIXME: is front < back or vica versa? */
|
||||
+ (locked_box->RowPitch * box->Top)
|
||||
+ (box->Left * volume->resource.format->byte_count);
|
||||
volume->lockedBox.Left = box->Left;
|
||||
volume->lockedBox.Top = box->Top;
|
||||
volume->lockedBox.Front = box->Front;
|
||||
volume->lockedBox.Right = box->Right;
|
||||
volume->lockedBox.Bottom = box->Bottom;
|
||||
volume->lockedBox.Back = box->Back;
|
||||
TRACE("Lock Box (%p) = l %u, t %u, r %u, b %u, fr %u, ba %u\n",
|
||||
box, box->left, box->top, box->right, box->bottom, box->front, box->back);
|
||||
mapped_box->data = volume->resource.allocatedMemory
|
||||
+ (mapped_box->slice_pitch * box->front) /* FIXME: is front < back or vica versa? */
|
||||
+ (mapped_box->row_pitch * box->top)
|
||||
+ (box->left * volume->resource.format->byte_count);
|
||||
volume->lockedBox.left = box->left;
|
||||
volume->lockedBox.top = box->top;
|
||||
volume->lockedBox.front = box->front;
|
||||
volume->lockedBox.right = box->right;
|
||||
volume->lockedBox.bottom = box->bottom;
|
||||
volume->lockedBox.back = box->back;
|
||||
}
|
||||
|
||||
if (!(flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)))
|
||||
@@ -265,7 +234,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume,
|
||||
volume->locked = TRUE;
|
||||
|
||||
TRACE("Returning memory %p, row pitch %d, slice pitch %d.\n",
|
||||
locked_box->pBits, locked_box->RowPitch, locked_box->SlicePitch);
|
||||
mapped_box->data, mapped_box->row_pitch, mapped_box->slice_pitch);
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
@@ -297,7 +266,7 @@ static const struct wined3d_resource_ops volume_resource_ops =
|
||||
};
|
||||
|
||||
static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_device *device, UINT width,
|
||||
UINT height, UINT depth, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool,
|
||||
UINT height, UINT depth, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool,
|
||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
@@ -310,8 +279,8 @@ static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_device
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
hr = resource_init(&volume->resource, device, WINED3DRTYPE_VOLUME, format,
|
||||
WINED3DMULTISAMPLE_NONE, 0, usage, pool, width, height, depth,
|
||||
hr = resource_init(&volume->resource, device, WINED3D_RTYPE_VOLUME, format,
|
||||
WINED3D_MULTISAMPLE_NONE, 0, usage, pool, width, height, depth,
|
||||
width * height * depth * format->byte_count, parent, parent_ops,
|
||||
&volume_resource_ops);
|
||||
if (FAILED(hr))
|
||||
@@ -331,7 +300,7 @@ static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_device
|
||||
}
|
||||
|
||||
HRESULT CDECL wined3d_volume_create(struct wined3d_device *device, UINT width, UINT height,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, void *parent,
|
||||
UINT depth, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, void *parent,
|
||||
const struct wined3d_parent_ops *parent_ops, struct wined3d_volume **volume)
|
||||
{
|
||||
struct wined3d_volume *object;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
@ cdecl wined3d_check_device_format_conversion(ptr long long long long)
|
||||
@ cdecl wined3d_check_device_multisample_type(ptr long long long long long ptr)
|
||||
@ cdecl wined3d_check_device_type(ptr long long long long long)
|
||||
@ cdecl wined3d_create(long ptr)
|
||||
@ cdecl wined3d_create(long long ptr)
|
||||
@ cdecl wined3d_decref(ptr)
|
||||
@ cdecl wined3d_enum_adapter_modes(ptr long long long ptr)
|
||||
@ cdecl wined3d_get_adapter_count(ptr)
|
||||
@@ -23,34 +23,22 @@
|
||||
@ cdecl wined3d_buffer_create_ib(ptr long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_buffer_create_vb(ptr long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_buffer_decref(ptr)
|
||||
@ cdecl wined3d_buffer_free_private_data(ptr ptr)
|
||||
@ cdecl wined3d_buffer_get_parent(ptr)
|
||||
@ cdecl wined3d_buffer_get_priority(ptr)
|
||||
@ cdecl wined3d_buffer_get_private_data(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_buffer_get_resource(ptr)
|
||||
@ cdecl wined3d_buffer_incref(ptr)
|
||||
@ cdecl wined3d_buffer_map(ptr long long ptr long)
|
||||
@ cdecl wined3d_buffer_preload(ptr)
|
||||
@ cdecl wined3d_buffer_set_priority(ptr long)
|
||||
@ cdecl wined3d_buffer_set_private_data(ptr ptr ptr long long)
|
||||
@ cdecl wined3d_buffer_unmap(ptr)
|
||||
|
||||
@ cdecl wined3d_clipper_create()
|
||||
@ cdecl wined3d_clipper_decref(ptr)
|
||||
@ cdecl wined3d_clipper_get_clip_list(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_clipper_get_window(ptr ptr)
|
||||
@ cdecl wined3d_clipper_incref(ptr)
|
||||
@ cdecl wined3d_clipper_is_clip_list_changed(ptr ptr)
|
||||
@ cdecl wined3d_clipper_set_clip_list(ptr ptr long)
|
||||
@ cdecl wined3d_clipper_set_window(ptr long ptr)
|
||||
|
||||
@ cdecl wined3d_device_acquire_focus_window(ptr ptr)
|
||||
@ cdecl wined3d_device_begin_scene(ptr)
|
||||
@ cdecl wined3d_device_begin_stateblock(ptr)
|
||||
@ cdecl wined3d_device_clear(ptr long ptr long long long long)
|
||||
@ cdecl wined3d_device_clear(ptr long ptr long long float long)
|
||||
@ cdecl wined3d_device_clear_rendertarget_view(ptr ptr ptr)
|
||||
@ cdecl wined3d_device_color_fill(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_device_create(ptr long long ptr long ptr ptr)
|
||||
@ cdecl wined3d_device_create(ptr long long ptr long long ptr ptr)
|
||||
@ cdecl wined3d_device_decref(ptr)
|
||||
@ cdecl wined3d_device_delete_patch(ptr long)
|
||||
@ cdecl wined3d_device_draw_indexed_primitive(ptr long long)
|
||||
@@ -63,7 +51,6 @@
|
||||
@ cdecl wined3d_device_draw_tri_patch(ptr long ptr ptr)
|
||||
@ cdecl wined3d_device_end_scene(ptr)
|
||||
@ cdecl wined3d_device_end_stateblock(ptr ptr)
|
||||
@ cdecl wined3d_device_enum_resources(ptr ptr ptr)
|
||||
@ cdecl wined3d_device_evict_managed_resources(ptr)
|
||||
@ cdecl wined3d_device_get_available_texture_mem(ptr)
|
||||
@ cdecl wined3d_device_get_back_buffer(ptr long long long ptr)
|
||||
@@ -71,7 +58,6 @@
|
||||
@ cdecl wined3d_device_get_clip_plane(ptr long ptr)
|
||||
@ cdecl wined3d_device_get_clip_status(ptr ptr)
|
||||
@ cdecl wined3d_device_get_creation_parameters(ptr ptr)
|
||||
@ cdecl wined3d_device_get_current_texture_palette(ptr ptr)
|
||||
@ cdecl wined3d_device_get_depth_stencil(ptr ptr)
|
||||
@ cdecl wined3d_device_get_device_caps(ptr ptr)
|
||||
@ cdecl wined3d_device_get_display_mode(ptr long ptr)
|
||||
@@ -82,7 +68,6 @@
|
||||
@ cdecl wined3d_device_get_light_enable(ptr long ptr)
|
||||
@ cdecl wined3d_device_get_material(ptr ptr)
|
||||
@ cdecl wined3d_device_get_npatch_mode(ptr)
|
||||
@ cdecl wined3d_device_get_palette_entries(ptr long ptr)
|
||||
@ cdecl wined3d_device_get_pixel_shader(ptr)
|
||||
@ cdecl wined3d_device_get_primitive_type(ptr ptr)
|
||||
@ cdecl wined3d_device_get_ps_consts_b(ptr long ptr long)
|
||||
@@ -116,12 +101,11 @@
|
||||
@ cdecl wined3d_device_present(ptr ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long)
|
||||
@ cdecl wined3d_device_release_focus_window(ptr)
|
||||
@ cdecl wined3d_device_reset(ptr ptr)
|
||||
@ cdecl wined3d_device_reset(ptr ptr ptr)
|
||||
@ cdecl wined3d_device_restore_fullscreen_window(ptr ptr)
|
||||
@ cdecl wined3d_device_set_base_vertex_index(ptr long)
|
||||
@ cdecl wined3d_device_set_clip_plane(ptr long ptr)
|
||||
@ cdecl wined3d_device_set_clip_status(ptr ptr)
|
||||
@ cdecl wined3d_device_set_current_texture_palette(ptr long)
|
||||
@ cdecl wined3d_device_set_cursor_position(ptr long long long)
|
||||
@ cdecl wined3d_device_set_cursor_properties(ptr long long ptr)
|
||||
@ cdecl wined3d_device_set_depth_stencil(ptr ptr)
|
||||
@@ -133,8 +117,7 @@
|
||||
@ cdecl wined3d_device_set_light_enable(ptr long long)
|
||||
@ cdecl wined3d_device_set_material(ptr ptr)
|
||||
@ cdecl wined3d_device_set_multithreaded(ptr)
|
||||
@ cdecl wined3d_device_set_npatch_mode(ptr long)
|
||||
@ cdecl wined3d_device_set_palette_entries(ptr long ptr)
|
||||
@ cdecl wined3d_device_set_npatch_mode(ptr float)
|
||||
@ cdecl wined3d_device_set_pixel_shader(ptr ptr)
|
||||
@ cdecl wined3d_device_set_primitive_type(ptr long)
|
||||
@ cdecl wined3d_device_set_ps_consts_b(ptr long ptr long)
|
||||
@@ -180,8 +163,11 @@
|
||||
@ cdecl wined3d_query_incref(ptr)
|
||||
@ cdecl wined3d_query_issue(ptr long)
|
||||
|
||||
@ cdecl wined3d_resource_free_private_data(ptr ptr)
|
||||
@ cdecl wined3d_resource_get_desc(ptr ptr)
|
||||
@ cdecl wined3d_resource_get_parent(ptr)
|
||||
@ cdecl wined3d_resource_get_private_data(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_resource_set_private_data(ptr ptr ptr long long)
|
||||
|
||||
@ cdecl wined3d_rendertarget_view_create(ptr ptr ptr)
|
||||
@ cdecl wined3d_rendertarget_view_decref(ptr)
|
||||
@@ -205,20 +191,17 @@
|
||||
@ cdecl wined3d_stateblock_incref(ptr)
|
||||
|
||||
@ cdecl wined3d_surface_blt(ptr ptr ptr ptr long ptr long)
|
||||
@ cdecl wined3d_surface_bltfast(ptr long long ptr ptr long)
|
||||
@ cdecl wined3d_surface_create(ptr long long long long long long long long long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_surface_decref(ptr)
|
||||
@ cdecl wined3d_surface_flip(ptr ptr long)
|
||||
@ cdecl wined3d_surface_free_private_data(ptr ptr)
|
||||
@ cdecl wined3d_surface_get_blt_status(ptr long)
|
||||
@ cdecl wined3d_surface_get_clipper(ptr)
|
||||
@ cdecl wined3d_surface_get_flip_status(ptr long)
|
||||
@ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr)
|
||||
@ cdecl wined3d_surface_get_palette(ptr)
|
||||
@ cdecl wined3d_surface_get_parent(ptr)
|
||||
@ cdecl wined3d_surface_get_pitch(ptr)
|
||||
@ cdecl wined3d_surface_get_priority(ptr)
|
||||
@ cdecl wined3d_surface_get_private_data(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_surface_get_render_target_data(ptr ptr)
|
||||
@ cdecl wined3d_surface_get_resource(ptr)
|
||||
@ cdecl wined3d_surface_getdc(ptr ptr)
|
||||
@ cdecl wined3d_surface_incref(ptr)
|
||||
@@ -227,15 +210,13 @@
|
||||
@ cdecl wined3d_surface_preload(ptr)
|
||||
@ cdecl wined3d_surface_releasedc(ptr ptr)
|
||||
@ cdecl wined3d_surface_restore(ptr)
|
||||
@ cdecl wined3d_surface_set_clipper(ptr ptr)
|
||||
@ cdecl wined3d_surface_set_color_key(ptr long ptr)
|
||||
@ cdecl wined3d_surface_set_format(ptr long)
|
||||
@ cdecl wined3d_surface_set_mem(ptr ptr)
|
||||
@ cdecl wined3d_surface_set_overlay_position(ptr long long)
|
||||
@ cdecl wined3d_surface_set_palette(ptr ptr)
|
||||
@ cdecl wined3d_surface_set_priority(ptr long)
|
||||
@ cdecl wined3d_surface_set_private_data(ptr ptr ptr long long)
|
||||
@ cdecl wined3d_surface_unmap(ptr)
|
||||
@ cdecl wined3d_surface_update_desc(ptr long long long long long)
|
||||
@ cdecl wined3d_surface_update_overlay(ptr ptr ptr ptr long ptr)
|
||||
@ cdecl wined3d_surface_update_overlay_z_order(ptr long ptr)
|
||||
|
||||
@@ -247,7 +228,7 @@
|
||||
@ cdecl wined3d_swapchain_get_front_buffer_data(ptr ptr)
|
||||
@ cdecl wined3d_swapchain_get_gamma_ramp(ptr ptr)
|
||||
@ cdecl wined3d_swapchain_get_parent(ptr)
|
||||
@ cdecl wined3d_swapchain_get_present_parameters(ptr ptr)
|
||||
@ cdecl wined3d_swapchain_get_desc(ptr ptr)
|
||||
@ cdecl wined3d_swapchain_get_raster_status(ptr ptr)
|
||||
@ cdecl wined3d_swapchain_incref(ptr)
|
||||
@ cdecl wined3d_swapchain_present(ptr ptr ptr ptr ptr long)
|
||||
@@ -259,22 +240,19 @@
|
||||
@ cdecl wined3d_texture_create_3d(ptr long long long long long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_texture_create_cube(ptr long long long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_texture_decref(ptr)
|
||||
@ cdecl wined3d_texture_free_private_data(ptr ptr)
|
||||
@ cdecl wined3d_texture_generate_mipmaps(ptr)
|
||||
@ cdecl wined3d_texture_get_autogen_filter_type(ptr)
|
||||
@ cdecl wined3d_texture_get_level_count(ptr)
|
||||
@ cdecl wined3d_texture_get_lod(ptr)
|
||||
@ cdecl wined3d_texture_get_parent(ptr)
|
||||
@ cdecl wined3d_texture_get_priority(ptr)
|
||||
@ cdecl wined3d_texture_get_private_data(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_texture_get_resource(ptr)
|
||||
@ cdecl wined3d_texture_get_sub_resource(ptr long)
|
||||
@ cdecl wined3d_texture_get_type(ptr)
|
||||
@ cdecl wined3d_texture_incref(ptr)
|
||||
@ cdecl wined3d_texture_preload(ptr)
|
||||
@ cdecl wined3d_texture_set_autogen_filter_type(ptr long)
|
||||
@ cdecl wined3d_texture_set_lod(ptr long)
|
||||
@ cdecl wined3d_texture_set_priority(ptr long)
|
||||
@ cdecl wined3d_texture_set_private_data(ptr ptr ptr long long)
|
||||
|
||||
@ cdecl wined3d_vertex_declaration_create(ptr ptr long ptr ptr ptr)
|
||||
@ cdecl wined3d_vertex_declaration_create_from_fvf(ptr long ptr ptr ptr)
|
||||
@@ -284,15 +262,12 @@
|
||||
|
||||
@ cdecl wined3d_volume_create(ptr long long long long long long ptr ptr ptr)
|
||||
@ cdecl wined3d_volume_decref(ptr)
|
||||
@ cdecl wined3d_volume_free_private_data(ptr ptr)
|
||||
@ cdecl wined3d_volume_from_resource(ptr)
|
||||
@ cdecl wined3d_volume_get_parent(ptr)
|
||||
@ cdecl wined3d_volume_get_priority(ptr)
|
||||
@ cdecl wined3d_volume_get_private_data(ptr ptr ptr ptr)
|
||||
@ cdecl wined3d_volume_get_resource(ptr)
|
||||
@ cdecl wined3d_volume_incref(ptr)
|
||||
@ cdecl wined3d_volume_map(ptr ptr ptr long)
|
||||
@ cdecl wined3d_volume_preload(ptr)
|
||||
@ cdecl wined3d_volume_set_priority(ptr long)
|
||||
@ cdecl wined3d_volume_set_private_data(ptr ptr ptr long long)
|
||||
@ cdecl wined3d_volume_unmap(ptr)
|
||||
|
||||
@@ -1721,7 +1721,7 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN;
|
||||
USE_WGL_FUNC(wglShareLists)
|
||||
|
||||
/* OpenGL extensions. */
|
||||
typedef enum wined3d_gl_extension
|
||||
enum wined3d_gl_extension
|
||||
{
|
||||
WINED3D_GL_EXT_NONE,
|
||||
|
||||
@@ -1738,12 +1738,14 @@ typedef enum wined3d_gl_extension
|
||||
ARB_DEPTH_CLAMP,
|
||||
ARB_DEPTH_TEXTURE,
|
||||
ARB_DRAW_BUFFERS,
|
||||
ARB_DRAW_ELEMENTS_BASE_VERTEX,
|
||||
ARB_FRAGMENT_PROGRAM,
|
||||
ARB_FRAGMENT_SHADER,
|
||||
ARB_FRAMEBUFFER_OBJECT,
|
||||
ARB_GEOMETRY_SHADER4,
|
||||
ARB_HALF_FLOAT_PIXEL,
|
||||
ARB_HALF_FLOAT_VERTEX,
|
||||
ARB_MAP_BUFFER_ALIGNMENT,
|
||||
ARB_MAP_BUFFER_RANGE,
|
||||
ARB_MULTISAMPLE,
|
||||
ARB_MULTITEXTURE,
|
||||
@@ -1844,7 +1846,7 @@ typedef enum wined3d_gl_extension
|
||||
WINED3D_GL_VERSION_2_0,
|
||||
|
||||
WINED3D_GL_EXT_COUNT,
|
||||
} GL_SupportedExt;
|
||||
};
|
||||
|
||||
/* GL_APPLE_client_storage */
|
||||
#ifndef GL_APPLE_client_storage
|
||||
@@ -1891,9 +1893,9 @@ typedef void (WINE_GLAPI *PGLFNFINISHOBJECTAPPLEPROC)(GLenum, GLuint);
|
||||
#define GL_APPLE_flush_buffer_range 1
|
||||
#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8a12
|
||||
#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8a13
|
||||
#endif
|
||||
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);
|
||||
@@ -1965,6 +1967,19 @@ typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC)(GLenum target, GLenum clamp);
|
||||
#endif
|
||||
typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC)(GLsizei n, const GLenum *bufs);
|
||||
|
||||
/* GL_ARB_draw_elements_base_vertex */
|
||||
#ifndef GL_ARB_draw_elements_base_vertex
|
||||
#define GL_ARB_draw_elements_base_vertex 1
|
||||
#endif
|
||||
typedef void (WINE_GLAPI *PGLFNDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type,
|
||||
const GLvoid *indices, GLint basevertex);
|
||||
typedef void (WINE_GLAPI *PGLFNDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end,
|
||||
GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
|
||||
typedef void (WINE_GLAPI *PGLFNDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count,
|
||||
GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex);
|
||||
typedef void (WINE_GLAPI *PGLFNMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei *count, GLenum type,
|
||||
const GLvoid **indices, GLsizei primcount, GLint *basevertex);
|
||||
|
||||
/* GL_ARB_fragment_program */
|
||||
#ifndef GL_ARB_fragment_program
|
||||
#define GL_ARB_fragment_program 1
|
||||
@@ -2147,6 +2162,12 @@ typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLe
|
||||
#define GL_HALF_FLOAT 0x140b
|
||||
#endif
|
||||
|
||||
/* GL_ARB_map_buffer_alignment */
|
||||
#ifndef GL_ARB_map_buffer_alignment
|
||||
#define GL_ARB_map_buffer_alignment 1
|
||||
#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90bc
|
||||
#endif
|
||||
|
||||
/* GL_ARB_map_buffer_range */
|
||||
#ifndef GL_ARB_map_buffer_range
|
||||
#define GL_ARB_map_buffer_range 1
|
||||
@@ -3069,11 +3090,11 @@ 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
|
||||
#endif
|
||||
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
|
||||
@@ -3789,6 +3810,15 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSWAPINTERVALEXTPROC)(int interval);
|
||||
/* GL_ARB_draw_buffers */ \
|
||||
USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, \
|
||||
glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL) \
|
||||
/* GL_ARB_draw_elements_base_vertex */ \
|
||||
USE_GL_FUNC(PGLFNDRAWELEMENTSBASEVERTEXPROC, \
|
||||
glDrawElementsBaseVertex, ARB_DRAW_ELEMENTS_BASE_VERTEX, NULL) \
|
||||
USE_GL_FUNC(PGLFNDRAWRANGEELEMENTSBASEVERTEXPROC, \
|
||||
glDrawRangeElementsBaseVertex, ARB_DRAW_ELEMENTS_BASE_VERTEX, NULL) \
|
||||
USE_GL_FUNC(PGLFNDRAWELEMENTSINSTANCEDBASEVERTEXPROC, \
|
||||
glDrawElementsInstancedBaseVertex, ARB_DRAW_ELEMENTS_BASE_VERTEX, NULL) \
|
||||
USE_GL_FUNC(PGLFNMULTIDRAWELEMENTSBASEVERTEXPROC, \
|
||||
glMultiDrawElementsBaseVertex, ARB_DRAW_ELEMENTS_BASE_VERTEX, NULL) \
|
||||
/* GL_ARB_framebuffer_object */ \
|
||||
USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, \
|
||||
glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "wined3d_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
|
||||
WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
|
||||
struct wined3d_wndproc
|
||||
{
|
||||
@@ -60,6 +61,16 @@ static CRITICAL_SECTION_DEBUG wined3d_cs_debug =
|
||||
};
|
||||
static CRITICAL_SECTION wined3d_cs = {&wined3d_cs_debug, -1, 0, 0, 0, 0};
|
||||
|
||||
static CRITICAL_SECTION wined3d_wndproc_cs;
|
||||
static CRITICAL_SECTION_DEBUG wined3d_wndproc_cs_debug =
|
||||
{
|
||||
0, 0, &wined3d_wndproc_cs,
|
||||
{&wined3d_wndproc_cs_debug.ProcessLocksList,
|
||||
&wined3d_wndproc_cs_debug.ProcessLocksList},
|
||||
0, 0, {(DWORD_PTR)(__FILE__ ": wined3d_wndproc_cs")}
|
||||
};
|
||||
static CRITICAL_SECTION wined3d_wndproc_cs = {&wined3d_wndproc_cs_debug, -1, 0, 0, 0, 0};
|
||||
|
||||
/* When updating default value here, make sure to update winecfg as well,
|
||||
* where appropriate. */
|
||||
struct wined3d_settings wined3d_settings =
|
||||
@@ -73,12 +84,13 @@ struct wined3d_settings wined3d_settings =
|
||||
PCI_DEVICE_NONE,/* PCI Device ID */
|
||||
0, /* The default of memory is set in init_driver_info */
|
||||
NULL, /* No wine logo by default */
|
||||
FALSE, /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
|
||||
TRUE, /* Multisampling enabled by default. */
|
||||
FALSE, /* No strict draw ordering. */
|
||||
FALSE, /* Try to render onscreen by default. */
|
||||
};
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
struct wined3d * CDECL wined3d_create(UINT version, void *parent)
|
||||
struct wined3d * CDECL wined3d_create(UINT version, DWORD flags, void *parent)
|
||||
{
|
||||
struct wined3d *object;
|
||||
HRESULT hr;
|
||||
@@ -90,7 +102,7 @@ struct wined3d * CDECL wined3d_create(UINT version, void *parent)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hr = wined3d_init(object, version, parent);
|
||||
hr = wined3d_init(object, version, flags, parent);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to initialize wined3d object, hr %#x.\n", hr);
|
||||
@@ -228,6 +240,7 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
|
||||
{
|
||||
if (!strcmp(buffer,"disabled"))
|
||||
{
|
||||
ERR_(winediag)("The GLSL shader backend has been disabled. You get to keep all the pieces if it breaks.\n");
|
||||
TRACE("Use of GL Shading Language disabled\n");
|
||||
wined3d_settings.glslRequested = FALSE;
|
||||
}
|
||||
@@ -247,12 +260,7 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
|
||||
}
|
||||
if ( !get_config_key( hkey, appkey, "RenderTargetLockMode", buffer, size) )
|
||||
{
|
||||
if (!strcmp(buffer,"disabled"))
|
||||
{
|
||||
TRACE("Disabling render target locking\n");
|
||||
wined3d_settings.rendertargetlock_mode = RTL_DISABLE;
|
||||
}
|
||||
else if (!strcmp(buffer,"readdraw"))
|
||||
if (!strcmp(buffer,"readdraw"))
|
||||
{
|
||||
TRACE("Using glReadPixels for render target reading and glDrawPixels for writing\n");
|
||||
wined3d_settings.rendertargetlock_mode = RTL_READDRAW;
|
||||
@@ -316,10 +324,10 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
|
||||
}
|
||||
if ( !get_config_key( hkey, appkey, "Multisampling", buffer, size) )
|
||||
{
|
||||
if (!strcmp(buffer,"enabled"))
|
||||
if (!strcmp(buffer, "disabled"))
|
||||
{
|
||||
TRACE("Allow multisampling\n");
|
||||
wined3d_settings.allow_multisampling = TRUE;
|
||||
TRACE("Multisampling disabled.\n");
|
||||
wined3d_settings.allow_multisampling = FALSE;
|
||||
}
|
||||
}
|
||||
if (!get_config_key(hkey, appkey, "StrictDrawOrdering", buffer, size)
|
||||
@@ -328,6 +336,12 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
|
||||
TRACE("Enforcing strict draw ordering.\n");
|
||||
wined3d_settings.strict_draw_ordering = TRUE;
|
||||
}
|
||||
if (!get_config_key(hkey, appkey, "AlwaysOffscreen", buffer, size)
|
||||
&& !strcmp(buffer,"enabled"))
|
||||
{
|
||||
TRACE("Always rendering backbuffers offscreen.\n");
|
||||
wined3d_settings.always_offscreen = TRUE;
|
||||
}
|
||||
}
|
||||
if (wined3d_settings.vs_mode == VS_HW)
|
||||
TRACE("Allow HW vertex shaders\n");
|
||||
@@ -368,6 +382,8 @@ static BOOL wined3d_dll_destroy(HINSTANCE hInstDLL)
|
||||
HeapFree(GetProcessHeap(), 0, wined3d_settings.logo);
|
||||
UnregisterClassA(WINED3D_OPENGL_WINDOW_CLASS_NAME, hInstDLL);
|
||||
|
||||
DeleteCriticalSection(&wined3d_wndproc_cs);
|
||||
DeleteCriticalSection(&wined3d_cs);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -381,6 +397,16 @@ void WINAPI wined3d_mutex_unlock(void)
|
||||
LeaveCriticalSection(&wined3d_cs);
|
||||
}
|
||||
|
||||
static void wined3d_wndproc_mutex_lock(void)
|
||||
{
|
||||
EnterCriticalSection(&wined3d_wndproc_cs);
|
||||
}
|
||||
|
||||
static void wined3d_wndproc_mutex_unlock(void)
|
||||
{
|
||||
LeaveCriticalSection(&wined3d_wndproc_cs);
|
||||
}
|
||||
|
||||
static struct wined3d_wndproc *wined3d_find_wndproc(HWND window)
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -403,12 +429,12 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
|
||||
BOOL unicode;
|
||||
WNDPROC proc;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_wndproc_mutex_lock();
|
||||
entry = wined3d_find_wndproc(window);
|
||||
|
||||
if (!entry)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
ERR("Window %p is not registered with wined3d.\n", window);
|
||||
return DefWindowProcW(window, message, wparam, lparam);
|
||||
}
|
||||
@@ -416,7 +442,7 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
|
||||
device = entry->device;
|
||||
unicode = entry->unicode;
|
||||
proc = entry->proc;
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
|
||||
return device_process_message(device, window, unicode, message, wparam, lparam, proc);
|
||||
}
|
||||
@@ -425,11 +451,11 @@ BOOL wined3d_register_window(HWND window, struct wined3d_device *device)
|
||||
{
|
||||
struct wined3d_wndproc *entry;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_wndproc_mutex_lock();
|
||||
|
||||
if (wined3d_find_wndproc(window))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
WARN("Window %p is already registered with wined3d.\n", window);
|
||||
return TRUE;
|
||||
}
|
||||
@@ -444,7 +470,7 @@ BOOL wined3d_register_window(HWND window, struct wined3d_device *device)
|
||||
|
||||
if (!new_entries)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
ERR("Failed to grow table.\n");
|
||||
return FALSE;
|
||||
}
|
||||
@@ -465,7 +491,7 @@ BOOL wined3d_register_window(HWND window, struct wined3d_device *device)
|
||||
entry->proc = (WNDPROC)SetWindowLongPtrA(window, GWLP_WNDPROC, (LONG_PTR)wined3d_wndproc);
|
||||
entry->device = device;
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -475,11 +501,11 @@ void wined3d_unregister_window(HWND window)
|
||||
struct wined3d_wndproc *entry, *last;
|
||||
LONG_PTR proc;
|
||||
|
||||
wined3d_mutex_lock();
|
||||
wined3d_wndproc_mutex_lock();
|
||||
|
||||
if (!(entry = wined3d_find_wndproc(window)))
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
ERR("Window %p is not registered with wined3d.\n", window);
|
||||
return;
|
||||
}
|
||||
@@ -489,7 +515,7 @@ void wined3d_unregister_window(HWND window)
|
||||
proc = GetWindowLongPtrW(window, GWLP_WNDPROC);
|
||||
if (proc != (LONG_PTR)wined3d_wndproc)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
WARN("Not unregistering window %p, window proc %#lx doesn't match wined3d window proc %p.\n",
|
||||
window, proc, wined3d_wndproc);
|
||||
return;
|
||||
@@ -502,7 +528,7 @@ void wined3d_unregister_window(HWND window)
|
||||
proc = GetWindowLongPtrA(window, GWLP_WNDPROC);
|
||||
if (proc != (LONG_PTR)wined3d_wndproc)
|
||||
{
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
WARN("Not unregistering window %p, window proc %#lx doesn't match wined3d window proc %p.\n",
|
||||
window, proc, wined3d_wndproc);
|
||||
return;
|
||||
@@ -514,7 +540,7 @@ void wined3d_unregister_window(HWND window)
|
||||
last = &wndproc_table.entries[--wndproc_table.count];
|
||||
if (entry != last) *entry = *last;
|
||||
|
||||
wined3d_mutex_unlock();
|
||||
wined3d_wndproc_mutex_unlock();
|
||||
}
|
||||
|
||||
/* At process attach */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user