blob: 70392a7ddad44767d94441d54e37ef16ed2cec9a [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
58TextureGL::TextureGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager)
59 : TextureImpl(),
60 mTextureType(type),
61 mFunctions(functions),
62 mStateManager(stateManager),
63 mAppliedSamplerState(),
64 mTextureID(0)
65{
66 ASSERT(mFunctions);
67 ASSERT(mStateManager);
68
69 mFunctions->genTextures(1, &mTextureID);
Geoff Lang90d98af2015-05-26 16:41:38 -040070 mStateManager->bindTexture(mTextureType, mTextureID);
Geoff Langc05f7062015-03-10 09:50:57 -070071}
Geoff Langf9a6f082015-01-22 13:32:49 -050072
73TextureGL::~TextureGL()
Geoff Langc05f7062015-03-10 09:50:57 -070074{
Geoff Lang1eb708e2015-05-04 14:58:23 -040075 mStateManager->deleteTexture(mTextureID);
76 mTextureID = 0;
Geoff Langc05f7062015-03-10 09:50:57 -070077}
Geoff Langf9a6f082015-01-22 13:32:49 -050078
79void TextureGL::setUsage(GLenum usage)
80{
Geoff Langc05f7062015-03-10 09:50:57 -070081 // GL_ANGLE_texture_usage not implemented for desktop GL
82 UNREACHABLE();
Geoff Langf9a6f082015-01-22 13:32:49 -050083}
84
85gl::Error TextureGL::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &size, GLenum format, GLenum type,
86 const gl::PixelUnpackState &unpack, const uint8_t *pixels)
87{
Geoff Langfb2a5592015-03-20 11:25:37 -040088 UNUSED_ASSERTION_VARIABLE(&CompatibleTextureTarget); // Reference this function to avoid warnings.
Geoff Lang968992e2015-03-17 18:01:49 -040089 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -070090
91 SetUnpackStateForTexImage(mStateManager, unpack);
92
Geoff Lang5e7f5c92015-07-25 13:52:51 +000093 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalFormat, mFunctions->standard);
Geoff Langfd216c42015-05-27 16:12:30 -040094
Geoff Langc05f7062015-03-10 09:50:57 -070095 mStateManager->bindTexture(mTextureType, mTextureID);
96 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -040097 {
Geoff Langc05f7062015-03-10 09:50:57 -070098 ASSERT(size.depth == 1);
Geoff Langfd216c42015-05-27 16:12:30 -040099 mFunctions->texImage2D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, 0, format, type, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700100 }
101 else if (UseTexImage3D(mTextureType))
102 {
Geoff Langfd216c42015-05-27 16:12:30 -0400103 mFunctions->texImage3D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth, 0, format, type, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700104 }
105 else
106 {
107 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400108 }
109
Geoff Langc05f7062015-03-10 09:50:57 -0700110 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500111}
112
113gl::Error TextureGL::setSubImage(GLenum target, size_t level, const gl::Box &area, GLenum format, GLenum type,
114 const gl::PixelUnpackState &unpack, const uint8_t *pixels)
115{
Geoff Lang968992e2015-03-17 18:01:49 -0400116 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700117
118 SetUnpackStateForTexImage(mStateManager, unpack);
119
120 mStateManager->bindTexture(mTextureType, mTextureID);
121 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400122 {
Geoff Langc05f7062015-03-10 09:50:57 -0700123 ASSERT(area.z == 0 && area.depth == 1);
124 mFunctions->texSubImage2D(target, level, area.x, area.y, area.width, area.height, format, type, pixels);
125 }
126 else if (UseTexImage3D(mTextureType))
127 {
128 mFunctions->texSubImage3D(target, level, area.x, area.y, area.z, area.width, area.height, area.depth,
129 format, type, pixels);
130 }
131 else
132 {
133 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400134 }
135
Geoff Langc05f7062015-03-10 09:50:57 -0700136 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500137}
138
139gl::Error TextureGL::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &size,
Geoff Lang8509d862015-05-20 14:06:13 -0400140 const gl::PixelUnpackState &unpack, size_t imageSize, const uint8_t *pixels)
Geoff Langf9a6f082015-01-22 13:32:49 -0500141{
Geoff Lang968992e2015-03-17 18:01:49 -0400142 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700143
144 SetUnpackStateForTexImage(mStateManager, unpack);
145
Geoff Lang5e7f5c92015-07-25 13:52:51 +0000146 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalFormat, mFunctions->standard);
Geoff Langfd216c42015-05-27 16:12:30 -0400147
Geoff Langc05f7062015-03-10 09:50:57 -0700148 mStateManager->bindTexture(mTextureType, mTextureID);
149 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400150 {
Geoff Langc05f7062015-03-10 09:50:57 -0700151 ASSERT(size.depth == 1);
Geoff Langfd216c42015-05-27 16:12:30 -0400152 mFunctions->compressedTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, 0, imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700153 }
154 else if (UseTexImage3D(mTextureType))
155 {
Geoff Langfd216c42015-05-27 16:12:30 -0400156 mFunctions->compressedTexImage3D(target, level, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth, 0,
Geoff Lang8509d862015-05-20 14:06:13 -0400157 imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700158 }
159 else
160 {
161 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400162 }
163
Geoff Langc05f7062015-03-10 09:50:57 -0700164 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500165}
166
167gl::Error TextureGL::setCompressedSubImage(GLenum target, size_t level, const gl::Box &area, GLenum format,
Geoff Lang8509d862015-05-20 14:06:13 -0400168 const gl::PixelUnpackState &unpack, size_t imageSize, const uint8_t *pixels)
Geoff Langf9a6f082015-01-22 13:32:49 -0500169{
Geoff Lang968992e2015-03-17 18:01:49 -0400170 ASSERT(CompatibleTextureTarget(mTextureType, target));
Geoff Langc05f7062015-03-10 09:50:57 -0700171
172 SetUnpackStateForTexImage(mStateManager, unpack);
173
Geoff Lang5e7f5c92015-07-25 13:52:51 +0000174 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(format, mFunctions->standard);
175
Geoff Langc05f7062015-03-10 09:50:57 -0700176 mStateManager->bindTexture(mTextureType, mTextureID);
177 if (UseTexImage2D(mTextureType))
Jamie Madill67102f02015-03-16 10:41:42 -0400178 {
Geoff Langc05f7062015-03-10 09:50:57 -0700179 ASSERT(area.z == 0 && area.depth == 1);
Geoff Lang5e7f5c92015-07-25 13:52:51 +0000180 mFunctions->compressedTexSubImage2D(target, level, area.x, area.y, area.width, area.height, nativeInternalFormatInfo.internalFormat, imageSize,
181 pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700182 }
183 else if (UseTexImage3D(mTextureType))
184 {
Geoff Lang5e7f5c92015-07-25 13:52:51 +0000185 mFunctions->compressedTexSubImage3D(target, level, area.x, area.y, area.z, area.width, area.height, area.depth,
186 nativeInternalFormatInfo.internalFormat, imageSize, pixels);
Geoff Langc05f7062015-03-10 09:50:57 -0700187 }
188 else
189 {
190 UNREACHABLE();
Jamie Madill67102f02015-03-16 10:41:42 -0400191 }
192
Geoff Langc05f7062015-03-10 09:50:57 -0700193 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500194}
195
196gl::Error TextureGL::copyImage(GLenum target, size_t level, const gl::Rectangle &sourceArea, GLenum internalFormat,
197 const gl::Framebuffer *source)
198{
Geoff Lang5e7f5c92015-07-25 13:52:51 +0000199 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalFormat, mFunctions->standard);
Geoff Langfd216c42015-05-27 16:12:30 -0400200
Geoff Langfbfa47c2015-03-31 11:26:00 -0400201 const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
202
203 mStateManager->bindTexture(mTextureType, mTextureID);
204 mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
205
206 if (UseTexImage2D(mTextureType))
207 {
Geoff Langfd216c42015-05-27 16:12:30 -0400208 mFunctions->copyTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, sourceArea.x, sourceArea.y,
Geoff Langfbfa47c2015-03-31 11:26:00 -0400209 sourceArea.width, sourceArea.height, 0);
210 }
211 else
212 {
213 UNREACHABLE();
214 }
215
216 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500217}
218
219gl::Error TextureGL::copySubImage(GLenum target, size_t level, const gl::Offset &destOffset, const gl::Rectangle &sourceArea,
220 const gl::Framebuffer *source)
221{
Geoff Langfbfa47c2015-03-31 11:26:00 -0400222 const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
223
224 mStateManager->bindTexture(mTextureType, mTextureID);
225 mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
226
227 if (UseTexImage2D(mTextureType))
228 {
229 ASSERT(destOffset.z == 0);
230 mFunctions->copyTexSubImage2D(target, level, destOffset.x, destOffset.y,
231 sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
232 }
233 else if (UseTexImage3D(mTextureType))
234 {
235 mFunctions->copyTexSubImage3D(target, level, destOffset.x, destOffset.y, destOffset.z,
236 sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
237 }
238 else
239 {
240 UNREACHABLE();
241 }
242
243 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500244}
245
246gl::Error TextureGL::setStorage(GLenum target, size_t levels, GLenum internalFormat, const gl::Extents &size)
247{
Geoff Langc05f7062015-03-10 09:50:57 -0700248 // TODO: emulate texture storage with TexImage calls if on GL version <4.2 or the
249 // ARB_texture_storage extension is not available.
250
Geoff Langfd216c42015-05-27 16:12:30 -0400251 const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalFormat, mFunctions->standard);
252
Geoff Langc05f7062015-03-10 09:50:57 -0700253 mStateManager->bindTexture(mTextureType, mTextureID);
254 if (UseTexImage2D(mTextureType))
255 {
256 ASSERT(size.depth == 1);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400257 if (mFunctions->texStorage2D)
258 {
Geoff Langfd216c42015-05-27 16:12:30 -0400259 mFunctions->texStorage2D(target, levels, nativeInternalFormatInfo.internalFormat, size.width, size.height);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400260 }
261 else
262 {
263 // Make sure no pixel unpack buffer is bound
264 mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
265
266 const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
267
268 // Internal format must be sized
269 ASSERT(internalFormatInfo.pixelBytes != 0);
270
271 for (size_t level = 0; level < levels; level++)
272 {
273 gl::Extents levelSize(std::max(size.width >> level, 1),
274 std::max(size.height >> level, 1),
275 1);
276
277 if (mTextureType == GL_TEXTURE_2D)
278 {
Geoff Lang42c98f62015-05-20 14:09:25 -0400279 if (internalFormatInfo.compressed)
280 {
281 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
Geoff Langfd216c42015-05-27 16:12:30 -0400282 mFunctions->compressedTexImage2D(target, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400283 0, dataSize, nullptr);
284 }
285 else
286 {
Geoff Langfd216c42015-05-27 16:12:30 -0400287 mFunctions->texImage2D(target, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400288 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
289 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400290 }
291 else if (mTextureType == GL_TEXTURE_CUBE_MAP)
292 {
293 for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget; face++)
294 {
Geoff Lang42c98f62015-05-20 14:09:25 -0400295 if (internalFormatInfo.compressed)
296 {
297 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
Geoff Langfd216c42015-05-27 16:12:30 -0400298 mFunctions->compressedTexImage2D(face, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400299 0, dataSize, nullptr);
300 }
301 else
302 {
Geoff Langfd216c42015-05-27 16:12:30 -0400303 mFunctions->texImage2D(face, level, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height,
Geoff Lang42c98f62015-05-20 14:09:25 -0400304 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
305 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400306 }
307 }
308 else
309 {
310 UNREACHABLE();
311 }
312 }
313 }
Geoff Langc05f7062015-03-10 09:50:57 -0700314 }
315 else if (UseTexImage3D(mTextureType))
316 {
Geoff Lang1c0ad622015-03-24 10:27:45 -0400317 if (mFunctions->texStorage3D)
318 {
Geoff Langfd216c42015-05-27 16:12:30 -0400319 mFunctions->texStorage3D(target, levels, nativeInternalFormatInfo.internalFormat, size.width, size.height, size.depth);
Geoff Lang1c0ad622015-03-24 10:27:45 -0400320 }
321 else
322 {
323 // Make sure no pixel unpack buffer is bound
324 mStateManager->bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
325
326 const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
327
328 // Internal format must be sized
329 ASSERT(internalFormatInfo.pixelBytes != 0);
330
331 for (size_t i = 0; i < levels; i++)
332 {
333 gl::Extents levelSize(std::max(size.width >> i, 1),
334 std::max(size.height >> i, 1),
335 mTextureType == GL_TEXTURE_3D ? std::max(size.depth >> i, 1) : size.depth);
336
Geoff Lang42c98f62015-05-20 14:09:25 -0400337 if (internalFormatInfo.compressed)
338 {
339 size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height) * levelSize.depth;
Geoff Langfd216c42015-05-27 16:12:30 -0400340 mFunctions->compressedTexImage3D(target, i, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height, levelSize.depth,
Geoff Lang42c98f62015-05-20 14:09:25 -0400341 0, dataSize, nullptr);
342 }
343 else
344 {
Geoff Langfd216c42015-05-27 16:12:30 -0400345 mFunctions->texImage3D(target, i, nativeInternalFormatInfo.internalFormat, levelSize.width, levelSize.height, levelSize.depth,
Geoff Lang42c98f62015-05-20 14:09:25 -0400346 0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
347 }
Geoff Lang1c0ad622015-03-24 10:27:45 -0400348 }
349 }
Geoff Langc05f7062015-03-10 09:50:57 -0700350 }
351 else
352 {
353 UNREACHABLE();
354 }
355
356 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500357}
358
Gregoire Payen de La Garanderie752ce192015-04-14 11:11:12 +0100359gl::Error TextureGL::generateMipmaps(const gl::SamplerState &samplerState)
Geoff Langf9a6f082015-01-22 13:32:49 -0500360{
Geoff Langc05f7062015-03-10 09:50:57 -0700361 mStateManager->bindTexture(mTextureType, mTextureID);
362 mFunctions->generateMipmap(mTextureType);
363 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500364}
365
366void TextureGL::bindTexImage(egl::Surface *surface)
367{
Geoff Lang03053202015-04-09 11:21:13 -0400368 ASSERT(mTextureType == GL_TEXTURE_2D);
369
370 // Make sure this texture is bound
371 mStateManager->bindTexture(mTextureType, mTextureID);
Geoff Langf9a6f082015-01-22 13:32:49 -0500372}
373
374void TextureGL::releaseTexImage()
375{
Geoff Lang03053202015-04-09 11:21:13 -0400376 // Not all Surface implementations reset the size of mip 0 when releasing, do it manually
377 ASSERT(mTextureType == GL_TEXTURE_2D);
378
379 mStateManager->bindTexture(mTextureType, mTextureID);
380 if (UseTexImage2D(mTextureType))
381 {
382 mFunctions->texImage2D(mTextureType, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
383 }
384 else
385 {
386 UNREACHABLE();
387 }
Geoff Langf9a6f082015-01-22 13:32:49 -0500388}
389
Geoff Langc05f7062015-03-10 09:50:57 -0700390template <typename T>
391static inline void SyncSamplerStateMember(const FunctionsGL *functions, const gl::SamplerState &newState,
392 gl::SamplerState &curState, GLenum textureType, GLenum name,
393 T(gl::SamplerState::*samplerMember))
394{
395 if (curState.*samplerMember != newState.*samplerMember)
396 {
397 curState.*samplerMember = newState.*samplerMember;
Minmin Gong794e0002015-04-07 18:31:54 -0700398 functions->texParameterf(textureType, name, static_cast<GLfloat>(curState.*samplerMember));
Geoff Langc05f7062015-03-10 09:50:57 -0700399 }
400}
401
402void TextureGL::syncSamplerState(const gl::SamplerState &samplerState) const
403{
404 if (mAppliedSamplerState != samplerState)
405 {
406 mStateManager->bindTexture(mTextureType, mTextureID);
407 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_FILTER, &gl::SamplerState::minFilter);
408 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAG_FILTER, &gl::SamplerState::magFilter);
409 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_S, &gl::SamplerState::wrapS);
410 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_T, &gl::SamplerState::wrapT);
411 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_R, &gl::SamplerState::wrapR);
412 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_ANISOTROPY_EXT, &gl::SamplerState::maxAnisotropy);
413 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_BASE_LEVEL, &gl::SamplerState::baseLevel);
414 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LEVEL, &gl::SamplerState::maxLevel);
415 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_LOD, &gl::SamplerState::minLod);
416 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LOD, &gl::SamplerState::maxLod);
417 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_MODE, &gl::SamplerState::compareMode);
418 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_FUNC, &gl::SamplerState::compareFunc);
419 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_R, &gl::SamplerState::swizzleRed);
420 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_G, &gl::SamplerState::swizzleGreen);
421 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_B, &gl::SamplerState::swizzleBlue);
422 SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_A, &gl::SamplerState::swizzleAlpha);
423 }
424}
425
426GLuint TextureGL::getTextureID() const
427{
428 return mTextureID;
429}
430
Geoff Langf9a6f082015-01-22 13:32:49 -0500431}