10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens//
30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License.
50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at
6ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens//
70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens//
90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software
100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and
130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License.
14ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
15ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#ifndef D3D9_Direct3DResource9_hpp
16ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#define D3D9_Direct3DResource9_hpp
17ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
18ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Unknown.hpp"
19ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
20ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include <d3d9.h>
21ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
22ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include <map>
23ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
24ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capensnamespace D3D9
25ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens{
26ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	class Direct3DDevice9;
27ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
28ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	class Direct3DResource9 : public IDirect3DResource9, public Unknown
29ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	{
30ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	public:
31ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		Direct3DResource9(Direct3DDevice9 *device, D3DRESOURCETYPE type, D3DPOOL pool, unsigned int size);
32ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
333b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		~Direct3DResource9() override;
34ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
35ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		// IUnknown methods
363b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		long __stdcall QueryInterface(const IID &iid, void **object) override;
373b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		unsigned long __stdcall AddRef() override;
383b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		unsigned long __stdcall Release() override;
39ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
40ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		// IDirect3DResource9 methods
413b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		long __stdcall GetDevice(IDirect3DDevice9 **device) override;
423b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		long __stdcall SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) override;
433b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		long __stdcall GetPrivateData(const GUID &guid, void *data, unsigned long *size) override;
443b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		long __stdcall FreePrivateData(const GUID &guid) override;
453b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		unsigned long __stdcall SetPriority(unsigned long newPriority) override;
463b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		unsigned long __stdcall GetPriority() override;
473b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		void __stdcall PreLoad() override;
483b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens		D3DRESOURCETYPE __stdcall GetType() override;
49ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
50ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		// Internal methods
51ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		static unsigned int getMemoryUsage();
52ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		D3DPOOL getPool() const;
53ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
54ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	protected:
55ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		// Creation parameters
56ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		Direct3DDevice9 *const device;
57ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		const D3DRESOURCETYPE type;
58ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		const D3DPOOL pool;
59ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		const unsigned int size;
60ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
61ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	private:
62ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		unsigned long priority;
63ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
64ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		struct PrivateData
65ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		{
66ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			PrivateData();
67ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			PrivateData(const void *data, int size, bool managed);
68ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
69ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			~PrivateData();
70ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
71ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			PrivateData &operator=(const PrivateData &privateData);
72ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
73ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			void *data;
74ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			unsigned long size;
75ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			bool managed;   // IUnknown interface
76ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		};
77ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
78ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		struct CompareGUID
79ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		{
80ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			bool operator()(const GUID& left, const GUID& right) const
81ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			{
82ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens				return memcmp(&left, &right, sizeof(GUID)) < 0;
83ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens			}
84ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		};
85ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
86ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		typedef std::map<GUID, PrivateData, CompareGUID> PrivateDataMap;
87ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		typedef PrivateDataMap::iterator Iterator;
88ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		PrivateDataMap privateData;
89ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
90ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens		static unsigned int memoryUsage;
91ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens	};
92ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens}
93ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens
94ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#endif   // D3D9_Direct3DResource9_hpp
95