1b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// 3b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// you may not use this file except in compliance with the License. 5b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// You may obtain a copy of the License at 6b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// 7b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// 9b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// See the License for the specific language governing permissions and 13b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// limitations under the License. 14b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 15b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DResource8.hpp" 16b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 17b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DDevice8.hpp" 18b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Debug.hpp" 19b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 20b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capensnamespace D3D8 21b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens{ 22b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned int Direct3DResource8::memoryUsage = 0; 23b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 24b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::PrivateData::PrivateData() 25b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 26b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens data = 0; 27b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 28b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 29b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::PrivateData::PrivateData(const void *data, int size, bool managed) 30b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 31b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens this->size = size; 32b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens this->managed = managed; 33b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 34b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens this->data = (void*)new unsigned char[size]; 35b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens memcpy(this->data, data, size); 36b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 37b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(managed) 38b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 39b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens ((IUnknown*)data)->AddRef(); 40b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 41b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 42b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 43b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::PrivateData &Direct3DResource8::PrivateData::operator=(const PrivateData &privateData) 44b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 45b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens size = privateData.size; 46b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens managed = privateData.managed; 47b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 48b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(data) 49b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 50b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(managed) 51b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 52b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens ((IUnknown*)data)->Release(); 53b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 54b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 55b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens delete[] data; 56b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 57b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 58b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens data = (void*)new unsigned char[size]; 59b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens memcpy(data, privateData.data, size); 60b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 61b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return *this; 62b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 63b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 64b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::PrivateData::~PrivateData() 65b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 66b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(data && managed) 67b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 68b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens ((IUnknown*)data)->Release(); 69b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 70b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 71b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens delete[] data; 72b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens data = 0; 73b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 74b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 75b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::Direct3DResource8(Direct3DDevice8 *device, D3DRESOURCETYPE type, unsigned int size) : device(device), type(type), size(size) 76b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 77b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens priority = 0; 78b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 79b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens memoryUsage += size; 80b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 81b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 82b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Direct3DResource8::~Direct3DResource8() 83b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 84b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens memoryUsage -= size; 85b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 86b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 87b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens long Direct3DResource8::QueryInterface(const IID &iid, void **object) 88b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 89b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 90b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 91b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(iid == IID_IDirect3DResource8 || 92b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens iid == IID_IUnknown) 93b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 94b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens AddRef(); 95b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens *object = this; 96b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 97b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return S_OK; 98b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 99b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 100b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens *object = 0; 101b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 102b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return NOINTERFACE(iid); 103b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 104b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 105b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned long Direct3DResource8::AddRef() 106b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 107b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 108b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 109b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return Unknown::AddRef(); 110b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 111b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 112b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned long Direct3DResource8::Release() 113b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 114b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 115b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 116b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return Unknown::Release(); 117b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 118b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 119b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens long Direct3DResource8::GetDevice(IDirect3DDevice8 **device) 120b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 121b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 122b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 123b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(!device) 124b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 125b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return INVALIDCALL(); 126b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 127b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 128b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens this->device->AddRef(); 129b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens *device = this->device; 130b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 131b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return D3D_OK; 132b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 133b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 134b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens long Direct3DResource8::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) 135b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 136b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 137b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 138b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens privateData[guid] = PrivateData(data, size, flags == D3DSPD_IUNKNOWN); 139b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 140b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return D3D_OK; 141b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 142b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 143b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens long Direct3DResource8::GetPrivateData(const GUID &guid, void *data, unsigned long *size) 144b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 145b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 146b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 147b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Iterator result = privateData.find(guid); 148b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 149b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(result == privateData.end()) 150b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 151b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return NOTFOUND(); 152b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 153b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 154b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(result->second.size > *size) 155b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 156b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return MOREDATA(); 157b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 158b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 159b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens memcpy(data, result->second.data, result->second.size); 160b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 161b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return D3D_OK; 162b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 163b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 164b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens long Direct3DResource8::FreePrivateData(const GUID &guid) 165b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 166b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 167b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 168b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens Iterator result = privateData.find(guid); 169b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 170b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens if(result == privateData.end()) 171b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 172b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return D3DERR_NOTFOUND; 173b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 174b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 175b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens privateData.erase(guid); 176b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 177b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return D3D_OK; 178b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 179b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 180b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned long Direct3DResource8::SetPriority(unsigned long newPriority) 181b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 182b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 183b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 184b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned long oldPriority = priority; 185b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens priority = newPriority; 186b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 187b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return oldPriority; 188b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 189b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 190b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned long Direct3DResource8::GetPriority() 191b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 192b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 193b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 194b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return priority; 195b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 196b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 197b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens void Direct3DResource8::PreLoad() 198b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 199b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 200b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 201b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return; // FIXME: Anything to do? 202b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 203b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 204b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens D3DRESOURCETYPE Direct3DResource8::GetType() 205b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 206b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens TRACE(""); 207b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 208b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return type; 209b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 210b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens 211b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens unsigned int Direct3DResource8::getMemoryUsage() 212b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens { 213b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens return memoryUsage; 214b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens } 215b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens}