af062818b47340eef15700d2f0211576ba3506eevboxsync/*
af062818b47340eef15700d2f0211576ba3506eevboxsync * IDirect3DTexture9 implementation
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright 2002-2005 Jason Edmeades
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright 2002-2005 Raphael Junqueira
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright 2005 Oliver Stieber
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * This library is free software; you can redistribute it and/or
af062818b47340eef15700d2f0211576ba3506eevboxsync * modify it under the terms of the GNU Lesser General Public
af062818b47340eef15700d2f0211576ba3506eevboxsync * License as published by the Free Software Foundation; either
af062818b47340eef15700d2f0211576ba3506eevboxsync * version 2.1 of the License, or (at your option) any later version.
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * This library is distributed in the hope that it will be useful,
af062818b47340eef15700d2f0211576ba3506eevboxsync * but WITHOUT ANY WARRANTY; without even the implied warranty of
af062818b47340eef15700d2f0211576ba3506eevboxsync * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
af062818b47340eef15700d2f0211576ba3506eevboxsync * Lesser General Public License for more details.
af062818b47340eef15700d2f0211576ba3506eevboxsync *
af062818b47340eef15700d2f0211576ba3506eevboxsync * You should have received a copy of the GNU Lesser General Public
af062818b47340eef15700d2f0211576ba3506eevboxsync * License along with this library; if not, write to the Free Software
af062818b47340eef15700d2f0211576ba3506eevboxsync * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
af062818b47340eef15700d2f0211576ba3506eevboxsync */
af062818b47340eef15700d2f0211576ba3506eevboxsync
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync/*
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * a choice of LGPL license versions is made available with the language indicating
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * that LGPLv2 or any later version may be used, or where a choice of which version
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync * of the LGPL is applied is otherwise unspecified.
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync */
b955672b950093ff7416d1269dd4d3b69983bd8fvboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync#include "config.h"
af062818b47340eef15700d2f0211576ba3506eevboxsync#include "d3d9_private.h"
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncWINE_DEFAULT_DEBUG_CHANNEL(d3d9);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3DTexture9 IUnknown parts follow: */
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_QueryInterface(LPDIRECT3DTEXTURE9 iface, REFIID riid, LPVOID* ppobj) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync if (IsEqualGUID(riid, &IID_IUnknown)
af062818b47340eef15700d2f0211576ba3506eevboxsync || IsEqualGUID(riid, &IID_IDirect3DResource9)
af062818b47340eef15700d2f0211576ba3506eevboxsync || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
af062818b47340eef15700d2f0211576ba3506eevboxsync || IsEqualGUID(riid, &IID_IDirect3DTexture9)) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9_AddRef(iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync *ppobj = This;
af062818b47340eef15700d2f0211576ba3506eevboxsync return S_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync WARN("(%p)->(%s,%p) not found\n", This, debugstr_guid(riid), ppobj);
af062818b47340eef15700d2f0211576ba3506eevboxsync *ppobj = NULL;
af062818b47340eef15700d2f0211576ba3506eevboxsync return E_NOINTERFACE;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic ULONG WINAPI IDirect3DTexture9Impl_AddRef(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync ULONG ref = InterlockedIncrement(&This->ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("%p increasing refcount to %u.\n", iface, ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync if (ref == 1)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync {
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync IDirect3DDevice9Ex_AddRef(This->parentDevice);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync IWineD3DTexture_AddRef(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync }
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ref;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic ULONG WINAPI IDirect3DTexture9Impl_Release(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync ULONG ref = InterlockedDecrement(&This->ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("%p decreasing refcount to %u.\n", iface, ref);
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync if (ref == 0) {
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3DDevice9Ex *parentDevice = This->parentDevice;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync IWineD3DTexture_Release(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync /* Release the device last, as it may cause the device to be destroyed. */
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3DDevice9Ex_Release(parentDevice);
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync return ref;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3DTexture9 IDirect3DResource9 Interface follow: */
5112e32d7072e280613921c982a6672f2c859cf3vboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_GetDevice(IDirect3DTexture9 *iface, IDirect3DDevice9 **device)
5112e32d7072e280613921c982a6672f2c859cf3vboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, device %p.\n", iface, device);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync *device = (IDirect3DDevice9 *)This->parentDevice;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync IDirect3DDevice9_AddRef(*device);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("Returning device %p.\n", *device);
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync return D3D_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_SetPrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_SetPrivateData(This->wineD3DTexture, refguid, pData, SizeOfData, Flags);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_GetPrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, guid %s, data %p, data_size %p.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, debugstr_guid(refguid), pData, pSizeOfData);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_GetPrivateData(This->wineD3DTexture, refguid, pData, pSizeOfData);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_FreePrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_FreePrivateData(This->wineD3DTexture, refguid);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic DWORD WINAPI IDirect3DTexture9Impl_SetPriority(LPDIRECT3DTEXTURE9 iface, DWORD PriorityNew) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, priority %u.\n", iface, PriorityNew);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_SetPriority(This->wineD3DTexture, PriorityNew);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic DWORD WINAPI IDirect3DTexture9Impl_GetPriority(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_GetPriority(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic void WINAPI IDirect3DTexture9Impl_PreLoad(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3DTexture_PreLoad(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic D3DRESOURCETYPE WINAPI IDirect3DTexture9Impl_GetType(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_GetType(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3DTexture9 IDirect3DBaseTexture9 Interface follow: */
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic DWORD WINAPI IDirect3DTexture9Impl_SetLOD(LPDIRECT3DTEXTURE9 iface, DWORD LODNew) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, lod %u.\n", iface, LODNew);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_SetLOD(This->wineD3DTexture, LODNew);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic DWORD WINAPI IDirect3DTexture9Impl_GetLOD(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_GetLOD(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic DWORD WINAPI IDirect3DTexture9Impl_GetLevelCount(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync DWORD ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = IWineD3DTexture_GetLevelCount(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_SetAutoGenFilterType(LPDIRECT3DTEXTURE9 iface, D3DTEXTUREFILTERTYPE FilterType) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_SetAutoGenFilterType(This->wineD3DTexture, (WINED3DTEXTUREFILTERTYPE) FilterType);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic D3DTEXTUREFILTERTYPE WINAPI IDirect3DTexture9Impl_GetAutoGenFilterType(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync D3DTEXTUREFILTERTYPE ret;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync ret = (D3DTEXTUREFILTERTYPE) IWineD3DTexture_GetAutoGenFilterType(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return ret;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic void WINAPI IDirect3DTexture9Impl_GenerateMipSubLevels(LPDIRECT3DTEXTURE9 iface) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p.\n", iface);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3DTexture_GenerateMipSubLevels(This->wineD3DTexture);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync/* IDirect3DTexture9 Interface follow: */
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DSURFACE_DESC* pDesc) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
040b4a09341f574825386333398110f4db3e1e51vboxsync WINED3DSURFACE_DESC wined3ddesc;
040b4a09341f574825386333398110f4db3e1e51vboxsync HRESULT hr;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, level %u, desc %p.\n", iface, Level, pDesc);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_GetLevelDesc(This->wineD3DTexture, Level, &wined3ddesc);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
040b4a09341f574825386333398110f4db3e1e51vboxsync if (SUCCEEDED(hr))
040b4a09341f574825386333398110f4db3e1e51vboxsync {
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Type = wined3ddesc.resource_type;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Usage = wined3ddesc.usage;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Pool = wined3ddesc.pool;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->MultiSampleType = wined3ddesc.multisample_type;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->MultiSampleQuality = wined3ddesc.multisample_quality;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Width = wined3ddesc.width;
040b4a09341f574825386333398110f4db3e1e51vboxsync pDesc->Height = wined3ddesc.height;
040b4a09341f574825386333398110f4db3e1e51vboxsync }
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE9 iface, UINT Level, IDirect3DSurface9** ppSurfaceLevel) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hrc = D3D_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3DSurface *mySurface = NULL;
af062818b47340eef15700d2f0211576ba3506eevboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, level %u, surface %p.\n", iface, Level, ppSurfaceLevel);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hrc = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface);
af062818b47340eef15700d2f0211576ba3506eevboxsync if (hrc == D3D_OK && NULL != ppSurfaceLevel) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppSurfaceLevel);
af062818b47340eef15700d2f0211576ba3506eevboxsync IWineD3DSurface_Release(mySurface);
af062818b47340eef15700d2f0211576ba3506eevboxsync }
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hrc;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_LockRect(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
5112e32d7072e280613921c982a6672f2c859cf3vboxsync iface, Level, pLockedRect, pRect, Flags);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_LockRect(This->wineD3DTexture, Level, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_UnlockRect(LPDIRECT3DTEXTURE9 iface, UINT Level) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, level %u.\n", iface, Level);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_UnlockRect(This->wineD3DTexture, Level);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic HRESULT WINAPI IDirect3DTexture9Impl_AddDirtyRect(LPDIRECT3DTEXTURE9 iface, CONST RECT* pDirtyRect) {
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
af062818b47340eef15700d2f0211576ba3506eevboxsync HRESULT hr;
5112e32d7072e280613921c982a6672f2c859cf3vboxsync
5112e32d7072e280613921c982a6672f2c859cf3vboxsync TRACE("iface %p, dirty_rect %p.\n", iface, pDirtyRect);
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
af062818b47340eef15700d2f0211576ba3506eevboxsync hr = IWineD3DTexture_AddDirtyRect(This->wineD3DTexture, pDirtyRect);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
af062818b47340eef15700d2f0211576ba3506eevboxsyncstatic const IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl =
af062818b47340eef15700d2f0211576ba3506eevboxsync{
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IUnknown */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_QueryInterface,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_AddRef,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_Release,
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IDirect3DResource9 */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetDevice,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_SetPrivateData,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetPrivateData,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_FreePrivateData,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_SetPriority,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetPriority,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_PreLoad,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetType,
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IDirect3dBaseTexture9 */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_SetLOD,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetLOD,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetLevelCount,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_SetAutoGenFilterType,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetAutoGenFilterType,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GenerateMipSubLevels,
af062818b47340eef15700d2f0211576ba3506eevboxsync /* IDirect3DTexture9 */
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetLevelDesc,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_GetSurfaceLevel,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_LockRect,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_UnlockRect,
af062818b47340eef15700d2f0211576ba3506eevboxsync IDirect3DTexture9Impl_AddDirtyRect
af062818b47340eef15700d2f0211576ba3506eevboxsync};
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic void STDMETHODCALLTYPE d3d9_texture_wined3d_object_destroyed(void *parent)
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync HeapFree(GetProcessHeap(), 0, parent);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync}
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncstatic const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops =
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync d3d9_texture_wined3d_object_destroyed,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync};
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsyncHRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device,
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool
e068057c82b010bc7cc663e8f57ac3ef1890a33cvboxsync#ifdef VBOX_WITH_WDDM
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync , HANDLE *shared_handle
ba6524ccac330688123403ddf0a83d702cd9e371vboxsync , void **pavClientMem
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync#endif
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync )
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync{
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync HRESULT hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync texture->lpVtbl = &Direct3DTexture9_Vtbl;
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync texture->ref = 1;
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_lock();
e068057c82b010bc7cc663e8f57ac3ef1890a33cvboxsync#ifdef VBOX_WITH_WDDM
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels,
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync &texture->wineD3DTexture, (IUnknown *)texture, &d3d9_texture_wined3d_parent_ops
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync , shared_handle
ba6524ccac330688123403ddf0a83d702cd9e371vboxsync , pavClientMem);
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync#else
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync &texture->wineD3DTexture, (IUnknown *)texture, &d3d9_texture_wined3d_parent_ops);
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync#endif
9a0dee30f5bea4fb02c0e836cd9689822e4645d1vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync wined3d_mutex_unlock();
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync if (FAILED(hr))
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync {
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync WARN("Failed to create wined3d texture, hr %#x.\n", hr);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync return hr;
af062818b47340eef15700d2f0211576ba3506eevboxsync }
af062818b47340eef15700d2f0211576ba3506eevboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync texture->parentDevice = (IDirect3DDevice9Ex *)device;
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync IDirect3DDevice9Ex_AddRef(texture->parentDevice);
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync
a3133ef29cdf3656735d569fd64e54c9286effc0vboxsync return D3D_OK;
af062818b47340eef15700d2f0211576ba3506eevboxsync}