1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 15ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DVertexBuffer9.hpp" 16ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 17ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DDevice9.hpp" 18ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Resource.hpp" 19ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Debug.hpp" 20ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 21ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include <assert.h> 22ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 23ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capensnamespace D3D9 24ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens{ 25ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVertexBuffer9::Direct3DVertexBuffer9(Direct3DDevice9 *device, unsigned int length, unsigned long usage, long FVF, D3DPOOL pool) : Direct3DResource9(device, D3DRTYPE_VERTEXBUFFER, pool, length), length(length), usage(usage), FVF(FVF) 26ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 27ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(FVF) 28ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 29ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned int stride = 0; 30ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 31ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens switch(FVF & D3DFVF_POSITION_MASK) 32ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 33ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZ: stride += 12; break; 34ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZRHW: stride += 16; break; 35ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZB1: stride += 16; break; 36ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZB2: stride += 20; break; 37ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZB3: stride += 24; break; 38ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZB4: stride += 28; break; 39ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZB5: stride += 32; break; 40ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case D3DFVF_XYZW: stride += 16; break; 41ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 42ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 43ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(FVF & D3DFVF_NORMAL) stride += 12; 44ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(FVF & D3DFVF_PSIZE) stride += 4; 45ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(FVF & D3DFVF_DIFFUSE) stride += 4; 46ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(FVF & D3DFVF_SPECULAR) stride += 4; 47ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 48ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens switch((FVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT) 49ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 50ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 8: stride += 4 + 4 * ((1 + (FVF >> 30)) % 4); 51ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 7: stride += 4 + 4 * ((1 + (FVF >> 28)) % 4); 52ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 6: stride += 4 + 4 * ((1 + (FVF >> 26)) % 4); 53ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 5: stride += 4 + 4 * ((1 + (FVF >> 24)) % 4); 54ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 4: stride += 4 + 4 * ((1 + (FVF >> 22)) % 4); 55ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 3: stride += 4 + 4 * ((1 + (FVF >> 20)) % 4); 56ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 2: stride += 4 + 4 * ((1 + (FVF >> 18)) % 4); 57ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 1: stride += 4 + 4 * ((1 + (FVF >> 16)) % 4); 58ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens case 0: break; 59ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens default: 60ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens ASSERT(false); 61ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 62ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 63ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens ASSERT(length >= stride); // FIXME 64ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 65ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 66ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens vertexBuffer = new sw::Resource(length + 192 + 1024); // NOTE: Applications can 'overshoot' while writing vertices 67ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens lockCount = 0; 68ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 69ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 70ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVertexBuffer9::~Direct3DVertexBuffer9() 71ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 72ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens vertexBuffer->destruct(); 73ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 74ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 75ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::QueryInterface(const IID &iid, void **object) 76ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 77ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 78ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 79ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 80ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 81ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(iid == IID_IDirect3DVertexBuffer9 || 82ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IDirect3DResource9 || 83ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IUnknown) 84ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 85ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens AddRef(); 86ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = this; 87ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 88ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return S_OK; 89ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 90ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 91ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = 0; 92ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 93ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return NOINTERFACE(iid); 94ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 95ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 96ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVertexBuffer9::AddRef() 97ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 98ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 99ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 100ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::AddRef(); 101ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 102ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 103ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVertexBuffer9::Release() 104ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 105ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 106ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 107ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::Release(); 108ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 109ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 110ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::FreePrivateData(const GUID &guid) 111ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 112ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 113ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 114ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 115ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 116ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::FreePrivateData(guid); 117ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 118ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 119ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::GetPrivateData(const GUID &guid, void *data, unsigned long *size) 120ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 121ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 122ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 123ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 124ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 125ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::GetPrivateData(guid, data, size); 126ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 127ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 128ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void Direct3DVertexBuffer9::PreLoad() 129ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 130ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 131ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 132ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 133ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 134ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DResource9::PreLoad(); 135ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 136ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 137ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) 138ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 139ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 140ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 141ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 142ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 143ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::SetPrivateData(guid, data, size, flags); 144ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 145ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 146ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::GetDevice(IDirect3DDevice9 **device) 147ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 148ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(this->device); 149ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 150ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 151ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 152ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::GetDevice(device); 153ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 154ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 155ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVertexBuffer9::SetPriority(unsigned long newPriority) 156ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 157ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 158ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 159ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 160ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 161ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::SetPriority(newPriority); 162ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 163ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 164ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVertexBuffer9::GetPriority() 165ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 166ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 167ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 168ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 169ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 170ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::GetPriority(); 171ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 172ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 173ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DRESOURCETYPE Direct3DVertexBuffer9::GetType() 174ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 175ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 176ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 177ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 178ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 179ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DResource9::GetType(); 180ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 181ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 182ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::Lock(unsigned int offset, unsigned int size, void **data, unsigned long flags) 183ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 184ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 185ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 186ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 187ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 188ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(offset == 0 && size == 0) // Lock whole buffer 189ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 190ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens size = length; 191ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 192ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 193ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!data || offset + size > length) 194ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 195ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 196ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 197ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 198ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void *buffer; 199ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 200ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(flags & D3DLOCK_DISCARD/* && usage & D3DUSAGE_DYNAMIC*/) 201ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 202ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens vertexBuffer->destruct(); 203ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens vertexBuffer = new sw::Resource(length + 192 + 1024); // NOTE: Applications can 'overshoot' while writing vertices 204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 20566839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens buffer = (void*)vertexBuffer->data(); 206ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 207ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens else if(flags & D3DLOCK_NOOVERWRITE/* && usage & D3DUSAGE_DYNAMIC*/) 208ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 20966839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens buffer = (void*)vertexBuffer->data(); 210ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 211ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens else 212ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 213ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens buffer = vertexBuffer->lock(sw::PUBLIC); 214ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens lockCount++; 215ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 216ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 217ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *data = (unsigned char*)buffer + offset; 218ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 219ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 220ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 221ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 222ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::Unlock() 223ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 224ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 225ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 226ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 227ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 228ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(lockCount > 0) 229ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 230ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens vertexBuffer->unlock(); 231ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens lockCount--; 232ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 233ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 234ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 235ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 236ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 237ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVertexBuffer9::GetDesc(D3DVERTEXBUFFER_DESC *description) 238ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 239ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 240ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 241ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 242ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 243ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!description) 244ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 245ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 246ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 247ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 248ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->FVF = FVF; 249ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->Format = D3DFMT_VERTEXDATA; 250ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->Pool = pool; 251ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->Size = length; 252ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->Type = D3DRTYPE_VERTEXBUFFER; 253ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens description->Usage = usage; 254ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 255ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 256ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 257ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 258ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens int Direct3DVertexBuffer9::getLength() const 259ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 260ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return length; 261ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 262ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 263ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens sw::Resource *Direct3DVertexBuffer9::getResource() const 264ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 265ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return vertexBuffer; 266ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 267ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens} 268