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