diff options
author | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-01 02:59:36 +0000 |
---|---|---|
committer | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-01 02:59:36 +0000 |
commit | 38570a4a25452eaa63d0556456f80d33c0e231df (patch) | |
tree | de13ded36a0a39340587de17ea8c3a3f712d8080 /o3d/core/win | |
parent | 240c058e978c761a1c2ab644e01b8d383988f2b3 (diff) | |
download | chromium_src-38570a4a25452eaa63d0556456f80d33c0e231df.zip chromium_src-38570a4a25452eaa63d0556456f80d33c0e231df.tar.gz chromium_src-38570a4a25452eaa63d0556456f80d33c0e231df.tar.bz2 |
Update Texture::Lock to take an AccessMode.
Also, split Lock/Unlock into common and platform
specific parts.
This is needed to work around an apparent bug in
mac drivers where glGetTexImage apparently doesn't
always work.
This doesn't solve the issue unless we disallow
READ completely. Not sure what to about that
except make a small GL sample and report the
bug to Apple.
Review URL: http://codereview.chromium.org/173640
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25012 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/core/win')
-rw-r--r-- | o3d/core/win/d3d9/texture_d3d9.cc | 119 | ||||
-rw-r--r-- | o3d/core/win/d3d9/texture_d3d9.h | 11 |
2 files changed, 32 insertions, 98 deletions
diff --git a/o3d/core/win/d3d9/texture_d3d9.cc b/o3d/core/win/d3d9/texture_d3d9.cc index 68ca0bc..8cb411c 100644 --- a/o3d/core/win/d3d9/texture_d3d9.cc +++ b/o3d/core/win/d3d9/texture_d3d9.cc @@ -416,7 +416,7 @@ Texture2DD3D9* Texture2DD3D9::Create(ServiceLocator* service_locator, if (enable_render_surfaces) { texture->GetRenderSurface(level); } else if (!texture->IsCompressed()) { - texture->SetRect(level, 0, 0, + texture->SetRect(level, 0, 0, image::ComputeMipDimension(level, width), image::ComputeMipDimension(level, height), zero.get(), 0); @@ -574,26 +574,12 @@ void Texture2DD3D9::SetRect(int level, // Locks the given mipmap level of this texture for loading from main memory, // and returns a pointer to the buffer. -bool Texture2DD3D9::Lock(int level, void** texture_data, int* pitch) { +bool Texture2DD3D9::PlatformSpecificLock( + int level, void** texture_data, int* pitch, Texture::AccessMode mode) { DCHECK(texture_data); DCHECK(pitch); - if (level >= levels() || level < 0) { - O3D_ERROR(service_locator()) - << "Trying to lock inexistent level " << level << " on Texture \"" - << name() << "\""; - return false; - } - if (IsLocked(level)) { - O3D_ERROR(service_locator()) - << "Level " << level << " of texture \"" << name() - << "\" is already locked."; - return false; - } - if (render_surfaces_enabled()) { - O3D_ERROR(service_locator()) - << "Attempting to lock a render-target texture: " << name(); - return false; - } + DCHECK_GE(level, 0); + DCHECK_LT(level, levels()); unsigned int mip_width = image::ComputeMipDimension(level, width()); unsigned int mip_height = image::ComputeMipDimension(level, height()); @@ -602,19 +588,17 @@ bool Texture2DD3D9::Lock(int level, void** texture_data, int* pitch) { DCHECK(backing_bitmap_->image_data()); *texture_data = backing_bitmap_->GetMipData(level); *pitch = image::ComputePitch(format(), mip_width); - locked_levels_ |= 1 << level; return true; } else { RECT rect = {0, 0, mip_width, mip_height}; D3DLOCKED_RECT out_rect = {0}; - if (HR(d3d_texture_->LockRect(level, &out_rect, &rect, 0))) { + if (HR(d3d_texture_->LockRect(level, &out_rect, &rect, + mode == kReadOnly ? D3DLOCK_READONLY : 0))) { *texture_data = out_rect.pBits; *pitch = out_rect.Pitch; - locked_levels_ |= 1 << level; return true; } else { - O3D_ERROR(service_locator()) << "Failed to Lock Texture2D (D3D9)"; *texture_data = NULL; return false; } @@ -622,19 +606,10 @@ bool Texture2DD3D9::Lock(int level, void** texture_data, int* pitch) { } // Unlocks the given mipmap level of this texture. -bool Texture2DD3D9::Unlock(int level) { - if (level >= levels() || level < 0) { - O3D_ERROR(service_locator()) - << "Trying to unlock inexistent level " << level << " on Texture \"" - << name() << "\""; - return false; - } - if (!IsLocked(level)) { - O3D_ERROR(service_locator()) - << "Level " << level << " of texture \"" << name() - << "\" is not locked."; - return false; - } +bool Texture2DD3D9::PlatformSpecificUnlock(int level) { + DCHECK_GE(level, 0); + DCHECK_LT(level, levels()); + bool result = false; if (resize_to_pot_) { UpdateBackedMipLevel(level); @@ -642,11 +617,6 @@ bool Texture2DD3D9::Unlock(int level) { } else { result = HR(d3d_texture_->UnlockRect(level)); } - if (result) { - locked_levels_ &= ~(1 << level); - } else { - O3D_ERROR(service_locator()) << "Failed to Unlock Texture2D (D3D9)"; - } return result; } @@ -758,7 +728,7 @@ TextureCUBED3D9* TextureCUBED3D9::Create(ServiceLocator* service_locator, if (enable_render_surfaces) { texture->GetRenderSurface(static_cast<CubeFace>(face), level); } else if (!texture->IsCompressed()) { - texture->SetRect(static_cast<CubeFace>(face),level , 0, 0, + texture->SetRect(static_cast<CubeFace>(face),level , 0, 0, image::ComputeMipDimension(level, edge_length), image::ComputeMipDimension(level, edge_length), zero.get(), 0); @@ -774,14 +744,6 @@ TextureCUBED3D9* TextureCUBED3D9::Create(ServiceLocator* service_locator, // Destructor releases the D3D9 texture resource. TextureCUBED3D9::~TextureCUBED3D9() { - for (unsigned int i = 0; i < 6; ++i) { - if (locked_levels_[i] != 0) { - O3D_ERROR(service_locator()) - << "TextureCUBE \"" << name() << "\" was never unlocked before " - << "being destroyed."; - break; // No need to report it more than once. - } - } d3d_cube_texture_ = NULL; } @@ -941,27 +903,13 @@ void TextureCUBED3D9::SetRect(TextureCUBE::CubeFace face, // Locks the given face and mipmap level of this texture for loading from // main memory, and returns a pointer to the buffer. -bool TextureCUBED3D9::Lock( - CubeFace face, int level, void** texture_data, int* pitch) { +bool TextureCUBED3D9::PlatformSpecificLock( + CubeFace face, int level, void** texture_data, int* pitch, + Texture::AccessMode mode) { DCHECK(texture_data); DCHECK(pitch); - if (level >= levels() || level < 0) { - O3D_ERROR(service_locator()) - << "Trying to lock inexistent level " << level << " on Texture \"" - << name(); - return false; - } - if (IsLocked(level, face)) { - O3D_ERROR(service_locator()) - << "Level " << level << " Face " << face << " of texture \"" << name() - << "\" is already locked."; - return false; - } - if (render_surfaces_enabled()) { - O3D_ERROR(service_locator()) - << "Attempting to lock a render-target texture: " << name(); - return false; - } + DCHECK_GE(level, 0); + DCHECK_LT(level, levels()); unsigned int mip_width = image::ComputeMipDimension(level, edge_length()); unsigned int mip_height = mip_width; @@ -971,20 +919,19 @@ bool TextureCUBED3D9::Lock( DCHECK(backing_bitmap->image_data()); *texture_data = backing_bitmap->GetMipData(level); *pitch = image::ComputePitch(format(), mip_width); - locked_levels_[face] |= 1 << level; return true; } else { RECT rect = {0, 0, mip_width, mip_height}; D3DLOCKED_RECT out_rect = {0}; - if (HR(d3d_cube_texture_->LockRect(DX9CubeFace(face), level, - &out_rect, &rect, 0))) { + if (HR(d3d_cube_texture_->LockRect( + DX9CubeFace(face), level, + &out_rect, &rect, + mode == kReadOnly ? D3DLOCK_READONLY : 0))) { *texture_data = out_rect.pBits; *pitch = out_rect.Pitch; - locked_levels_[face] |= 1 << level; return true; } else { - O3D_ERROR(service_locator()) << "Failed to Lock Texture2D (D3D9)"; *texture_data = NULL; return false; } @@ -992,31 +939,15 @@ bool TextureCUBED3D9::Lock( } // Unlocks the given face and mipmap level of this texture. -bool TextureCUBED3D9::Unlock(CubeFace face, int level) { - if (level >= levels() || level < 0) { - O3D_ERROR(service_locator()) - << "Trying to unlock inexistent level " << level << " on Texture \"" - << name(); - return false; - } - if (!IsLocked(level, face)) { - O3D_ERROR(service_locator()) - << "Level " << level << " of texture \"" << name() - << "\" is not locked."; - return false; - } +bool TextureCUBED3D9::PlatformSpecificUnlock(CubeFace face, int level) { + DCHECK_GE(level, 0); + DCHECK_LT(level, levels()); bool result = false; if (resize_to_pot_) { UpdateBackedMipLevel(face, level); result = true; } else { - result = HR(d3d_cube_texture_->UnlockRect(DX9CubeFace(face), - level)); - } - if (result) { - locked_levels_[face] &= ~(1 << level); - } else { - O3D_ERROR(service_locator()) << "Failed to Unlock Texture2D (D3D9)"; + result = HR(d3d_cube_texture_->UnlockRect(DX9CubeFace(face), level)); } return result; } diff --git a/o3d/core/win/d3d9/texture_d3d9.h b/o3d/core/win/d3d9/texture_d3d9.h index c8c948b..8f53ffe 100644 --- a/o3d/core/win/d3d9/texture_d3d9.h +++ b/o3d/core/win/d3d9/texture_d3d9.h @@ -92,10 +92,11 @@ class Texture2DD3D9 : public Texture2D { protected: // Overridden from Texture2D - virtual bool Lock(int level, void** texture_data, int* pitch); + virtual bool PlatformSpecificLock( + int level, void** texture_data, int* pitch, AccessMode mode); // Overridden from Texture2D - virtual bool Unlock(int level); + virtual bool PlatformSpecificUnlock(int level); // Overridden from Texture2D virtual RenderSurface::Ref PlatformSpecificGetRenderSurface(int mip_level); @@ -170,10 +171,12 @@ class TextureCUBED3D9 : public TextureCUBE { protected: // Overridden from TextureCUBE - bool Lock(CubeFace face, int level, void** texture_data, int* pitch); + virtual bool PlatformSpecificLock( + CubeFace face, int level, void** texture_data, int* pitch, + AccessMode mode); // Overridden from TextureCUBE - bool Unlock(CubeFace face, int level); + virtual bool PlatformSpecificUnlock(CubeFace face, int level); // Overridden from TextureCUBE. virtual RenderSurface::Ref PlatformSpecificGetRenderSurface(CubeFace face, |