OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 } else { | 128 } else { |
129 // TODO: we need to convert DXT3 -> RGBA8 but keep around the | 129 // TODO: we need to convert DXT3 -> RGBA8 but keep around the |
130 // pixels so that we can read them back (we won't try to convert back | 130 // pixels so that we can read them back (we won't try to convert back |
131 // to DXTC). | 131 // to DXTC). |
132 LOG(ERROR) << "DXT5 compressed textures not supported yet."; | 132 LOG(ERROR) << "DXT5 compressed textures not supported yet."; |
133 *internal_format = 0; | 133 *internal_format = 0; |
134 *data_type = GL_BYTE; | 134 *data_type = GL_BYTE; |
135 return 0; | 135 return 0; |
136 } | 136 } |
137 } | 137 } |
| 138 case Texture::UNKNOWN_FORMAT: |
| 139 break; |
138 } | 140 } |
139 // failed to find a matching format | 141 // failed to find a matching format |
140 LOG(ERROR) << "Unrecognized Texture format type."; | 142 LOG(ERROR) << "Unrecognized Texture format type."; |
141 *internal_format = 0; | 143 *internal_format = 0; |
142 *data_type = 0; | 144 *data_type = 0; |
143 return 0; | 145 return 0; |
144 } | 146 } |
145 | 147 |
146 // Updates a GL image from a bitmap, rescaling if necessary. | 148 // Updates a GL image from a bitmap, rescaling if necessary. |
147 static bool UpdateGLImageFromBitmap(GLenum target, | 149 static bool UpdateGLImageFromBitmap(GLenum target, |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 bitmap.width(), | 264 bitmap.width(), |
263 bitmap.height(), | 265 bitmap.height(), |
264 bitmap.format(), | 266 bitmap.format(), |
265 bitmap.num_mipmaps(), | 267 bitmap.num_mipmaps(), |
266 bitmap.CheckAlphaIsOne(), | 268 bitmap.CheckAlphaIsOne(), |
267 resize_to_pot, | 269 resize_to_pot, |
268 enable_render_surfaces), | 270 enable_render_surfaces), |
269 renderer_(static_cast<RendererGL*>( | 271 renderer_(static_cast<RendererGL*>( |
270 service_locator->GetService<Renderer>())), | 272 service_locator->GetService<Renderer>())), |
271 gl_texture_(texture), | 273 gl_texture_(texture), |
272 has_levels_(0), | 274 backing_bitmap_(Bitmap::Ref(new Bitmap(service_locator))), |
273 backing_bitmap_(Bitmap::Ref(new Bitmap(service_locator))) { | 275 has_levels_(0) { |
274 DLOG(INFO) << "Texture2DGL Construct from GLint"; | 276 DLOG(INFO) << "Texture2DGL Construct from GLint"; |
275 DCHECK_NE(format(), Texture::UNKNOWN_FORMAT); | 277 DCHECK_NE(format(), Texture::UNKNOWN_FORMAT); |
276 } | 278 } |
277 | 279 |
278 // Creates a new texture object from scratch. | 280 // Creates a new texture object from scratch. |
279 Texture2DGL* Texture2DGL::Create(ServiceLocator* service_locator, | 281 Texture2DGL* Texture2DGL::Create(ServiceLocator* service_locator, |
280 Bitmap *bitmap, | 282 Bitmap *bitmap, |
281 bool enable_render_surfaces) { | 283 bool enable_render_surfaces) { |
282 DLOG(INFO) << "Texture2DGL Create"; | 284 DLOG(INFO) << "Texture2DGL Create"; |
283 DCHECK_NE(bitmap->format(), Texture::UNKNOWN_FORMAT); | 285 DCHECK_NE(bitmap->format(), Texture::UNKNOWN_FORMAT); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 memset(texture->backing_bitmap_->image_data(), 0, | 350 memset(texture->backing_bitmap_->image_data(), 0, |
349 texture->backing_bitmap_->GetTotalSize()); | 351 texture->backing_bitmap_->GetTotalSize()); |
350 texture->has_levels_ = (1 << bitmap->num_mipmaps()) - 1; | 352 texture->has_levels_ = (1 << bitmap->num_mipmaps()) - 1; |
351 } | 353 } |
352 } | 354 } |
353 CHECK_GL_ERROR(); | 355 CHECK_GL_ERROR(); |
354 return texture; | 356 return texture; |
355 } | 357 } |
356 | 358 |
357 void Texture2DGL::UpdateBackedMipLevel(unsigned int level) { | 359 void Texture2DGL::UpdateBackedMipLevel(unsigned int level) { |
358 DCHECK_LT(level, levels()); | 360 DCHECK_LT(static_cast<int>(level), levels()); |
359 DCHECK(backing_bitmap_->image_data()); | 361 DCHECK(backing_bitmap_->image_data()); |
360 DCHECK_EQ(backing_bitmap_->width(), width()); | 362 DCHECK_EQ(backing_bitmap_->width(), static_cast<unsigned int>(width())); |
361 DCHECK_EQ(backing_bitmap_->height(), height()); | 363 DCHECK_EQ(backing_bitmap_->height(), static_cast<unsigned int>(height())); |
362 DCHECK_EQ(backing_bitmap_->format(), format()); | 364 DCHECK_EQ(backing_bitmap_->format(), format()); |
363 DCHECK(HasLevel(level)); | 365 DCHECK(HasLevel(level)); |
364 glBindTexture(GL_TEXTURE_2D, gl_texture_); | 366 glBindTexture(GL_TEXTURE_2D, gl_texture_); |
365 UpdateGLImageFromBitmap(GL_TEXTURE_2D, level, TextureCUBE::FACE_POSITIVE_X, | 367 UpdateGLImageFromBitmap(GL_TEXTURE_2D, level, TextureCUBE::FACE_POSITIVE_X, |
366 *backing_bitmap_.Get(), resize_to_pot_); | 368 *backing_bitmap_.Get(), resize_to_pot_); |
367 } | 369 } |
368 | 370 |
369 Texture2DGL::~Texture2DGL() { | 371 Texture2DGL::~Texture2DGL() { |
370 DLOG(INFO) << "Texture2DGL Destruct"; | 372 DLOG(INFO) << "Texture2DGL Destruct"; |
371 if (gl_texture_) { | 373 if (gl_texture_) { |
(...skipping 15 matching lines...) Expand all Loading... |
387 << " on Texture \"" << name(); | 389 << " on Texture \"" << name(); |
388 return false; | 390 return false; |
389 } | 391 } |
390 if (IsLocked(level)) { | 392 if (IsLocked(level)) { |
391 O3D_ERROR(service_locator()) | 393 O3D_ERROR(service_locator()) |
392 << "Level " << level << " of texture \"" << name() | 394 << "Level " << level << " of texture \"" << name() |
393 << "\" is already locked."; | 395 << "\" is already locked."; |
394 return false; | 396 return false; |
395 } | 397 } |
396 if (!backing_bitmap_->image_data()) { | 398 if (!backing_bitmap_->image_data()) { |
397 DCHECK_EQ(has_levels_, 0); | 399 DCHECK_EQ(has_levels_, 0u); |
398 backing_bitmap_->Allocate(format(), width(), height(), levels(), false); | 400 backing_bitmap_->Allocate(format(), width(), height(), levels(), false); |
399 } | 401 } |
400 *data = backing_bitmap_->GetMipData(level, TextureCUBE::FACE_POSITIVE_X); | 402 *data = backing_bitmap_->GetMipData(level, TextureCUBE::FACE_POSITIVE_X); |
401 if (!HasLevel(level)) { | 403 if (!HasLevel(level)) { |
402 // TODO: add some API so we don't have to copy back the data if we | 404 // TODO: add some API so we don't have to copy back the data if we |
403 // will rewrite it all. | 405 // will rewrite it all. |
404 DCHECK(!resize_to_pot_); | 406 DCHECK(!resize_to_pot_); |
405 GLenum gl_internal_format = 0; | 407 GLenum gl_internal_format = 0; |
406 GLenum gl_data_type = 0; | 408 GLenum gl_data_type = 0; |
407 GLenum gl_format = GLFormatFromO3DFormat(format(), | 409 GLenum gl_format = GLFormatFromO3DFormat(format(), |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 } | 600 } |
599 } | 601 } |
600 } | 602 } |
601 CHECK_GL_ERROR(); | 603 CHECK_GL_ERROR(); |
602 DLOG(INFO) << "Created cube map texture (GLuint=" << gl_texture << ")"; | 604 DLOG(INFO) << "Created cube map texture (GLuint=" << gl_texture << ")"; |
603 return texture; | 605 return texture; |
604 } | 606 } |
605 | 607 |
606 void TextureCUBEGL::UpdateBackedMipLevel(unsigned int level, | 608 void TextureCUBEGL::UpdateBackedMipLevel(unsigned int level, |
607 TextureCUBE::CubeFace face) { | 609 TextureCUBE::CubeFace face) { |
608 DCHECK_LT(level, levels()); | 610 DCHECK_LT(static_cast<int>(level), levels()); |
609 DCHECK(backing_bitmap_->image_data()); | 611 DCHECK(backing_bitmap_->image_data()); |
610 DCHECK(backing_bitmap_->is_cubemap()); | 612 DCHECK(backing_bitmap_->is_cubemap()); |
611 DCHECK_EQ(backing_bitmap_->width(), edge_length()); | 613 DCHECK_EQ(backing_bitmap_->width(), static_cast<unsigned int>(edge_length())); |
612 DCHECK_EQ(backing_bitmap_->height(), edge_length()); | 614 DCHECK_EQ(backing_bitmap_->height(), |
| 615 static_cast<unsigned int>(edge_length())); |
613 DCHECK_EQ(backing_bitmap_->format(), format()); | 616 DCHECK_EQ(backing_bitmap_->format(), format()); |
614 DCHECK(HasLevel(level, face)); | 617 DCHECK(HasLevel(level, face)); |
615 glBindTexture(GL_TEXTURE_2D, gl_texture_); | 618 glBindTexture(GL_TEXTURE_2D, gl_texture_); |
616 UpdateGLImageFromBitmap(kCubemapFaceList[face], level, face, | 619 UpdateGLImageFromBitmap(kCubemapFaceList[face], level, face, |
617 *backing_bitmap_.Get(), | 620 *backing_bitmap_.Get(), |
618 resize_to_pot_); | 621 resize_to_pot_); |
619 } | 622 } |
620 | 623 |
621 RenderSurface::Ref TextureCUBEGL::GetRenderSurface(TextureCUBE::CubeFace face, | 624 RenderSurface::Ref TextureCUBEGL::GetRenderSurface(TextureCUBE::CubeFace face, |
622 int mip_level, | 625 int mip_level, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 } | 668 } |
666 if (IsLocked(level, face)) { | 669 if (IsLocked(level, face)) { |
667 O3D_ERROR(service_locator()) | 670 O3D_ERROR(service_locator()) |
668 << "Level " << level << " Face " << face | 671 << "Level " << level << " Face " << face |
669 << " of texture \"" << name() | 672 << " of texture \"" << name() |
670 << "\" is already locked."; | 673 << "\" is already locked."; |
671 return false; | 674 return false; |
672 } | 675 } |
673 if (!backing_bitmap_->image_data()) { | 676 if (!backing_bitmap_->image_data()) { |
674 for (unsigned int i = 0; i < 6; ++i) { | 677 for (unsigned int i = 0; i < 6; ++i) { |
675 DCHECK_EQ(has_levels_[i], 0); | 678 DCHECK_EQ(has_levels_[i], 0u); |
676 } | 679 } |
677 backing_bitmap_->Allocate(format(), edge_length(), edge_length(), | 680 backing_bitmap_->Allocate(format(), edge_length(), edge_length(), |
678 levels(), true); | 681 levels(), true); |
679 } | 682 } |
680 *data = backing_bitmap_->GetMipData(level, face); | 683 *data = backing_bitmap_->GetMipData(level, face); |
681 GLenum gl_target = kCubemapFaceList[face]; | 684 GLenum gl_target = kCubemapFaceList[face]; |
682 if (!HasLevel(level, face)) { | 685 if (!HasLevel(level, face)) { |
683 // TODO: add some API so we don't have to copy back the data if we | 686 // TODO: add some API so we don't have to copy back the data if we |
684 // will rewrite it all. | 687 // will rewrite it all. |
685 DCHECK(!resize_to_pot_); | 688 DCHECK(!resize_to_pot_); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 } | 736 } |
734 CHECK_GL_ERROR(); | 737 CHECK_GL_ERROR(); |
735 return false; | 738 return false; |
736 } | 739 } |
737 | 740 |
738 const Texture::RGBASwizzleIndices& TextureCUBEGL::GetABGR32FSwizzleIndices() { | 741 const Texture::RGBASwizzleIndices& TextureCUBEGL::GetABGR32FSwizzleIndices() { |
739 return g_gl_abgr32f_swizzle_indices; | 742 return g_gl_abgr32f_swizzle_indices; |
740 } | 743 } |
741 | 744 |
742 } // namespace o3d | 745 } // namespace o3d |
OLD | NEW |