Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9d2ba9 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Minimize texture binds when drawing text" into jb-mr2-dev

parents 2d18e52b 115096f5
Loading
Loading
Loading
Loading
+15 −14
Original line number Diff line number Diff line
@@ -378,9 +378,9 @@ void FontRenderer::checkInit() {

void FontRenderer::updateDrawParams() {
    if (mCurrentQuadIndex != mLastQuadIndex) {
        mDrawOffsets.add((uint16_t*)(mLastQuadIndex * sizeof(uint16_t) * 6));
        mDrawCounts.add(mCurrentQuadIndex - mLastQuadIndex);
        mDrawCacheTextures.add(mCurrentCacheTexture);
        uint16_t* offset = (uint16_t*)(mLastQuadIndex * sizeof(uint16_t) * 6);
        uint32_t count = mCurrentQuadIndex - mLastQuadIndex;
        mDrawBatch.add(TextBatch(offset, count, mCurrentCacheTexture));
        mLastQuadIndex = mCurrentQuadIndex;
    }
}
@@ -438,26 +438,27 @@ void FontRenderer::issueDrawCommand() {
        caches.bindTexCoordsVertexPointer(force, buffer + offset);
    }

    for (uint32_t i = 0; i < mDrawOffsets.size(); i++) {
        uint16_t* offset = mDrawOffsets[i];
        uint32_t count = mDrawCounts[i];
        CacheTexture* texture = mDrawCacheTextures[i];

    caches.activeTexture(0);
        glBindTexture(GL_TEXTURE_2D, texture->getTextureId());
    GLuint lastId = 0;

    for (uint32_t i = 0; i < mDrawBatch.size(); i++) {
        const TextBatch& batch = mDrawBatch[i];

        texture->setLinearFiltering(mLinearFiltering, false);
        GLuint id = batch.texture->getTextureId();
        if (id != lastId) {
            glBindTexture(GL_TEXTURE_2D, id);
            batch.texture->setLinearFiltering(mLinearFiltering, false);
            lastId = id;
        }

        glDrawElements(GL_TRIANGLES, count * 6, GL_UNSIGNED_SHORT, offset);
        glDrawElements(GL_TRIANGLES, batch.count * 6, GL_UNSIGNED_SHORT, batch.offset);
    }

    mDrawn = true;

    mCurrentQuadIndex = 0;
    mLastQuadIndex = 0;
    mDrawOffsets.clear();
    mDrawCounts.clear();
    mDrawCacheTextures.clear();
    mDrawBatch.clear();
}

void FontRenderer::appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
+27 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include "font/CacheTexture.h"
#include "font/CachedGlyphInfo.h"
#include "font/Font.h"
#include "utils/SortedList.h"
#include "Matrix.h"
#include "Properties.h"

@@ -180,9 +181,32 @@ private:

    bool mLinearFiltering;

    Vector<uint16_t*> mDrawOffsets;
    Vector<uint32_t> mDrawCounts;
    Vector<CacheTexture*> mDrawCacheTextures;
    struct TextBatch {
        TextBatch(): offset(NULL), count(0), texture(NULL) {
        }

        TextBatch(uint16_t* offset, uint32_t count, CacheTexture* texture):
                offset(offset), count(count), texture(texture) {
        }

        static int compare(const TextBatch& lhs, const TextBatch& rhs) {
            return lhs.texture->getTextureId() - rhs.texture->getTextureId();
        }

        friend inline int strictly_order_type(const TextBatch& lhs, const TextBatch& rhs) {
            return compare(lhs, rhs) < 0;
        }

        friend inline int compare_type(const TextBatch& lhs, const TextBatch& rhs) {
            return compare(lhs, rhs);
        }

        uint16_t* offset;
        uint32_t count;
        CacheTexture* texture;
    };

    SortedList<TextBatch> mDrawBatch;

    // RS constructs
    sp<RSC::RS> mRs;
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ enum DebugLevel {
#define PROPERTY_FBO_CACHE_SIZE "ro.hwui.fbo_cache_size"

// These properties are defined in percentage (range 0..1)
#define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flush_rate"
#define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flushrate"

// These properties are defined in pixels
#define PROPERTY_TEXT_SMALL_CACHE_WIDTH "ro.hwui.text_small_cache_width"
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
///////////////////////////////////////////////////////////////////////////////

#define DEFAULT_TEXT_SMALL_CACHE_WIDTH 1024
#define DEFAULT_TEXT_SMALL_CACHE_HEIGHT 256
#define DEFAULT_TEXT_SMALL_CACHE_HEIGHT 512
#define DEFAULT_TEXT_LARGE_CACHE_WIDTH 2048
#define DEFAULT_TEXT_LARGE_CACHE_HEIGHT 512