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}