blob: 1dc73d435e07d7d7cf2dad7a59592a79432c1165 [file] [log] [blame]
Geoff Langf9a6f082015-01-22 13:32:49 -05001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// TextureGL.cpp: Implements the class methods for TextureGL.
8
9#include "libANGLE/renderer/gl/TextureGL.h"
10
11#include "common/debug.h"
Geoff Langc05f7062015-03-10 09:50:57 -070012#include "common/utilities.h"
Jamie Madill67102f02015-03-16 10:41:42 -040013#include "libANGLE/State.h"
Geoff Langc05f7062015-03-10 09:50:57 -070014#include "libANGLE/angletypes.h"
15#include "libANGLE/formatutils.h"
16#include "libANGLE/renderer/gl/BufferGL.h"
Geoff Langfbfa47c2015-03-31 11:26:00 -040017#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Langc05f7062015-03-10 09:50:57 -070018#include "libANGLE/renderer/gl/FunctionsGL.h"
19#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Langfd216c42015-05-27 16:12:30 -040020#include "libANGLE/renderer/gl/formatutilsgl.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050021
22namespace rx
23{
24
Geoff Langc05f7062015-03-10 09:50:57 -070025static void SetUnpackStateForTexImage(StateManagerGL *stateManager, const gl::PixelUnpackState &unpack)
26{
27 const gl::Buffer *unpackBuffer = unpack.pixelBuffer.get();
28 if (unpackBuffer != nullptr)
29 {
30 UNIMPLEMENTED();
31 }
Geoff Lang5ec53c82015-06-05 16:32:14 -040032 stateManager->setPixelUnpackState(unpack.alignment, unpack.rowLength, unpack.skipRows,
33 unpack.skipPixels, unpack.imageHeight, unpack.skipImages);
Geoff Langc05f7062015-03-10 09:50:57 -070034}
35
36static bool UseTexImage2D(GLenum textureType)
37{
38 return textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP;
39}
40
41static bool UseTexImage3D(GLenum textureType)
42{
43 return textureType == GL_TEXTURE_2D_ARRAY || textureType == GL_TEXTURE_3D;
44}
45
Geoff Lang968992e2015-03-17 18:01:49 -040046static bool CompatibleTextureTarget(GLenum textureType, GLenum textureTarget)
Geoff Langc05f7062015-03-10 09:50:57 -070047{
48 if (textureType != GL_TEXTURE_CUBE_MAP)
49 {
50 return textureType == textureTarget;
51 }
52 else
53 {
Geoff Langfb2a5592015-03-20 11:25:37 -040054 return gl::IsCubeMapTextureTarget(textureTarget);
Geoff Langc05f7062015-03-10 09:50:57 -070055 }
56}
57
Geoff Lang0bcb68f2015-07-23 10:57:20 -040058static const nativegl::InternalFormat &GetNativeInternalFormat(const FunctionsGL *functions,
59 GLenum internalFormat,
60 GLenum type)
61{
62 if (functions->standard == STANDARD_GL_DESKTOP || functions->isAtLeastGLES(gl::Version(3, 0)))
63 {
64 // On Desktop GL, always use sized internal formats. Passing an internal format of
65 // GL_RGBA will generate a GL_RGBA8 texture even if the provided type is GL_FLOAT.
66 GLenum sizedFormat = gl::GetSizedInternalFormat(internalFormat, type);
67 return nativegl::GetInternalFormatInfo(sizedFormat, functions->standard);
68 }
69 else
70 {
71 return nativegl::GetInternalFormatInfo(internalFormat, functions->standard);
72 }
73}
74
Geoff Langc05f7062015-03-10 09:50:57 -070075TextureGL::TextureGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager)
76 : TextureImpl(),
77 mTextureType(type),
78 mFunctions(functions),
79 mStateManager(stateManager),
80 mAppliedSamplerState(),
81 mTextureID(0)
82{
83 ASSERT(mFunctions);
84 ASSERT(mStateManager);
85
86 mFunctions->genTextures(1, &mTextureID);
Geoff Lang90d98af2015-05-26 16:41:38 -040087 mStateManager->bindTexture(mTextureType, mTextureID);
Geoff Langc05f7062015-03-10 09:50:57 -070088}
Geoff Langf9a6f082015-01-22 13:32:49 -050089
90TextureGL::~TextureGL()
Geoff Langc05f7062015-03-10 09:50:57 -070091{
Geoff Lang1eb708e2015-05-04 14:58:23 -040092 mStateManager->deleteTexture(mTextureID);
93 mTextureID = 0;
Geoff Langc05f7062015-03-10 09:50:57 -070094}
Geoff Langf9a6f082015-01-22 13:32:49 -050095
96void TextureGL::setUsage(GLenum usage)
97{
Geoff Langc05f7062015-03-10 09:50:57 -070098 // GL_ANGLE_texture_usage not implemented for desktop GL
99 UNREACHABLE();
Geoff Langf9a6f082015-01-22 13:32:49 -0500100}
101
102gl::Error TextureGL::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &size, GLenum format, GLenum type,
103 const gl::PixelUnpackState &unpack, const uint8_t *pixels)
104{
Geoff Langfb2a5592015-03-20 11:25:37 -0400105 UNUSED_ASSERTION_VARIABLE(&CompatibleTextureTarget); // Reference this function to avoid warnings.
Geoff Lang968992e2015-03-17 18:01:49 -0400106 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700107
108 SetUnpackStateForTexImage(mStateManager, unpack);
109
Geoff Lang0bcb68f2015-07-23 10:57:20 -0400110 const nativegl::InternalFormat &nativeInternalFormatInfo =
111 GetNativeInternalFormat(mFunctions, internalFormat, type);
Geoff Langfd216c42015-05-27 16:12:30 -0400112
Geoff Langc05f7062015-03-10 09:50:57 -0700113 mStateManager->bindTexture(mTextureType, mTextureID);
114 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400115 {
Geoff Langc05f7062015-03-10 09:50:57 -0700116 ASSERT(size.depth == 1);
Geoff Langfd216c42015-05-27 16:12:30 -0400117 mFunctions->texImage2D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, 0, format, type, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700118 }
119 else if (UseTexImage3D(mTextureType))
120 {
Geoff Langfd216c42015-05-27 16:12:30 -0400121 mFunctions->texImage3D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth, 0, format, type, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700122 }
123 else
124 {
125 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400126 }
127
Geoff Langc05f7062015-03-10 09:50:57 -0700128 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500129}
130
131gl::Error TextureGL::setSubImage(GLenum target, size_t level, const gl::Box &area, GLenum format, GLenum type,
132 const gl::PixelUnpackState &unpack, const uint8_t *pixels)
133{
Geoff Lang968992e2015-03-17 18:01:49 -0400134 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700135
136 SetUnpackStateForTexImage(mStateManager, unpack);
137
138 mStateManager->bindTexture(mTextureType, mTextureID);
139 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400140 {
Geoff Langc05f7062015-03-10 09:50:57 -0700141 ASSERT(area.z == 0 && area.depth == 1);
142 mFunctions->texSubImage2D(target, level, area.x, area.y, area.width, area.height, format, type, pixels);
143 }
144 else if (UseTexImage3D(mTextureType))
145 {
146 mFunctions->texSubImage3D(target, level, area.x, area.y, area.z, area.width, area.height, area.depth,
147 format, type, pixels);
148 }
149 else
150 {
151 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400152 }
153
Geoff Langc05f7062015-03-10 09:50:57 -0700154 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500155}
156
157gl::Error TextureGL::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &size,
Geoff Lang8509d862015-05-20 14:06:13 -0400158 const gl::PixelUnpackState &unpack, size_t imageSize, const uint8_t *pixels)
Geoff Langf9a6f082015-01-22 13:32:49 -0500159{
Geoff Lang968992e2015-03-17 18:01:49 -0400160 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700161
162 SetUnpackStateForTexImage(mStateManager, unpack);
163
Geoff Lang0bcb68f2015-07-23 10:57:20 -0400164 const nativegl::InternalFormat &nativeInternalFormatInfo =
165 GetNativeInternalFormat(mFunctions, internalFormat, GL_UNSIGNED_BYTE);
Geoff Langfd216c42015-05-27 16:12:30 -0400166
Geoff Langc05f7062015-03-10 09:50:57 -0700167 mStateManager->bindTexture(mTextureType, mTextureID);
168 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400169 {
Geoff Langc05f7062015-03-10 09:50:57 -0700170 ASSERT(size.depth == 1);
Geoff Langfd216c42015-05-27 16:12:30 -0400171 mFunctions->compressedTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, 0, imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700172 }
173 else if (UseTexImage3D(mTextureType))
174 {
Geoff Langfd216c42015-05-27 16:12:30 -0400175 mFunctions->compressedTexImage3D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth, 0,
Geoff Lang8509d862015-05-20 14:06:13 -0400176 imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700177 }
178 else
179 {
180 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400181 }
182
Geoff Langc05f7062015-03-10 09:50:57 -0700183 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500184}
185
186gl::Error TextureGL::setCompressedSubImage(GLenum target, size_t level, const gl::Box &area, GLenum format,
Geoff Lang8509d862015-05-20 14:06:13 -0400187 const gl::PixelUnpackState &unpack, size_t imageSize, const uint8_t *pixels)
Geoff Langf9a6f082015-01-22 13:32:49 -0500188{
Geoff Lang968992e2015-03-17 18:01:49 -0400189 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700190
191 SetUnpackStateForTexImage(mStateManager, unpack);
192
Geoff Langc05f7062015-03-10 09:50:57 -0700193 mStateManager->bindTexture(mTextureType, mTextureID);
194 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400195 {
Geoff Langc05f7062015-03-10 09:50:57 -0700196 ASSERT(area.z == 0 && area.depth == 1);
Geoff Lang0bcb68f2015-07-23 10:57:20 -0400197 mFunctions->compressedTexSubImage2D(target, level, area.x, area.y, area.width, area.height,
198 format, imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700199 }
200 else if (UseTexImage3D(mTextureType))
201 {
Geoff Lang0bcb68f2015-07-23 10:57:20 -0400202 mFunctions->compressedTexSubImage3D(target, level, area.x, area.y, area.z, area.width,
203 area.height, area.depth, format, imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700204 }
205 else
206 {
207 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400208 }
209
Geoff Langc05f7062015-03-10 09:50:57 -0700210 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500211}
212
213gl::Error TextureGL::copyImage(GLenum target, size_t level, const gl::Rectangle &sourceArea, GLenum internalFormat,
214 const gl::Framebuffer *source)
215{
Geoff Lang0bcb68f2015-07-23 10:57:20 -0400216 const nativegl::InternalFormat &nativeInternalFormatInfo = GetNativeInternalFormat(
217 mFunctions, internalFormat, source->getImplementationColorReadType());
Geoff Langfd216c42015-05-27 16:12:30 -0400218
Geoff Langfbfa47c2015-03-31 11:26:00 -0400219 const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
220
221 mStateManager->bindTexture(mTextureType, mTextureID);
222 mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
223
224 if (UseTexImage2D(mTextureType))
225 {
Geoff Langfd216c42015-05-27 16:12:30 -0400226 mFunctions->copyTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, sourceArea.x, sourceArea.y,
Geoff Langfbfa47c2015-03-31 11:26:00 -0400227 sourceArea.width, sourceArea.height, 0);
228 }
229 else
230 {
231 UNREACHABLE();
232 }
233
234 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500235}
236
237gl::Error TextureGL::copySubImage(GLenum target, size_t level, const gl::Offset &destOffset, const gl::Rectangle &sourceArea,
238 const gl::Framebuffer *source)
239{
Geoff Langfbfa47c2015-03-31 11:26:00 -0400240 const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
241
242 mStateManager->bindTexture(mTextureType, mTextureID);
243 mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
244
245 if (UseTexImage2D(mTextureType))
246 {
247 ASSERT(destOffset.z == 0);
248 mFunctions->copyTexSubImage2D(target, level, destOffset.x, destOffset.y,
249 sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
250 }
251 else if (UseTexImage3D(mTextureType))
252 {
253 mFunctions->copyTexSubImage3D(target, level, destOffset.x, destOffset.y, destOffset.z,
254 sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
255 }
256 else
257 {
258 UNREACHABLE();
259 }
260
261 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500262}
263
264gl::Error TextureGL::setStorage(GLenum target, size_t levels, GLenum internalFormat, const gl::Extents &size)
265{
Geoff Langc05f7062015-03-10 09:50:57 -0700266 // TODO: emulate texture storage with TexImage calls if on GL version <4.2 or the
267 // ARB_texture_storage extension is not available.
268
Geoff Langfd216c42015-05-27 16:12:30 -0400269 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalFormat, mFunctions->standard);
270
Geoff Langc05f7062015-03-10 09:50:57 -0700271 mStateManager->bindTexture(mTextureType, mTextureID);
272 if (UseTexImage2D(mTextureType))
273 {
274 ASSERT(size.depth == 1);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400275 if (mFunctions->texStorage2D)
276 {
Geoff Langfd216c42015-05-27 16:12:30 -0400277 mFunctions->texStorage2D(target, levels, nativeInternalFormatInfo.internalFormat, size.width, size.height);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400278 }
279 else
280 {
281 // Make sure no pixel unpack buffer is bound
282 mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
283
284 const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
285
286 // Internal format must be sized
287 ASSERT(internalFormatInfo.pixelBytes != 0);
288
289 for (size_t level = 0; level < levels; level++)
290 {
291 gl::Extents levelSize(std::max(size.width >> level, 1),
292 std::max(size.height >> level, 1),
293 1);
294
295 if (mTextureType == GL_TEXTURE_2D)
296 {
Geoff Lang42c98f62015-05-20 14:09:25 -0400297 if (internalFormatInfo.compressed)
298 {
299 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
Geoff Langfd216c42015-05-27 16:12:30 -0400300 mFunctions->compressedTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400301 0, dataSize, nullptr);
302 }
303 else
304 {
Geoff Langfd216c42015-05-27 16:12:30 -0400305 mFunctions->texImage2D(target, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400306 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
307 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400308 }
309 else if (mTextureType == GL_TEXTURE_CUBE_MAP)
310 {
311 for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget; face++)
312 {
Geoff Lang42c98f62015-05-20 14:09:25 -0400313 if (internalFormatInfo.compressed)
314 {
315 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
Geoff Langfd216c42015-05-27 16:12:30 -0400316 mFunctions->compressedTexImage2D(face, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400317 0, dataSize, nullptr);
318 }
319 else
320 {
Geoff Langfd216c42015-05-27 16:12:30 -0400321 mFunctions->texImage2D(face, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400322 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
323 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400324 }
325 }
326 else
327 {
328 UNREACHABLE();
329 }
330 }
331 }
Geoff Langc05f7062015-03-10 09:50:57 -0700332 }
333 else if (UseTexImage3D(mTextureType))
334 {
Geoff Lang1c0ad622015-03-24 10:27:45 -0400335 if (mFunctions->texStorage3D)
336 {
Geoff Langfd216c42015-05-27 16:12:30 -0400337 mFunctions->texStorage3D(target, levels, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400338 }
339 else
340 {
341 // Make sure no pixel unpack buffer is bound
342 mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
343
344 const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
345
346 // Internal format must be sized
347 ASSERT(internalFormatInfo.pixelBytes != 0);
348
349 for (size_t i = 0; i < levels; i++)
350 {
351 gl::Extents levelSize(std::max(size.width >> i, 1),
352 std::max(size.height >> i, 1),
353 mTextureType == GL_TEXTURE_3D ? std::max(size.depth >> i, 1) : size.depth);
354
Geoff Lang42c98f62015-05-20 14:09:25 -0400355 if (internalFormatInfo.compressed)
356 {
357 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height) * levelSize.depth;
Geoff Langfd216c42015-05-27 16:12:30 -0400358 mFunctions->compressedTexImage3D(target, i, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height, levelSize.depth,
Geoff Lang42c98f62015-05-20 14:09:25 -0400359 0, dataSize, nullptr);
360 }
361 else
362 {
Geoff Langfd216c42015-05-27 16:12:30 -0400363 mFunctions->texImage3D(target, i, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height, levelSize.depth,
Geoff Lang42c98f62015-05-20 14:09:25 -0400364 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
365 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400366 }
367 }
Geoff Langc05f7062015-03-10 09:50:57 -0700368 }
369 else
370 {
371 UNREACHABLE();
372 }
373
374 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500375}
376
Gregoire Payen de La Garanderie752ce192015-04-14 11:11:12 +0100377gl::Error TextureGL::generateMipmaps(const gl::SamplerState &samplerState)
Geoff Langf9a6f082015-01-22 13:32:49 -0500378{
Geoff Langc05f7062015-03-10 09:50:57 -0700379 mStateManager->bindTexture(mTextureType, mTextureID);
380 mFunctions->generateMipmap(mTextureType);
381 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500382}
383
384void TextureGL::bindTexImage(egl::Surface *surface)
385{
Geoff Lang03053202015-04-09 11:21:13 -0400386 ASSERT(mTextureType == GL_TEXTURE_2D);
387
388 // Make sure this texture is bound
389 mStateManager->bindTexture(mTextureType, mTextureID);
Geoff Langf9a6f082015-01-22 13:32:49 -0500390}
391
392void TextureGL::releaseTexImage()
393{
Geoff Lang03053202015-04-09 11:21:13 -0400394 // Not all Surface implementations reset the size of mip 0 when releasing, do it manually
395 ASSERT(mTextureType == GL_TEXTURE_2D);
396
397 mStateManager->bindTexture(mTextureType, mTextureID);
398 if (UseTexImage2D(mTextureType))
399 {
400 mFunctions->texImage2D(mTextureType, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
401 }
402 else
403 {
404 UNREACHABLE();
405 }
Geoff Langf9a6f082015-01-22 13:32:49 -0500406}
407
Geoff Langc05f7062015-03-10 09:50:57 -0700408template <typename T>
409static inline void SyncSamplerStateMember(const FunctionsGL *functions, const gl::SamplerState &newState,
410 gl::SamplerState &curState, GLenum textureType, GLenum name,
411 T(gl::SamplerState::*samplerMember))
412{
413 if (curState.*samplerMember != newState.*samplerMember)
414 {
415 curState.*samplerMember = newState.*samplerMember;
Minmin Gong794e0002015-04-07 18:31:54 -0700416 functions->texParameterf(textureType, name, static_cast<GLfloat>(curState.*samplerMember));
Geoff Langc05f7062015-03-10 09:50:57 -0700417 }
418}
419
420void TextureGL::syncSamplerState(const gl::SamplerState &samplerState) const
421{
422 if (mAppliedSamplerState != samplerState)
423 {
424 mStateManager->bindTexture(mTextureType, mTextureID);
425 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_FILTER, &gl::SamplerState::minFilter);
426 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAG_FILTER, &gl::SamplerState::magFilter);
427 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_S, &gl::SamplerState::wrapS);
428 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_T, &gl::SamplerState::wrapT);
429 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_R, &gl::SamplerState::wrapR);
430 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_ANISOTROPY_EXT, &gl::SamplerState::maxAnisotropy);
431 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_BASE_LEVEL, &gl::SamplerState::baseLevel);
432 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LEVEL, &gl::SamplerState::maxLevel);
433 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_LOD, &gl::SamplerState::minLod);
434 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LOD, &gl::SamplerState::maxLod);
435 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_MODE, &gl::SamplerState::compareMode);
436 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_FUNC, &gl::SamplerState::compareFunc);
437 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_R, &gl::SamplerState::swizzleRed);
438 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_G, &gl::SamplerState::swizzleGreen);
439 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_B, &gl::SamplerState::swizzleBlue);
440 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_A, &gl::SamplerState::swizzleAlpha);
441 }
442}
443
444GLuint TextureGL::getTextureID() const
445{
446 return mTextureID;
447}
448
Geoff Langf9a6f082015-01-22 13:32:49 -0500449}