1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas 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 6264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas 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. 14264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 15264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "Image.hpp" 16264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 17264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "Texture.h" 18264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "utilities.h" 19264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "../common/debug.h" 20264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "Common/Thread.hpp" 21264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 22a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens#define _GDI32_ 23a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens#include <windows.h> 24a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens#include <GL/GL.h> 25a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens#include <GL/glext.h> 26264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 27f4486fdf81c434bd06f06489901b6f825814fc17Nicolas Capensnamespace gl 28264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 29264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens static sw::Resource *getParentResource(Texture *texture) 30264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 31264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(texture) 32264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 33264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return texture->getResource(); 34264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 35264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 36264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return 0; 37264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 38264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 39264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens Image::Image(Texture *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type) 40a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens : parentTexture(parentTexture), width(width), height(height), format(format), type(type) 41a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens , internalFormat(selectInternalFormat(format, type)), multiSampleDepth(1) 42a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens , sw::Surface(getParentResource(parentTexture), width, height, 1, selectInternalFormat(format, type), true, true) 43264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 44264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens referenceCount = 1; 45264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 46264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 47264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens Image::Image(Texture *parentTexture, GLsizei width, GLsizei height, sw::Format internalFormat, int multiSampleDepth, bool lockable, bool renderTarget) 48a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens : parentTexture(parentTexture), width(width), height(height), internalFormat(internalFormat), format(0 /*GL_NONE*/), type(0 /*GL_NONE*/), multiSampleDepth(multiSampleDepth) 49a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens , sw::Surface(getParentResource(parentTexture), width, height, multiSampleDepth, internalFormat, lockable, renderTarget) 50264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 51264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens referenceCount = 1; 52264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 53264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 54264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens Image::~Image() 55264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 56264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens ASSERT(referenceCount == 0); 57264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 58264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 59a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens void *Image::lock(unsigned int left, unsigned int top, sw::Lock lock) 60a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 61a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return lockExternal(left, top, 0, lock, sw::PUBLIC); 62a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 63a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 64a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens unsigned int Image::getPitch() const 65a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 66a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return getExternalPitchB(); 67a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 68a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 69a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens void Image::unlock() 70a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 71a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens unlockExternal(); 72a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 73a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 74a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens int Image::getWidth() 75a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 76a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return width; 77a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 79a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens int Image::getHeight() 80a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 81a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return height; 82a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 83a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 84a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens GLenum Image::getFormat() 85a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 86a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return format; 87a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 89a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens GLenum Image::getType() 90a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 91a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return type; 92a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 94a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens sw::Format Image::getInternalFormat() 95a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 96a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return internalFormat; 97a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 99a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens int Image::getMultiSampleDepth() 100a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens { 101a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens return multiSampleDepth; 102a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens } 103a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 104264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::addRef() 105264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 106264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(parentTexture) 107264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 108264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return parentTexture->addRef(); 109264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 110264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 111264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens sw::atomicIncrement(&referenceCount); 112264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 113264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 114264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::release() 115264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 116264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(parentTexture) 117264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 118264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return parentTexture->release(); 119264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 120264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 121264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(referenceCount > 0) 122264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 123264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens sw::atomicDecrement(&referenceCount); 124264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 125264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 126264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(referenceCount == 0) 127264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 128264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens delete this; 129264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 130264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 131264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 132a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens void Image::unbind() 133264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 134a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens parentTexture = 0; 135264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 136264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens release(); 137264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 138264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 139264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens sw::Format Image::selectInternalFormat(GLenum format, GLenum type) 140264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if(type == GL_NONE && format == GL_NONE) 142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return sw::FORMAT_NULL; 144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens else 146264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens #if S3TC_SUPPORT 147264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || 148264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) 149264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 150264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_DXT1; 151264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 152a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens else if(format == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) 153264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 154264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_DXT3; 155264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 156a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens else if(format == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) 157264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 158264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_DXT5; 159264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 160264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else 161264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens #endif 162264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(type == GL_FLOAT) 163264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 164264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A32B32G32R32F; 165264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 166a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens else if(type == GL_HALF_FLOAT) 167264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 168264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A16B16G16R16F; 169264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 170264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(type == GL_UNSIGNED_BYTE) 171264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 172264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(format == GL_LUMINANCE) 173264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 174264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_L8; 175264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 176264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(format == GL_LUMINANCE_ALPHA) 177264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 178264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8L8; 179264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 180264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(format == GL_RGBA || format == GL_BGRA_EXT) 181264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 182264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8R8G8B8; 183264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 184264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(format == GL_RGB) 185264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 186264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_X8R8G8B8; 187264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 188264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(format == GL_ALPHA) 189264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 190264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8; 191264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 1923713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens else UNREACHABLE(format); 193264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 194264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT) 195264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 196264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(format == GL_DEPTH_COMPONENT) 197264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 198264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_D32FS8_TEXTURE; 199264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 2003713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens else UNREACHABLE(format); 201264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 202a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens else if(type == GL_UNSIGNED_INT_24_8_EXT) 203264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 204a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens if(format == GL_DEPTH_STENCIL_EXT) 205264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 206264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_D32FS8_TEXTURE; 207264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 2083713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens else UNREACHABLE(format); 209264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 210264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(type == GL_UNSIGNED_SHORT_4_4_4_4) 211264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 212264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8R8G8B8; 213264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 214264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(type == GL_UNSIGNED_SHORT_5_5_5_1) 215264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 216264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8R8G8B8; 217264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 218264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens else if(type == GL_UNSIGNED_SHORT_5_6_5) 219264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 2205a86ee9424796e118fb4f378ca655d80756752c2Nicolas Capens return sw::FORMAT_R5G6B5; 221264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens else if(type == GL_UNSIGNED_INT_8_8_8_8_REV) 223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return sw::FORMAT_A8R8G8B8; 225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 226a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens 2273713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens else UNREACHABLE(type); 228264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 229264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return sw::FORMAT_A8R8G8B8; 230264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 231264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 232b027aa91f4b20c5062fbc781d0ff693bf294cbccAlexis Hetu void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input) 233264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 234264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens GLsizei inputPitch = ComputePitch(width, format, type, unpackAlignment); 235264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void *buffer = lock(0, 0, sw::LOCK_WRITEONLY); 236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 237264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(buffer) 238264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 239264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(type) 240264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 241264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_BYTE: 242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens case GL_UNSIGNED_INT_8_8_8_8_REV: 243264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 244264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 245264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_ALPHA: 246264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadAlphaImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 247264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 248264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE: 249264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 250264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 251264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE_ALPHA: 252264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceAlphaImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 253264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 254264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGB: 255264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 256264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 257264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGBA: 258264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBAUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 259264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 260264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_BGRA_EXT: 261264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadBGRAImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 262264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 2633713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 264264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 265264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 266264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_SHORT_5_6_5: 267264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 268264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 269264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGB: 270264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGB565ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 271264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 2723713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 273264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 274264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 275264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_SHORT_4_4_4_4: 276264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 277264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 278264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGBA: 279264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBA4444ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 280264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 2813713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 282264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 283264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 284264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_SHORT_5_5_5_1: 285264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 286264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 287264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGBA: 288264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBA5551ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 289264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 2903713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 291264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 292264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 293264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_FLOAT: 294264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 295264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 296264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens // float textures are converted to RGBA, not BGRA 297264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_ALPHA: 298264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadAlphaFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 299264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 300264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE: 301264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 302264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 303264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE_ALPHA: 304264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceAlphaFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 305264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 306264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGB: 307264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 308264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 309264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGBA: 310264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBAFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 311264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 3123713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 313264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 314264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 3153713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens case GL_HALF_FLOAT: 316264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens switch(format) 317264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 318264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens // float textures are converted to RGBA, not BGRA 319264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_ALPHA: 320264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadAlphaHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 321264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 322264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE: 323264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 324264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 325264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_LUMINANCE_ALPHA: 326264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadLuminanceAlphaHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 327264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 328264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGB: 329264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 330264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 331264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_RGBA: 332264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadRGBAHalfFloatImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 333264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 3343713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(format); 335264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 336264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 337264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_SHORT: 338264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadD16ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 339264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 340264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens case GL_UNSIGNED_INT: 341264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadD32ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 342264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 343a9b4937f2069dc0fcf80100ed316d8b65b6702d3Nicolas Capens case GL_UNSIGNED_INT_24_8_EXT: 344264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens loadD24S8ImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); 345264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens break; 3463713cd4b12696bcabaabe98562320e8fa1796b33Nicolas Capens default: UNREACHABLE(type); 347264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 348264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 349264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 350264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unlock(); 351264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 352264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 353264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 354264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 355264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 356264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 357264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 358264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset; 359264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 360264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width); 361264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 362264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 363264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 364264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 365264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 366264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 367264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 368264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const float *source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 369264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 16); 370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 371264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 372264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 373264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = 0; 374264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = 0; 375264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = 0; 376264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = source[x]; 377264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 378264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 379264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 380264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 381264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 382264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 383264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 384264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 385264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 386264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short *dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 8); 387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 388264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 389264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 390264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = 0; 391264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = 0; 392264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = 0; 393264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = source[x]; 394264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 395264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 396264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 397264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 398264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 399264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 400264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 401264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 402264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 403264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset; 404264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 405264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width); 406264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 407264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 408264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 409264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 410264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 411264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 412264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 413264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const float *source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 414264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 16); 415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 416264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 417264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 418264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[x]; 419264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[x]; 420264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[x]; 421264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = 1.0f; 422264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 423264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 424264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 425264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 426264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 427264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 428264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 429264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 430264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 431264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short *dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 8); 432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 433264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 434264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 435264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[x]; 436264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[x]; 437264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[x]; 438264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1 439264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 440264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 441264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 442264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 443264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 444264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 445264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 446264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 447264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 448264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 2; 449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 450264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width * 2); 451264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 452264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 453264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 454264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 455264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 456264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 457264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 458264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const float *source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 459264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 16); 460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 461264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 462264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 463264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[2*x+0]; 464264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[2*x+0]; 465264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[2*x+0]; 466264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = source[2*x+1]; 467264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 468264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 469264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 470264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 471264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadLuminanceAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 472264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 473264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 474264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 475264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 476264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short *dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 8); 477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 478264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 479264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 480264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[2*x+0]; 481264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[2*x+0]; 482264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[2*x+0]; 483264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = source[2*x+1]; 484264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 485264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 486264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 487264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 488264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 489264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 490264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 491264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 492264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 493264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4; 494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 495264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 496264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 497264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[x * 3 + 2]; 498264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[x * 3 + 1]; 499264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[x * 3 + 0]; 500264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = 0xFF; 501264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 502264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 503264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 504264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 505264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGB565ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 506264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 507264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 508264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 509264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 5105a86ee9424796e118fb4f378ca655d80756752c2Nicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 2; 511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 5125a86ee9424796e118fb4f378ca655d80756752c2Nicolas Capens memcpy(dest, source, width * 2); 513264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 514264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 515264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 516264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 517264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 518264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 519264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 520264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const float *source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 521264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 16); 522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 523264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 524264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 525264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[x * 3 + 0]; 526264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[x * 3 + 1]; 527264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[x * 3 + 2]; 528264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = 1.0f; 529264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 530264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 531264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 532264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 533264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 534264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 535264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 536264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 537264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 538264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short *dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 8); 539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 540264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 541264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 542264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = source[x * 3 + 0]; 543264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = source[x * 3 + 1]; 544264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = source[x * 3 + 2]; 545264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1 546264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 547264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 548264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 549264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 550264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBAUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 551264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 552264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 553264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 554264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 555264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned int *dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4); 556264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 557264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 558264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 559264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned int rgba = source[x]; 560264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[x] = (rgba & 0xFF00FF00) | ((rgba << 16) & 0x00FF0000) | ((rgba >> 16) & 0x000000FF); 561264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 562264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 563264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 564264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 565264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 566264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 567264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 568264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 569264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 570264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4; 571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 572264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 573264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 574264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short rgba = source[x]; 575264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4); 576264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8); 577264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12); 578264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0); 579264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 580264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 581264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 582264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 583264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 584264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 585264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 586264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 587264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 588264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4; 589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 590264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 591264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 592264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned short rgba = source[x]; 593264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 0] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3); 594264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8); 595264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13); 596264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0; 597264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 598264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 599264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 600264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 601264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 602264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 603264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 604264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 605264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const float *source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 606264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 16); 607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 608264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width * 16); 609264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 610264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 611264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 612264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadRGBAHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 613264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 614264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 615264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 616264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 617264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 8; 618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 619264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width * 8); 620264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 621264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 622264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 623264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 624264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 625264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 626264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 627264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch; 628264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4; 629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 630264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(dest, source, width*4); 631264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 632264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 633264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 634264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 635264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 636264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 637264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 638264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned short *source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 639264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4); 640264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 641264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 642264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 643264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[x] = (float)source[x] / 0xFFFF; 644264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 645264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 646264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 647264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 648264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const 649264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 650264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 651264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 652264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 653264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4); 654264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 655264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 656264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 657264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[x] = (float)source[x] / 0xFFFFFFFF; 658264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 659264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 660264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 661264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 662264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void Image::loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) 663264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 664264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 665264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 666264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 667264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens float *dest = reinterpret_cast<float*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4); 668264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 669264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 670264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 671264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[x] = (float)(source[x] & 0xFFFFFF00) / 0xFFFFFF00; 672264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 673264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 674264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 675264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, sw::PUBLIC)); 676264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 677264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(stencil) 678264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 679264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int y = 0; y < height; y++) 680264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 681264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 682264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unsigned char *dest = static_cast<unsigned char*>(stencil) + (y + yoffset) * getStencilPitchB() + xoffset; 683264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 684264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int x = 0; x < width; x++) 685264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 686264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens dest[x] = static_cast<unsigned char>(source[x] & 0x000000FF); // FIXME: Quad layout 687264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 688264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 689264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 690264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unlockStencil(); 691264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 692264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 693264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 694b027aa91f4b20c5062fbc781d0ff693bf294cbccAlexis Hetu void Image::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) 695264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 696264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens int inputPitch = ComputeCompressedPitch(width, format); 697264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens int rows = imageSize / inputPitch; 698264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens void *buffer = lock(xoffset, yoffset, sw::LOCK_WRITEONLY); 699264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if(buffer) 701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 702264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens for(int i = 0; i < rows; i++) 703264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 704264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy((void*)((GLbyte*)buffer + i * getPitch()), (void*)((GLbyte*)pixels + i * inputPitch), inputPitch); 705264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 707264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 708264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens unlock(); 709264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 710264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}