| 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 // Writes the data information into a buffer to be sent to the server side. | 99 // Writes the data information into a buffer to be sent to the server side. |
| 100 void SetTextureDataBuffer(Texture::Format format, | 100 void SetTextureDataBuffer(Texture::Format format, |
| 101 const void* src_data, | 101 const void* src_data, |
| 102 int src_pitch, | 102 int src_pitch, |
| 103 unsigned src_width, | 103 unsigned src_width, |
| 104 unsigned src_height, | 104 unsigned src_height, |
| 105 void* dst_buffer, | 105 void* dst_buffer, |
| 106 unsigned int dst_pitch) { | 106 unsigned int dst_pitch) { |
| 107 const uint8* src = static_cast<const uint8*>(src_data); | 107 const uint8* src = static_cast<const uint8*>(src_data); |
| 108 uint8* dst = static_cast<uint8*>(dst_buffer); | 108 uint8* dst = static_cast<uint8*>(dst_buffer); |
| 109 size_t bytes_per_line = image::ComputePitch(format, src_width); | 109 |
| 110 for (unsigned yy = 0; yy < src_height; ++yy) { | 110 size_t bytes_per_row = image::ComputePitch(format, src_width); |
| 111 memcpy(dst, src, bytes_per_line); | 111 unsigned num_rows = src_height; |
| 112 if (Texture::IsCompressedFormat(format)) { |
| 113 num_rows = (num_rows + 3) / 4; |
| 114 } |
| 115 |
| 116 for (unsigned yy = 0; yy < num_rows; ++yy) { |
| 117 memcpy(dst, src, bytes_per_row); |
| 112 src += src_pitch; | 118 src += src_pitch; |
| 113 dst += dst_pitch; | 119 dst += dst_pitch; |
| 114 } | 120 } |
| 115 } | 121 } |
| 122 |
| 116 // Sends the SET_TEXTURE_DATA command after formatting the args properly. | 123 // Sends the SET_TEXTURE_DATA command after formatting the args properly. |
| 117 void SetTextureData(RendererCB *renderer, | 124 void SetTextureData(RendererCB *renderer, |
| 118 ResourceID texture_id, | 125 ResourceID texture_id, |
| 119 unsigned int x, | 126 unsigned int x, |
| 120 unsigned int y, | 127 unsigned int y, |
| 121 unsigned int mip_width, | 128 unsigned int mip_width, |
| 122 unsigned int mip_height, | 129 unsigned int mip_height, |
| 123 unsigned int z, | 130 unsigned int z, |
| 124 unsigned int depth, | 131 unsigned int depth, |
| 125 unsigned int level, | 132 unsigned int level, |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 } else { | 402 } else { |
| 396 unsigned blocks_across = (mip_width + 3) / 4; | 403 unsigned blocks_across = (mip_width + 3) / 4; |
| 397 unsigned bytes_per_block = format() == Texture::DXT1 ? 8 : 16; | 404 unsigned bytes_per_block = format() == Texture::DXT1 ? 8 : 16; |
| 398 unsigned bytes_per_row = bytes_per_block * blocks_across; | 405 unsigned bytes_per_row = bytes_per_block * blocks_across; |
| 399 *pitch = bytes_per_row; | 406 *pitch = bytes_per_row; |
| 400 } | 407 } |
| 401 if (mode != kWriteOnly && !HasLevel(level)) { | 408 if (mode != kWriteOnly && !HasLevel(level)) { |
| 402 DCHECK_EQ(backing_bitmap_->width(), width()); | 409 DCHECK_EQ(backing_bitmap_->width(), width()); |
| 403 DCHECK_EQ(backing_bitmap_->height(), height()); | 410 DCHECK_EQ(backing_bitmap_->height(), height()); |
| 404 DCHECK_EQ(backing_bitmap_->format(), format()); | 411 DCHECK_EQ(backing_bitmap_->format(), format()); |
| 405 DCHECK_GT(backing_bitmap_->num_mipmaps(), level); | 412 DCHECK_GT(backing_bitmap_->num_mipmaps(), static_cast<unsigned int>(level)); |
| 406 CopyBackResourceToBitmap(renderer_, resource_id_, level, | 413 CopyBackResourceToBitmap(renderer_, resource_id_, level, |
| 407 TextureCUBE::FACE_POSITIVE_X, | 414 TextureCUBE::FACE_POSITIVE_X, |
| 408 *backing_bitmap_.Get()); | 415 *backing_bitmap_.Get()); |
| 409 has_levels_ |= 1 << level; | 416 has_levels_ |= 1 << level; |
| 410 } | 417 } |
| 411 locked_levels_ |= 1 << level; | 418 locked_levels_ |= 1 << level; |
| 412 return true; | 419 return true; |
| 413 } | 420 } |
| 414 | 421 |
| 415 // Unlocks the given mipmap level of this texture, uploading the main memory | 422 // Unlocks the given mipmap level of this texture, uploading the main memory |
| 416 // data buffer to the command buffer service. | 423 // data buffer to the command buffer service. |
| 417 bool Texture2DCB::PlatformSpecificUnlock(int level) { | 424 bool Texture2DCB::PlatformSpecificUnlock(int level) { |
| 418 DCHECK_GE(level, 0); | 425 DCHECK_GE(level, 0); |
| 419 DCHECK_LT(level, levels()); | 426 DCHECK_LT(level, levels()); |
| 420 DCHECK(backing_bitmap_->image_data()); | 427 DCHECK(backing_bitmap_->image_data()); |
| 421 DCHECK_EQ(backing_bitmap_->width(), width()); | 428 DCHECK_EQ(backing_bitmap_->width(), width()); |
| 422 DCHECK_EQ(backing_bitmap_->height(), height()); | 429 DCHECK_EQ(backing_bitmap_->height(), height()); |
| 423 DCHECK_EQ(backing_bitmap_->format(), format()); | 430 DCHECK_EQ(backing_bitmap_->format(), format()); |
| 424 DCHECK_GT(backing_bitmap_->num_mipmaps(), level); | 431 DCHECK_GT(backing_bitmap_->num_mipmaps(), static_cast<unsigned int>(level)); |
| 425 if (LockedMode(level) != kReadOnly) { | 432 if (LockedMode(level) != kReadOnly) { |
| 426 UpdateResourceFromBitmap(renderer_, resource_id_, level, | 433 UpdateResourceFromBitmap(renderer_, resource_id_, level, |
| 427 TextureCUBE::FACE_POSITIVE_X, | 434 TextureCUBE::FACE_POSITIVE_X, |
| 428 *backing_bitmap_.Get()); | 435 *backing_bitmap_.Get()); |
| 429 } | 436 } |
| 430 locked_levels_ &= ~(1 << level); | 437 locked_levels_ &= ~(1 << level); |
| 431 if (locked_levels_ == 0) { | 438 if (locked_levels_ == 0) { |
| 432 backing_bitmap_->FreeData(); | 439 backing_bitmap_->FreeData(); |
| 433 has_levels_ = 0; | 440 has_levels_ = 0; |
| 434 } | 441 } |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 } else { | 634 } else { |
| 628 unsigned blocks_across = (mip_width + 3) / 4; | 635 unsigned blocks_across = (mip_width + 3) / 4; |
| 629 unsigned bytes_per_block = format() == Texture::DXT1 ? 8 : 16; | 636 unsigned bytes_per_block = format() == Texture::DXT1 ? 8 : 16; |
| 630 unsigned bytes_per_row = bytes_per_block * blocks_across; | 637 unsigned bytes_per_row = bytes_per_block * blocks_across; |
| 631 *pitch = bytes_per_row; | 638 *pitch = bytes_per_row; |
| 632 } | 639 } |
| 633 if (mode != kWriteOnly && !HasLevel(face, level)) { | 640 if (mode != kWriteOnly && !HasLevel(face, level)) { |
| 634 DCHECK_EQ(backing_bitmap->width(), edge_length()); | 641 DCHECK_EQ(backing_bitmap->width(), edge_length()); |
| 635 DCHECK_EQ(backing_bitmap->height(), edge_length()); | 642 DCHECK_EQ(backing_bitmap->height(), edge_length()); |
| 636 DCHECK_EQ(backing_bitmap->format(), format()); | 643 DCHECK_EQ(backing_bitmap->format(), format()); |
| 637 DCHECK_GT(backing_bitmap->num_mipmaps(), level); | 644 DCHECK_GT(backing_bitmap->num_mipmaps(), static_cast<unsigned int>(level)); |
| 638 CopyBackResourceToBitmap(renderer_, resource_id_, level, | 645 CopyBackResourceToBitmap(renderer_, resource_id_, level, |
| 639 TextureCUBE::FACE_POSITIVE_X, *backing_bitmap); | 646 TextureCUBE::FACE_POSITIVE_X, *backing_bitmap); |
| 640 has_levels_[face] |= 1 << level; | 647 has_levels_[face] |= 1 << level; |
| 641 } | 648 } |
| 642 locked_levels_[face] |= 1 << level; | 649 locked_levels_[face] |= 1 << level; |
| 643 return false; | 650 return false; |
| 644 } | 651 } |
| 645 | 652 |
| 646 // Unlocks the given face and mipmap level of this texture. | 653 // Unlocks the given face and mipmap level of this texture. |
| 647 bool TextureCUBECB::PlatformSpecificUnlock(CubeFace face, int level) { | 654 bool TextureCUBECB::PlatformSpecificUnlock(CubeFace face, int level) { |
| 648 DCHECK_GE(level, 0); | 655 DCHECK_GE(level, 0); |
| 649 DCHECK_LT(level, levels()); | 656 DCHECK_LT(level, levels()); |
| 650 Bitmap* backing_bitmap = backing_bitmaps_[face].Get(); | 657 Bitmap* backing_bitmap = backing_bitmaps_[face].Get(); |
| 651 DCHECK(backing_bitmap->image_data()); | 658 DCHECK(backing_bitmap->image_data()); |
| 652 DCHECK_EQ(backing_bitmap->width(), edge_length()); | 659 DCHECK_EQ(backing_bitmap->width(), edge_length()); |
| 653 DCHECK_EQ(backing_bitmap->height(), edge_length()); | 660 DCHECK_EQ(backing_bitmap->height(), edge_length()); |
| 654 DCHECK_EQ(backing_bitmap->format(), format()); | 661 DCHECK_EQ(backing_bitmap->format(), format()); |
| 655 DCHECK_GT(backing_bitmap->num_mipmaps(), level); | 662 DCHECK_GT(backing_bitmap->num_mipmaps(), static_cast<unsigned int>(level)); |
| 656 | 663 |
| 657 if (LockedMode(face, level) != kReadOnly) { | 664 if (LockedMode(face, level) != kReadOnly) { |
| 658 UpdateResourceFromBitmap(renderer_, resource_id_, level, face, | 665 UpdateResourceFromBitmap(renderer_, resource_id_, level, face, |
| 659 *backing_bitmap); | 666 *backing_bitmap); |
| 660 } | 667 } |
| 661 locked_levels_[face] &= ~(1 << level); | 668 locked_levels_[face] &= ~(1 << level); |
| 662 if (locked_levels_[face] == 0) { | 669 if (locked_levels_[face] == 0) { |
| 663 backing_bitmap->FreeData(); | 670 backing_bitmap->FreeData(); |
| 664 has_levels_[face] = 0; | 671 has_levels_[face] = 0; |
| 665 } | 672 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 691 face, | 698 face, |
| 692 this, | 699 this, |
| 693 renderer_)); | 700 renderer_)); |
| 694 } | 701 } |
| 695 | 702 |
| 696 const Texture::RGBASwizzleIndices& TextureCUBECB::GetABGR32FSwizzleIndices() { | 703 const Texture::RGBASwizzleIndices& TextureCUBECB::GetABGR32FSwizzleIndices() { |
| 697 return g_cb_abgr32f_swizzle_indices; | 704 return g_cb_abgr32f_swizzle_indices; |
| 698 } | 705 } |
| 699 | 706 |
| 700 } // namespace o3d | 707 } // namespace o3d |
| OLD | NEW |