117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// you may not use this file except in compliance with the License. 517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// You may obtain a copy of the License at 617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Unless required by applicable law or agreed to in writing, software 1017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 1117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// See the License for the specific language governing permissions and 1317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// limitations under the License. 1417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 1517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include "Direct3DTexture8.hpp" 1617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 1717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include "Direct3DSurface8.hpp" 1817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include "Resource.hpp" 1917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include "Debug.hpp" 2017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 2117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include <assert.h> 2217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 2317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capensnamespace D3D8 2417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens{ 2517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DTexture8::Direct3DTexture8(Direct3DDevice8 *device, unsigned int width, unsigned int height, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool) : Direct3DBaseTexture8(device, D3DRTYPE_TEXTURE, levels, usage), width(width), height(height), format(format), pool(pool) 2617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 2717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(levels == 0) 2817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 2917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens this->levels = sw::log2(sw::max((int)width, (int)height, 1)) + 1; 3017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 3117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 3217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++) 3317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 3417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(level < this->levels) 3517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 3617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level] = new Direct3DSurface8(device, this, width, height, format, pool, D3DMULTISAMPLE_NONE, true, usage); 3717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level]->bind(); 3817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 3917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens else 4017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 4117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level] = 0; 4217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 4317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 4417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens width = sw::max(1, (int)width / 2); 4517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens height = sw::max(1, (int)height / 2); 4617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 4717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 4817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 4917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DTexture8::~Direct3DTexture8() 5017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 5117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens for(int level = 0; level < sw::MIPMAP_LEVELS; level++) 5217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 5317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(surfaceLevel[level]) 5417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 5517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level]->unbind(); 5617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level] = 0; 5717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 5817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 5917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 6017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 6117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::QueryInterface(const IID &iid, void **object) 6217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 6317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 6417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 6517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(iid == IID_IDirect3DTexture8 || 6617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens iid == IID_IDirect3DBaseTexture8 || 6717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens iid == IID_IDirect3DResource8 || 6817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens iid == IID_IUnknown) 6917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 7017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens AddRef(); 7117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens *object = this; 7217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 7317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return S_OK; 7417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 7517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 7617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens *object = 0; 7717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 7817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return NOINTERFACE(iid); 7917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 8017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 8117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::AddRef() 8217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 8317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 8417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 8517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::AddRef(); 8617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 8717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 8817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::Release() 8917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 9017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 9117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 9217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::Release(); 9317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 9417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 9517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::FreePrivateData(const GUID &guid) 9617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 9717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 9817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 9917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::FreePrivateData(guid); 10017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 10117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::GetPrivateData(const GUID &guid, void *data, unsigned long *size) 10317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 10417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 10517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetPrivateData(guid, data, size); 10717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 10817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void Direct3DTexture8::PreLoad() 11017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 11117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 11217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 11317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DBaseTexture8::PreLoad(); 11417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 11517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 11617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) 11717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 11817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 11917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 12017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::SetPrivateData(guid, data, size, flags); 12117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 12217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 12317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::GetDevice(IDirect3DDevice8 **device) 12417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 12517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 12617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 12717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetDevice(device); 12817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 12917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::SetPriority(unsigned long newPriority) 13117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 13217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 13317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::SetPriority(newPriority); 13517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 13617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::GetPriority() 13817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 13917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 14017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetPriority(); 14217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 14317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens D3DRESOURCETYPE Direct3DTexture8::GetType() 14517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 14617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 14717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetType(); 14917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 15017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::GetLevelCount() 15217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 15317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 15417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetLevelCount(); 15617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 15717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::GetLOD() 15917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 16017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 16117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 16217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::GetLOD(); 16317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 16417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 16517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long Direct3DTexture8::SetLOD(unsigned long newLOD) 16617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 16717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 16817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 16917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return Direct3DBaseTexture8::SetLOD(newLOD); 17017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 17117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 17217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::GetLevelDesc(unsigned int level, D3DSURFACE_DESC *description) 17317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 17417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 17517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 17617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(level >= GetLevelCount() || !surfaceLevel[level]) 17717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 17817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return INVALIDCALL(); 17917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 18017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 18117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return surfaceLevel[level]->GetDesc(description); 18217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 18317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 18417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::LockRect(unsigned int level, D3DLOCKED_RECT *lockedRect, const RECT *rect, unsigned long flags) 18517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 18617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 18717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 18817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(!lockedRect || level >= GetLevelCount() || !surfaceLevel[level]) 18917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 19017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return INVALIDCALL(); 19117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 19217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 19317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return surfaceLevel[level]->LockRect(lockedRect, rect, flags); 19417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 19517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 19617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::GetSurfaceLevel(unsigned int level, IDirect3DSurface8 **surface) 19717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 19817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 19917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 20017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens *surface = 0; // FIXME: Verify 20117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 20217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(level >= GetLevelCount() || !surfaceLevel[level]) 20317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 20417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return INVALIDCALL(); 20517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 20617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 20717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens surfaceLevel[level]->AddRef(); 20817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens *surface = surfaceLevel[level]; 20917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 21017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return D3D_OK; 21117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 21217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 21317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::UnlockRect(unsigned int level) 21417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 21517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 21617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 21717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens if(level >= GetLevelCount() || !surfaceLevel[level]) 21817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 21917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return INVALIDCALL(); 22017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 22117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 22217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return surfaceLevel[level]->UnlockRect(); 22317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 22417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 22517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long Direct3DTexture8::AddDirtyRect(const RECT *dirtyRect) 22617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 22717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens TRACE(""); 22817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 22917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // UNIMPLEMENTED(); 23017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 23117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return D3D_OK; 23217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 23317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 23417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DSurface8 *Direct3DTexture8::getInternalSurfaceLevel(unsigned int level) 23517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 23617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens return surfaceLevel[level]; 23717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens } 23817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens} 239