summaryrefslogtreecommitdiffstats
path: root/o3d/core/win
diff options
context:
space:
mode:
authorgman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-01 02:59:36 +0000
committergman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-01 02:59:36 +0000
commit38570a4a25452eaa63d0556456f80d33c0e231df (patch)
treede13ded36a0a39340587de17ea8c3a3f712d8080 /o3d/core/win
parent240c058e978c761a1c2ab644e01b8d383988f2b3 (diff)
downloadchromium_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.cc119
-rw-r--r--o3d/core/win/d3d9/texture_d3d9.h11
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,