OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gl/gl_image_memory.h" | 5 #include "ui/gl/gl_image_memory.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
9 #include "ui/gl/gl_bindings.h" | 9 #include "ui/gl/gl_bindings.h" |
10 #include "ui/gl/scoped_binders.h" | 10 #include "ui/gl/scoped_binders.h" |
11 | 11 |
12 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ | 12 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ |
13 defined(USE_OZONE) | 13 defined(USE_OZONE) |
14 #include "ui/gl/gl_surface_egl.h" | 14 #include "ui/gl/gl_surface_egl.h" |
15 #endif | 15 #endif |
16 | 16 |
17 namespace gfx { | 17 namespace gfx { |
18 namespace { | 18 namespace { |
19 | 19 |
20 bool ValidInternalFormat(unsigned internalformat) { | 20 bool ValidateFormats(gfx::GpuMemoryBuffer::Format format, |
reveman
2015/04/01 13:14:33
Please make this function consistent with the gl_i
Daniele Castagna
2015/04/01 21:58:34
Done.
| |
21 switch (internalformat) { | 21 unsigned internalformat) { |
22 case GL_RGBA: | |
23 return true; | |
24 default: | |
25 return false; | |
26 } | |
27 } | |
28 | |
29 bool ValidFormat(gfx::GpuMemoryBuffer::Format format) { | |
30 switch (format) { | 22 switch (format) { |
31 case gfx::GpuMemoryBuffer::ATC: | 23 case gfx::GpuMemoryBuffer::ATC: |
32 case gfx::GpuMemoryBuffer::ATCIA: | 24 case gfx::GpuMemoryBuffer::ATCIA: |
33 case gfx::GpuMemoryBuffer::DXT1: | 25 case gfx::GpuMemoryBuffer::DXT1: |
34 case gfx::GpuMemoryBuffer::DXT5: | 26 case gfx::GpuMemoryBuffer::DXT5: |
35 case gfx::GpuMemoryBuffer::ETC1: | 27 case gfx::GpuMemoryBuffer::ETC1: |
36 case gfx::GpuMemoryBuffer::RGBA_8888: | 28 case gfx::GpuMemoryBuffer::RGBA_8888: |
37 case gfx::GpuMemoryBuffer::BGRA_8888: | 29 case gfx::GpuMemoryBuffer::BGRA_8888: |
30 if (internalformat != GL_RGBA) { | |
31 LOG(ERROR) << "Invalid internal format " << internalformat | |
32 << "for the specified format: " << format; | |
33 return false; | |
34 } | |
35 return true; | |
36 case gfx::GpuMemoryBuffer::R_8: | |
37 if (internalformat != GL_LUMINANCE && internalformat != GL_R8) { | |
38 LOG(ERROR) << "Invalid internal format " << internalformat | |
39 << "for the specified format: " << format; | |
40 } | |
38 return true; | 41 return true; |
39 case gfx::GpuMemoryBuffer::RGBX_8888: | 42 case gfx::GpuMemoryBuffer::RGBX_8888: |
43 LOG(ERROR) << "Invalid format: " << format; | |
40 return false; | 44 return false; |
41 } | 45 } |
42 | |
43 NOTREACHED(); | 46 NOTREACHED(); |
44 return false; | 47 return false; |
45 } | 48 } |
46 | 49 |
47 bool IsCompressedFormat(gfx::GpuMemoryBuffer::Format format) { | 50 bool IsCompressedFormat(gfx::GpuMemoryBuffer::Format format) { |
48 switch (format) { | 51 switch (format) { |
49 case gfx::GpuMemoryBuffer::ATC: | 52 case gfx::GpuMemoryBuffer::ATC: |
50 case gfx::GpuMemoryBuffer::ATCIA: | 53 case gfx::GpuMemoryBuffer::ATCIA: |
51 case gfx::GpuMemoryBuffer::DXT1: | 54 case gfx::GpuMemoryBuffer::DXT1: |
52 case gfx::GpuMemoryBuffer::DXT5: | 55 case gfx::GpuMemoryBuffer::DXT5: |
53 case gfx::GpuMemoryBuffer::ETC1: | 56 case gfx::GpuMemoryBuffer::ETC1: |
54 return true; | 57 return true; |
58 case gfx::GpuMemoryBuffer::R_8: | |
55 case gfx::GpuMemoryBuffer::RGBA_8888: | 59 case gfx::GpuMemoryBuffer::RGBA_8888: |
56 case gfx::GpuMemoryBuffer::BGRA_8888: | 60 case gfx::GpuMemoryBuffer::BGRA_8888: |
57 case gfx::GpuMemoryBuffer::RGBX_8888: | 61 case gfx::GpuMemoryBuffer::RGBX_8888: |
58 return false; | 62 return false; |
59 } | 63 } |
60 | 64 |
61 NOTREACHED(); | 65 NOTREACHED(); |
62 return false; | 66 return false; |
63 } | 67 } |
64 | 68 |
65 GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format) { | 69 GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format, |
70 unsigned internalformat) { | |
66 switch (format) { | 71 switch (format) { |
reveman
2015/04/01 13:14:33
can you move this switch (format) statement into a
Daniele Castagna
2015/04/01 21:58:34
Split in two functions TextureFormat and InternalT
| |
67 case gfx::GpuMemoryBuffer::ATC: | 72 case gfx::GpuMemoryBuffer::ATC: |
68 return GL_ATC_RGB_AMD; | 73 return GL_ATC_RGB_AMD; |
69 case gfx::GpuMemoryBuffer::ATCIA: | 74 case gfx::GpuMemoryBuffer::ATCIA: |
70 return GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD; | 75 return GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD; |
71 case gfx::GpuMemoryBuffer::DXT1: | 76 case gfx::GpuMemoryBuffer::DXT1: |
72 return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; | 77 return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; |
73 case gfx::GpuMemoryBuffer::DXT5: | 78 case gfx::GpuMemoryBuffer::DXT5: |
74 return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; | 79 return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; |
75 case gfx::GpuMemoryBuffer::ETC1: | 80 case gfx::GpuMemoryBuffer::ETC1: |
76 return GL_ETC1_RGB8_OES; | 81 return GL_ETC1_RGB8_OES; |
82 case gfx::GpuMemoryBuffer::R_8: | |
83 DCHECK(internalformat == GL_R8 || internalformat == GL_LUMINANCE); | |
84 return internalformat; | |
77 case gfx::GpuMemoryBuffer::RGBA_8888: | 85 case gfx::GpuMemoryBuffer::RGBA_8888: |
78 return GL_RGBA; | 86 return GL_RGBA; |
79 case gfx::GpuMemoryBuffer::BGRA_8888: | 87 case gfx::GpuMemoryBuffer::BGRA_8888: |
80 return GL_BGRA_EXT; | 88 return GL_BGRA_EXT; |
81 case gfx::GpuMemoryBuffer::RGBX_8888: | 89 case gfx::GpuMemoryBuffer::RGBX_8888: |
82 NOTREACHED(); | 90 NOTREACHED(); |
83 return 0; | 91 return 0; |
84 } | 92 } |
85 | 93 |
86 NOTREACHED(); | 94 NOTREACHED(); |
87 return 0; | 95 return 0; |
88 } | 96 } |
89 | 97 |
90 GLenum DataFormat(gfx::GpuMemoryBuffer::Format format) { | 98 GLenum DataFormat(gfx::GpuMemoryBuffer::Format format, |
91 return TextureFormat(format); | 99 unsigned internalformat) { |
reveman
2015/04/01 13:14:33
hm, I'm not a fan of passing internalformat to thi
Daniele Castagna
2015/04/01 21:58:35
I'm afraid DataFormat needs to know about internal
| |
100 GLenum data_format = TextureFormat(format, internalformat); | |
101 return data_format == GL_R8 ? GL_RED : data_format; | |
92 } | 102 } |
93 | 103 |
94 GLenum DataType(gfx::GpuMemoryBuffer::Format format) { | 104 GLenum DataType(gfx::GpuMemoryBuffer::Format format) { |
95 switch (format) { | 105 switch (format) { |
96 case gfx::GpuMemoryBuffer::RGBA_8888: | 106 case gfx::GpuMemoryBuffer::RGBA_8888: |
97 case gfx::GpuMemoryBuffer::BGRA_8888: | 107 case gfx::GpuMemoryBuffer::BGRA_8888: |
108 case gfx::GpuMemoryBuffer::R_8: | |
98 return GL_UNSIGNED_BYTE; | 109 return GL_UNSIGNED_BYTE; |
99 case gfx::GpuMemoryBuffer::ATC: | 110 case gfx::GpuMemoryBuffer::ATC: |
100 case gfx::GpuMemoryBuffer::ATCIA: | 111 case gfx::GpuMemoryBuffer::ATCIA: |
101 case gfx::GpuMemoryBuffer::DXT1: | 112 case gfx::GpuMemoryBuffer::DXT1: |
102 case gfx::GpuMemoryBuffer::DXT5: | 113 case gfx::GpuMemoryBuffer::DXT5: |
103 case gfx::GpuMemoryBuffer::ETC1: | 114 case gfx::GpuMemoryBuffer::ETC1: |
104 case gfx::GpuMemoryBuffer::RGBX_8888: | 115 case gfx::GpuMemoryBuffer::RGBX_8888: |
105 NOTREACHED(); | 116 NOTREACHED(); |
106 return 0; | 117 return 0; |
107 } | 118 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
140 | 151 |
141 GLImageMemory::~GLImageMemory() { | 152 GLImageMemory::~GLImageMemory() { |
142 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ | 153 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ |
143 defined(USE_OZONE) | 154 defined(USE_OZONE) |
144 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_); | 155 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_); |
145 DCHECK_EQ(0u, egl_texture_id_); | 156 DCHECK_EQ(0u, egl_texture_id_); |
146 #endif | 157 #endif |
147 } | 158 } |
148 | 159 |
149 // static | 160 // static |
150 bool GLImageMemory::StrideInBytes(size_t width, | 161 bool GLImageMemory::StrideInBytes(size_t width, |
reveman
2015/04/01 13:14:33
Just make sure this function is consistent with Gp
Daniele Castagna
2015/04/01 21:58:35
If by "make sure this function is consistent" you
| |
151 gfx::GpuMemoryBuffer::Format format, | 162 gfx::GpuMemoryBuffer::Format format, |
152 size_t* stride_in_bytes) { | 163 size_t* stride_in_bytes) { |
153 base::CheckedNumeric<size_t> s = width; | 164 base::CheckedNumeric<size_t> checked_stride = width; |
154 switch (format) { | 165 switch (format) { |
155 case gfx::GpuMemoryBuffer::ATCIA: | 166 case GpuMemoryBuffer::R_8: |
156 case gfx::GpuMemoryBuffer::DXT5: | 167 checked_stride = (checked_stride + 3) % 4; |
157 *stride_in_bytes = width; | 168 break; |
158 return true; | 169 case GpuMemoryBuffer::ATCIA: |
159 case gfx::GpuMemoryBuffer::ATC: | 170 case GpuMemoryBuffer::DXT5: // 'checked_stride' is the same as 'width'. |
160 case gfx::GpuMemoryBuffer::DXT1: | 171 break; |
161 case gfx::GpuMemoryBuffer::ETC1: | 172 case GpuMemoryBuffer::ATC: |
173 case GpuMemoryBuffer::DXT1: | |
174 case GpuMemoryBuffer::ETC1: | |
162 DCHECK_EQ(width % 2, 0U); | 175 DCHECK_EQ(width % 2, 0U); |
163 s /= 2; | 176 checked_stride /= 2; |
164 if (!s.IsValid()) | 177 break; |
165 return false; | 178 case GpuMemoryBuffer::RGBA_8888: |
166 | 179 case GpuMemoryBuffer::RGBX_8888: |
167 *stride_in_bytes = s.ValueOrDie(); | 180 case GpuMemoryBuffer::BGRA_8888: |
168 return true; | 181 checked_stride *= 4; |
169 case gfx::GpuMemoryBuffer::RGBA_8888: | 182 break; |
170 case gfx::GpuMemoryBuffer::BGRA_8888: | |
171 s *= 4; | |
172 if (!s.IsValid()) | |
173 return false; | |
174 | |
175 *stride_in_bytes = s.ValueOrDie(); | |
176 return true; | |
177 case gfx::GpuMemoryBuffer::RGBX_8888: | |
178 NOTREACHED(); | |
179 return false; | |
180 } | 183 } |
181 | 184 if (!checked_stride.IsValid()) |
182 NOTREACHED(); | 185 return false; |
183 return false; | 186 *stride_in_bytes = checked_stride.ValueOrDie(); |
187 return true; | |
184 } | 188 } |
185 | 189 |
186 bool GLImageMemory::Initialize(const unsigned char* memory, | 190 bool GLImageMemory::Initialize(const unsigned char* memory, |
187 gfx::GpuMemoryBuffer::Format format) { | 191 gfx::GpuMemoryBuffer::Format format) { |
188 if (!ValidInternalFormat(internalformat_)) { | 192 if (!ValidateFormats(format, internalformat_)) { |
reveman
2015/04/01 13:14:33
Please make this function consistent with GLImageL
Daniele Castagna
2015/04/01 21:58:34
Done.
| |
189 LOG(ERROR) << "Invalid internalformat: " << internalformat_; | |
190 return false; | 193 return false; |
191 } | 194 } |
192 | 195 |
193 if (!ValidFormat(format)) { | |
194 LOG(ERROR) << "Invalid format: " << format; | |
195 return false; | |
196 } | |
197 | |
198 DCHECK(memory); | 196 DCHECK(memory); |
199 DCHECK(!memory_); | 197 DCHECK(!memory_); |
200 DCHECK_IMPLIES(IsCompressedFormat(format), size_.width() % 4 == 0); | 198 DCHECK_IMPLIES(IsCompressedFormat(format), size_.width() % 4 == 0); |
201 DCHECK_IMPLIES(IsCompressedFormat(format), size_.height() % 4 == 0); | 199 DCHECK_IMPLIES(IsCompressedFormat(format), size_.height() % 4 == 0); |
202 memory_ = memory; | 200 memory_ = memory; |
203 format_ = format; | 201 format_ = format; |
204 return true; | 202 return true; |
205 } | 203 } |
206 | 204 |
207 void GLImageMemory::Destroy(bool have_context) { | 205 void GLImageMemory::Destroy(bool have_context) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
249 if (target == GL_TEXTURE_EXTERNAL_OES) | 247 if (target == GL_TEXTURE_EXTERNAL_OES) |
250 return false; | 248 return false; |
251 | 249 |
252 DCHECK(memory_); | 250 DCHECK(memory_); |
253 if (IsCompressedFormat(format_)) { | 251 if (IsCompressedFormat(format_)) { |
254 glCompressedTexSubImage2D(target, | 252 glCompressedTexSubImage2D(target, |
255 0, // level | 253 0, // level |
256 0, // x-offset | 254 0, // x-offset |
257 0, // y-offset | 255 0, // y-offset |
258 size_.width(), size_.height(), | 256 size_.width(), size_.height(), |
259 DataFormat(format_), SizeInBytes(size_, format_), | 257 DataFormat(format_, internalformat_), |
260 memory_); | 258 SizeInBytes(size_, format_), memory_); |
261 } else { | 259 } else { |
262 glTexSubImage2D(target, 0, // level | 260 glTexSubImage2D(target, 0, // level |
263 0, // x | 261 0, // x |
264 0, // y | 262 0, // y |
265 size_.width(), size_.height(), DataFormat(format_), | 263 size_.width(), size_.height(), |
266 DataType(format_), memory_); | 264 DataFormat(format_, internalformat_), DataType(format_), |
265 memory_); | |
267 } | 266 } |
268 | 267 |
269 return true; | 268 return true; |
270 } | 269 } |
271 | 270 |
272 void GLImageMemory::WillUseTexImage() { | 271 void GLImageMemory::WillUseTexImage() { |
273 DCHECK(!in_use_); | 272 DCHECK(!in_use_); |
274 in_use_ = true; | 273 in_use_ = true; |
275 | 274 |
276 if (!need_do_bind_tex_image_) | 275 if (!need_do_bind_tex_image_) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 | 308 |
310 { | 309 { |
311 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); | 310 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); |
312 | 311 |
313 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 312 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
314 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 313 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
315 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 314 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
316 if (IsCompressedFormat(format_)) { | 315 if (IsCompressedFormat(format_)) { |
317 glCompressedTexImage2D(GL_TEXTURE_2D, | 316 glCompressedTexImage2D(GL_TEXTURE_2D, |
318 0, // mip level | 317 0, // mip level |
319 TextureFormat(format_), size_.width(), | 318 TextureFormat(format_, internalformat_), |
320 size_.height(), | 319 size_.width(), size_.height(), |
321 0, // border | 320 0, // border |
322 SizeInBytes(size_, format_), memory_); | 321 SizeInBytes(size_, format_), memory_); |
323 } else { | 322 } else { |
324 glTexImage2D(GL_TEXTURE_2D, | 323 glTexImage2D(GL_TEXTURE_2D, |
325 0, // mip level | 324 0, // mip level |
326 TextureFormat(format_), | 325 TextureFormat(format_, internalformat_), size_.width(), |
327 size_.width(), | |
328 size_.height(), | 326 size_.height(), |
329 0, // border | 327 0, // border |
330 DataFormat(format_), | 328 DataFormat(format_, internalformat_), DataType(format_), |
331 DataType(format_), | |
332 memory_); | 329 memory_); |
333 } | 330 } |
334 } | 331 } |
335 | 332 |
336 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; | 333 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; |
337 // Need to pass current EGL rendering context to eglCreateImageKHR for | 334 // Need to pass current EGL rendering context to eglCreateImageKHR for |
338 // target type EGL_GL_TEXTURE_2D_KHR. | 335 // target type EGL_GL_TEXTURE_2D_KHR. |
339 egl_image_ = | 336 egl_image_ = |
340 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(), | 337 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(), |
341 eglGetCurrentContext(), | 338 eglGetCurrentContext(), |
342 EGL_GL_TEXTURE_2D_KHR, | 339 EGL_GL_TEXTURE_2D_KHR, |
343 reinterpret_cast<EGLClientBuffer>(egl_texture_id_), | 340 reinterpret_cast<EGLClientBuffer>(egl_texture_id_), |
344 attrs); | 341 attrs); |
345 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_) | 342 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_) |
346 << "Error creating EGLImage: " << eglGetError(); | 343 << "Error creating EGLImage: " << eglGetError(); |
347 } else { | 344 } else { |
348 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); | 345 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); |
349 | 346 |
350 if (IsCompressedFormat(format_)) { | 347 if (IsCompressedFormat(format_)) { |
351 glCompressedTexSubImage2D(GL_TEXTURE_2D, | 348 glCompressedTexSubImage2D(GL_TEXTURE_2D, |
352 0, // mip level | 349 0, // mip level |
353 0, // x-offset | 350 0, // x-offset |
354 0, // y-offset | 351 0, // y-offset |
355 size_.width(), size_.height(), | 352 size_.width(), size_.height(), |
356 DataFormat(format_), | 353 DataFormat(format_, internalformat_), |
357 SizeInBytes(size_, format_), | 354 SizeInBytes(size_, format_), memory_); |
358 memory_); | |
359 } else { | 355 } else { |
360 glTexSubImage2D(GL_TEXTURE_2D, | 356 glTexSubImage2D(GL_TEXTURE_2D, |
361 0, // mip level | 357 0, // mip level |
362 0, // x-offset | 358 0, // x-offset |
363 0, // y-offset | 359 0, // y-offset |
364 size_.width(), | 360 size_.width(), size_.height(), |
365 size_.height(), | 361 DataFormat(format_, internalformat_), DataType(format_), |
366 DataFormat(format_), | |
367 DataType(format_), | |
368 memory_); | 362 memory_); |
369 } | 363 } |
370 } | 364 } |
371 | 365 |
372 glEGLImageTargetTexture2DOES(target, egl_image_); | 366 glEGLImageTargetTexture2DOES(target, egl_image_); |
373 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); | 367 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); |
374 return; | 368 return; |
375 } | 369 } |
376 #endif | 370 #endif |
377 | 371 |
378 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target); | 372 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target); |
379 if (IsCompressedFormat(format_)) { | 373 if (IsCompressedFormat(format_)) { |
380 glCompressedTexImage2D(target, | 374 glCompressedTexImage2D(target, |
381 0, // mip level | 375 0, // mip level |
382 TextureFormat(format_), size_.width(), | 376 TextureFormat(format_, internalformat_), |
383 size_.height(), | 377 size_.width(), size_.height(), |
384 0, // border | 378 0, // border |
385 SizeInBytes(size_, format_), memory_); | 379 SizeInBytes(size_, format_), memory_); |
386 } else { | 380 } else { |
387 glTexImage2D(target, | 381 glTexImage2D( |
388 0, // mip level | 382 target, |
389 TextureFormat(format_), | 383 0, // mip level |
390 size_.width(), | 384 TextureFormat(format_, internalformat_), size_.width(), size_.height(), |
391 size_.height(), | 385 0, // border |
392 0, // border | 386 DataFormat(format_, internalformat_), DataType(format_), memory_); |
393 DataFormat(format_), | |
394 DataType(format_), | |
395 memory_); | |
396 } | 387 } |
397 } | 388 } |
398 | 389 |
399 } // namespace gfx | 390 } // namespace gfx |
OLD | NEW |