Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1514)

Unified Diff: cc/texture_uploader.cc

Issue 11229040: Fix glTexSubImage2D for non-32bpp formats. (Closed) Base URL: https://git.chromium.org/git/chromium/src@git-svn
Patch Set: Rebase.:wq Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/texture_uploader.cc
diff --git a/cc/texture_uploader.cc b/cc/texture_uploader.cc
index 64b3de52424a4ed223a204145ef769843bfe7c79..6c6044ee2e0bb45647adb918a3e9629fe01ad83f 100644
--- a/cc/texture_uploader.cc
+++ b/cc/texture_uploader.cc
@@ -24,7 +24,8 @@ static const size_t uploadHistorySize = 100;
// Global estimated number of textures per second to maintain estimates across
// subsequent instances of TextureUploader.
-// More than one thread will not access this variable, so we do not need to synchronize access.
+// More than one thread will not access this variable, so we do not need to
+// synchronize access.
enne (OOO) 2012/10/22 20:36:14 Please do not update style along with behavior cha
sheu 2012/10/22 21:31:59 I thought this would be small enough to slip in.
static double estimatedTexturesPerSecondGlobal = 48.0 * 60.0;
} // anonymous namespace
@@ -61,14 +62,16 @@ void TextureUploader::Query::end()
bool TextureUploader::Query::isPending()
{
unsigned available = 1;
- m_context->getQueryObjectuivEXT(m_queryId, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
+ m_context->getQueryObjectuivEXT(m_queryId, GL_QUERY_RESULT_AVAILABLE_EXT,
+ &available);
return !available;
}
unsigned TextureUploader::Query::value()
{
if (!m_hasValue) {
- m_context->getQueryObjectuivEXT(m_queryId, GL_QUERY_RESULT_EXT, &m_value);
+ m_context->getQueryObjectuivEXT(m_queryId, GL_QUERY_RESULT_EXT,
+ &m_value);
m_hasValue = true;
}
return m_value;
@@ -123,7 +126,8 @@ double TextureUploader::estimatedTexturesPerSecond()
{
processQueries();
- // The history should never be empty because we initialize all elements with an estimate.
+ // The history should never be empty because we initialize all elements with
+ // an estimate.
DCHECK(m_texturesPerSecondHistory.size() == uploadHistorySize);
// Sort the history and use the median as our estimate.
@@ -131,8 +135,10 @@ double TextureUploader::estimatedTexturesPerSecond()
m_texturesPerSecondHistory.end());
std::sort(sortedHistory.begin(), sortedHistory.end());
- estimatedTexturesPerSecondGlobal = sortedHistory[sortedHistory.size() * 2 / 3];
- TRACE_COUNTER1("cc", "estimatedTexturesPerSecond", estimatedTexturesPerSecondGlobal);
+ estimatedTexturesPerSecondGlobal =
+ sortedHistory[sortedHistory.size() * 2 / 3];
+ TRACE_COUNTER1("cc", "estimatedTexturesPerSecond",
+ estimatedTexturesPerSecondGlobal);
return estimatedTexturesPerSecondGlobal;
}
@@ -212,10 +218,27 @@ void TextureUploader::uploadWithTexSubImage(const uint8_t* image,
source_rect.y() - image_rect.y());
const uint8_t* pixel_source;
+
+ unsigned int components_per_pixel = 0;
+ unsigned int bytes_per_component = 1;
+ switch (format) {
enne (OOO) 2012/10/22 20:36:14 Can you not duplicate this switch statement from b
sheu 2012/10/22 21:31:59 Done.
+ case GL_RGBA:
+ case GL_BGRA_EXT:
+ components_per_pixel = 4;
+ break;
+ case GL_LUMINANCE:
+ components_per_pixel = 1;
+ break;
+ default:
+ NOTREACHED();
+ }
+ unsigned int bytes_per_pixel = components_per_pixel * bytes_per_component;
+
if (image_rect.width() == source_rect.width() && !offset.x()) {
- pixel_source = &image[4 * offset.y() * image_rect.width()];
+ pixel_source = &image[bytes_per_pixel * offset.y() * image_rect.width()];
} else {
- size_t needed_size = source_rect.width() * source_rect.height() * 4;
+ size_t needed_size =
+ source_rect.width() * source_rect.height() * bytes_per_pixel;
if (m_subImageSize < needed_size) {
m_subImage.reset(new uint8_t[needed_size]);
m_subImageSize = needed_size;
@@ -223,10 +246,10 @@ void TextureUploader::uploadWithTexSubImage(const uint8_t* image,
// Strides not equal, so do a row-by-row memcpy from the
// paint results into a temp buffer for uploading.
for (int row = 0; row < source_rect.height(); ++row)
- memcpy(&m_subImage[source_rect.width() * 4 * row],
- &image[4 * (offset.x() +
+ memcpy(&m_subImage[source_rect.width() * bytes_per_pixel * row],
+ &image[bytes_per_pixel * (offset.x() +
(offset.y() + row) * image_rect.width())],
- source_rect.width() * 4);
+ source_rect.width() * bytes_per_pixel);
pixel_source = &m_subImage[0];
}
@@ -296,6 +319,7 @@ void TextureUploader::uploadWithMapTexSubImage(const uint8_t* image,
}
unsigned int components_per_pixel = 0;
+ unsigned int bytes_per_component = 1;
switch (format) {
case GL_RGBA:
case GL_BGRA_EXT:
@@ -307,7 +331,6 @@ void TextureUploader::uploadWithMapTexSubImage(const uint8_t* image,
default:
NOTREACHED();
}
- unsigned int bytes_per_component = 1;
unsigned int bytes_per_pixel = components_per_pixel * bytes_per_component;
if (image_rect.width() == source_rect.width() && !offset.x()) {
@@ -319,7 +342,7 @@ void TextureUploader::uploadWithMapTexSubImage(const uint8_t* image,
// paint results into the pixelDest
for (int row = 0; row < source_rect.height(); ++row)
memcpy(&pixel_dest[source_rect.width() * row * bytes_per_pixel],
- &image[4 * (offset.x() +
+ &image[bytes_per_pixel * (offset.x() +
(offset.y() + row) * image_rect.width())],
source_rect.width() * bytes_per_pixel);
}
@@ -334,7 +357,8 @@ void TextureUploader::processQueries()
break;
unsigned usElapsed = m_pendingQueries.first()->value();
- HISTOGRAM_CUSTOM_COUNTS("Renderer4.TextureGpuUploadTimeUS", usElapsed, 0, 100000, 50);
+ HISTOGRAM_CUSTOM_COUNTS("Renderer4.TextureGpuUploadTimeUS", usElapsed,
+ 0, 100000, 50);
if (!m_pendingQueries.first()->isNonBlocking())
m_numBlockingTextureUploads--;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698