1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas 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
6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas 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.
14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef sw_Surface_hpp
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define sw_Surface_hpp
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Color.hpp"
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Main/Config.hpp"
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Common/Resource.hpp"
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace sw
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	class Resource;
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	struct Rect
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Rect() {}
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Rect(int x0i, int y0i, int x1i, int y1i) : x0(x0i), y0(y0i), x1(x1i), y1(y1i) {}
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void clip(int minX, int minY, int maxX, int maxY);
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int width() const  { return x1 - x0; }
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int height() const { return y1 - y0; }
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int x0;   // Inclusive
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int y0;   // Inclusive
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int x1;   // Exclusive
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int y1;   // Exclusive
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	struct SliceRect : public Rect
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SliceRect() : slice(0) {}
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SliceRect(const Rect& rect) : Rect(rect), slice(0) {}
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SliceRect(const Rect& rect, int s) : Rect(rect), slice(s) {}
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SliceRect(int x0, int y0, int x1, int y1, int s) : Rect(x0, y0, x1, y1), slice(s) {}
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int slice;
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	enum Format : unsigned char
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_NULL,
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8,
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R8I,
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R8UI,
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R8I_SNORM,
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R8, // UI_SNORM
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R16I,
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R16UI,
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R32I,
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R32UI,
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R3G3B2,
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8R3G3B2,
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X4R4G4B4,
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A4R4G4B4,
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R4G4B4A4,
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R5G6B5,
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R8G8B8,
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_B8G8R8,
72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8R8G8B8,
73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8R8G8B8,
74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8B8G8R8I,
75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8B8G8R8UI,
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8B8G8R8I_SNORM,
77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8B8G8R8, // UI_SNORM
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8B8G8R8I,
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8B8G8R8UI,
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8B8G8R8I_SNORM,
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8B8G8R8, // UI_SNORM
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_X8,
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_A8,
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X1R5G5B5,
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A1R5G5B5,
86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R5G5B5A1,
87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G8R8I,
88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G8R8UI,
89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G8R8I_SNORM,
90d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G8R8, // UI_SNORM
91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G16R16, // D3D format
92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G16R16I,
93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G16R16UI,
94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G32R32I,
95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G32R32UI,
96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A2R10G10B10,
97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A2B10G10R10,
98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16B16G16R16, // D3D format
99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X16B16G16R16I,
100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X16B16G16R16UI,
101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16B16G16R16I,
102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16B16G16R16UI,
103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X32B32G32R32I,
104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X32B32G32R32UI,
105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A32B32G32R32I,
106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A32B32G32R32UI,
107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Paletted formats
108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_P8,
109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8P8,
110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Compressed formats
111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_DXT1,
112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_DXT3,
113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_DXT5,
114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_ATI1,
115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_ATI2,
116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_ETC1,
117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R11_EAC,
118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SIGNED_R11_EAC,
119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RG11_EAC,
120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SIGNED_RG11_EAC,
121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGB8_ETC2,
122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ETC2,
123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA8_ETC2_EAC,
126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ETC2_EAC,
127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_4x4_KHR,
128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_5x4_KHR,
129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_5x5_KHR,
130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_6x5_KHR,
131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_6x6_KHR,
132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_8x5_KHR,
133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_8x6_KHR,
134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_8x8_KHR,
135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_10x5_KHR,
136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_10x6_KHR,
137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_10x8_KHR,
138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_10x10_KHR,
139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_12x10_KHR,
140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_RGBA_ASTC_12x12_KHR,
141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR,
142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR,
143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR,
144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR,
145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR,
146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR,
147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR,
148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR,
149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR,
150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR,
151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR,
152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR,
153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR,
154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR,
155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Floating-point formats
156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16F,
157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R16F,
158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G16R16F,
159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_B16G16R16F,
160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16B16G16R16F,
161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A32F,
162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_R32F,
163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_G32R32F,
164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_B32G32R32F,
165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X32B32G32R32F,
166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A32B32G32R32F,
167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Bump map formats
168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_V8U8,
169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_L6V5U5,
170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_Q8W8V8U8,
171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8L8V8U8,
172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A2W10V10U10,
173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_V16U16,
174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16W16V16U16,
175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_Q16W16V16U16,
176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Luminance formats
177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_L8,
178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A4L4,
179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_L16,
180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8L8,
181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_L16F,
182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A16L16F,
183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_L32F,
184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A32L32F,
185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Depth/stencil formats
186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D16,
187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32,
188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D24X8,
189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D24S8,
190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D24FS8,
191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32F,                 // Quad layout
192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32F_COMPLEMENTARY,   // Quad layout, 1 - z
193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32F_LOCKABLE,        // Linear layout
194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32FS8_TEXTURE,       // Linear layout, no PCF
195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_D32FS8_SHADOW,        // Linear layout, PCF
196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_DF24S8,
197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_DF16S8,
198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_INTZ,
199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_S8,
200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Quad layout framebuffer
201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_X8G8R8B8Q,
202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_A8G8R8B8Q,
203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// YUV formats
204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_YV12_BT601,
205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_YV12_BT709,
206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_YV12_JFIF,    // Full-swing BT.601
207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		FORMAT_LAST = FORMAT_YV12_JFIF
209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	enum Lock
212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		LOCK_UNLOCKED,
214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		LOCK_READONLY,
215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		LOCK_WRITEONLY,
216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		LOCK_READWRITE,
217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		LOCK_DISCARD
218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	class Surface
221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	private:
223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct Buffer
224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		public:
226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void write(int x, int y, int z, const Color<float> &color);
227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void write(int x, int y, const Color<float> &color);
228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void write(void *element, const Color<float> &color);
229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Color<float> read(int x, int y, int z) const;
230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Color<float> read(int x, int y) const;
231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Color<float> read(void *element) const;
232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Color<float> sample(float x, float y, float z) const;
233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Color<float> sample(float x, float y) const;
234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void *lockRect(int x, int y, int z, Lock lock);
236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void unlockRect();
237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void *buffer;
239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int width;
240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int height;
241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int depth;
242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int bytes;
243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int pitchB;
244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int pitchP;
245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int sliceB;
246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int sliceP;
247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Format format;
248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Lock lock;
249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bool dirty;
251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	public:
254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Surface(int width, int height, int depth, Format format, void *pixels, int pitch, int slice);
255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Surface(Resource *texture, int width, int height, int depth, Format format, bool lockable, bool renderTarget, int pitchP = 0);
256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		virtual ~Surface();
258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline void *lock(int x, int y, int z, Lock lock, Accessor client, bool internal = false);
260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline void unlock(bool internal = false);
261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getWidth() const;
262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getHeight() const;
263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getDepth() const;
264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline Format getFormat(bool internal = false) const;
265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getPitchB(bool internal = false) const;
266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getPitchP(bool internal = false) const;
267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getSliceB(bool internal = false) const;
268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getSliceP(bool internal = false) const;
269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *lockExternal(int x, int y, int z, Lock lock, Accessor client);
271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void unlockExternal();
272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline Format getExternalFormat() const;
273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getExternalPitchB() const;
274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getExternalPitchP() const;
275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getExternalSliceB() const;
276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getExternalSliceP() const;
277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		virtual void *lockInternal(int x, int y, int z, Lock lock, Accessor client);
279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		virtual void unlockInternal();
280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline Format getInternalFormat() const;
281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getInternalPitchB() const;
282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getInternalPitchP() const;
283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getInternalSliceB() const;
284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getInternalSliceP() const;
285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *lockStencil(int front, Accessor client);
287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void unlockStencil();
288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getStencilPitchB() const;
289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getStencilSliceB() const;
290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getMultiSampleCount() const;
292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline int getSuperSampleCount() const;
293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isEntire(const SliceRect& rect) const;
295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SliceRect getRect() const;
296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void clearDepth(float depth, int x0, int y0, int width, int height);
297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void clearStencil(unsigned char stencil, unsigned char mask, int x0, int y0, int width, int height);
298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void fill(const Color<float> &color, int x0, int y0, int width, int height);
299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Color<float> readExternal(int x, int y, int z) const;
301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Color<float> readExternal(int x, int y) const;
302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Color<float> sampleExternal(float x, float y, float z) const;
303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Color<float> sampleExternal(float x, float y) const;
304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void writeExternal(int x, int y, int z, const Color<float> &color);
305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void writeExternal(int x, int y, const Color<float> &color);
306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void copyInternal(const Surface* src, int x, int y, float srcX, float srcY, bool filter);
308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void copyInternal(const Surface* src, int x, int y, int z, float srcX, float srcY, float srcZ, bool filter);
309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasStencil() const;
311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasDepth() const;
312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasPalette() const;
313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isRenderTarget() const;
314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasDirtyMipmaps() const;
316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void cleanMipmaps();
317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		inline bool isExternalDirty() const;
318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Resource *getResource();
319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int bytes(Format format);
321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int pitchB(int width, Format format, bool target);
322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int pitchP(int width, Format format, bool target);
323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int sliceB(int width, int height, Format format, bool target);
324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int sliceP(int width, int height, Format format, bool target);
325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static unsigned int size(int width, int height, int depth, Format format);   // FIXME: slice * depth
326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isStencil(Format format);
328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isDepth(Format format);
329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isPalette(Format format);
330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isFloatFormat(Format format);
332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isUnsignedComponent(Format format, int component);
333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isSRGBreadable(Format format);
334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isSRGBwritable(Format format);
335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isCompressed(Format format);
336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static bool isNonNormalizedInteger(Format format);
337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int componentCount(Format format);
338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void setTexturePalette(unsigned int *palette);
340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	protected:
342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Resource *resource;
343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	private:
345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef unsigned char byte;
346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef unsigned short word;
347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef unsigned int dword;
348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef uint64_t qword;
349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		#if S3TC_SUPPORT
351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct DXT1
352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c0;
354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c1;
355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dword lut;
356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct DXT3
359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			qword a;
361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c0;
363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c1;
364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dword lut;
365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct DXT5
368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			union
370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				struct
372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte a0;
374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte a1;
375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				qword alut;   // Skip first 16 bit
378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			};
379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c0;
381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			word c1;
382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dword clut;
383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		#endif
385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct ATI2
387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			union
389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				struct
391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte y0;
393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte y1;
394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				qword ylut;   // Skip first 16 bit
397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			};
398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			union
400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				struct
402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte x0;
404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte x1;
405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				qword xlut;   // Skip first 16 bit
408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			};
409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		struct ATI1
412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			union
414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				struct
416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte r0;
418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					byte r1;
419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				qword rlut;   // Skip first 16 bit
422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			};
423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeR8G8B8(Buffer &destination, const Buffer &source);
426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeX1R5G5B5(Buffer &destination, const Buffer &source);
427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeA1R5G5B5(Buffer &destination, const Buffer &source);
428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeX4R4G4B4(Buffer &destination, const Buffer &source);
429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeA4R4G4B4(Buffer &destination, const Buffer &source);
430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeP8(Buffer &destination, const Buffer &source);
431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		#if S3TC_SUPPORT
433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeDXT1(Buffer &internal, const Buffer &external);
434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeDXT3(Buffer &internal, const Buffer &external);
435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeDXT5(Buffer &internal, const Buffer &external);
436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		#endif
437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeATI1(Buffer &internal, const Buffer &external);
438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeATI2(Buffer &internal, const Buffer &external);
439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeEAC(Buffer &internal, const Buffer &external, int nbChannels, bool isSigned);
440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeETC2(Buffer &internal, const Buffer &external, int nbAlphaBits, bool isSRGB);
441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void decodeASTC(Buffer &internal, const Buffer &external, int xSize, int ySize, int zSize, bool isSRGB);
442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void update(Buffer &destination, Buffer &source);
444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void genericUpdate(Buffer &destination, Buffer &source);
445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void *allocateBuffer(int width, int height, int depth, Format format);
446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static void memfill4(void *buffer, int pattern, int bytes);
447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool identicalFormats() const;
449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Format selectInternalFormat(Format format) const;
450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void resolve();
452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Buffer external;
454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Buffer internal;
455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Buffer stencil;
456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		const bool lockable;
458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		const bool renderTarget;
459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool dirtyMipmaps;
461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int paletteUsed;
462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static unsigned int *palette;   // FIXME: Not multi-device safe
464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static unsigned int paletteID;
465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasParent;
467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool ownExternal;
468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#undef min
472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#undef max
473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace sw
475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void *Surface::lock(int x, int y, int z, Lock lock, Accessor client, bool internal)
477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? lockInternal(x, y, z, lock, client) : lockExternal(x, y, z, lock, client);
479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Surface::unlock(bool internal)
482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? unlockInternal() : unlockExternal();
484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getWidth() const
487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.width;
489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getHeight() const
492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.height;
494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getDepth() const
497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.depth;
499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Format Surface::getFormat(bool internal) const
502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? getInternalFormat() : getExternalFormat();
504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getPitchB(bool internal) const
507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? getInternalPitchB() : getExternalPitchB();
509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getPitchP(bool internal) const
512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? getInternalPitchP() : getExternalPitchB();
514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getSliceB(bool internal) const
517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? getInternalSliceB() : getExternalSliceB();
519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getSliceP(bool internal) const
522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal ? getInternalSliceP() : getExternalSliceB();
524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Format Surface::getExternalFormat() const
527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.format;
529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getExternalPitchB() const
532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.pitchB;
534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getExternalPitchP() const
537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.pitchP;
539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getExternalSliceB() const
542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.sliceB;
544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getExternalSliceP() const
547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.sliceP;
549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Format Surface::getInternalFormat() const
552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.format;
554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getInternalPitchB() const
557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.pitchB;
559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getInternalPitchP() const
562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.pitchP;
564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getInternalSliceB() const
567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.sliceB;
569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getInternalSliceP() const
572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.sliceP;
574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getStencilPitchB() const
577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return stencil.pitchB;
579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getStencilSliceB() const
582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return stencil.sliceB;
584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getMultiSampleCount() const
587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return sw::min(internal.depth, 4);
589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Surface::getSuperSampleCount() const
592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return internal.depth > 4 ? internal.depth / 4 : 1;
594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Surface::isExternalDirty() const
597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return external.buffer && external.buffer != internal.buffer && external.dirty;
599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif   // sw_Surface_hpp
603