summaryrefslogtreecommitdiffstats
path: root/libs/rs
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-02-23 17:44:28 -0800
committerJason Sams <rjsams@android.com>2010-02-23 17:44:28 -0800
commitc2908e60c9b021fb4bb69acff8d49981dd4dade8 (patch)
tree7b719d7ca8dc804e2906df1d38022ea4f9c22c50 /libs/rs
parent7eecbf2085bcfe475daf68090a1a4f47fbb6ec72 (diff)
downloadframeworks_base-c2908e60c9b021fb4bb69acff8d49981dd4dade8.zip
frameworks_base-c2908e60c9b021fb4bb69acff8d49981dd4dade8.tar.gz
frameworks_base-c2908e60c9b021fb4bb69acff8d49981dd4dade8.tar.bz2
Support defered generation of mipmaps. With this change we support mipmap generation when the texture is uploaded to GL without requiring RS to retain the full chain.
Diffstat (limited to 'libs/rs')
-rw-r--r--libs/rs/rs.spec1
-rw-r--r--libs/rs/rsAllocation.cpp12
-rw-r--r--libs/rs/rsAllocation.h3
-rw-r--r--libs/rs/rsScriptC_Lib.cpp2
4 files changed, 13 insertions, 5 deletions
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 10e5285..89d9d5e 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -113,6 +113,7 @@ AllocationCreateFromBitmapBoxed {
AllocationUploadToTexture {
param RsAllocation alloc
+ param bool genMipMaps
param uint32_t baseMipLevel
}
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index 1ae2317..f1798de 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -17,6 +17,7 @@
#include "rsContext.h"
#include <GLES/gl.h>
+#include <GLES2/gl2.h>
#include <GLES/glext.h>
using namespace android;
@@ -88,12 +89,13 @@ bool Allocation::fixAllocation()
return false;
}
-void Allocation::deferedUploadToTexture(const Context *rsc, uint32_t lodOffset)
+void Allocation::deferedUploadToTexture(const Context *rsc, bool genMipmap, uint32_t lodOffset)
{
rsAssert(lodOffset < mType->getLODCount());
mIsTexture = true;
mTextureLOD = lodOffset;
mUploadDefered = true;
+ mTextureGenMipmap = !mType->getDimLOD() && genMipmap;
}
void Allocation::uploadToTexture(const Context *rsc)
@@ -138,6 +140,10 @@ void Allocation::uploadToTexture(const Context *rsc)
adapt.getDimX(), adapt.getDimY(),
0, format, type, ptr);
}
+ if (mTextureGenMipmap) {
+ glGenerateMipmap(GL_TEXTURE_2D);
+ }
+
}
void Allocation::deferedUploadToBufferObject(const Context *rsc)
@@ -316,10 +322,10 @@ RsAllocation rsi_AllocationCreateSized(Context *rsc, RsElement e, size_t count)
return rsi_AllocationCreateTyped(rsc, type);
}
-void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, uint32_t baseMipLevel)
+void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel)
{
Allocation *alloc = static_cast<Allocation *>(va);
- alloc->deferedUploadToTexture(rsc, baseMipLevel);
+ alloc->deferedUploadToTexture(rsc, genmip, baseMipLevel);
}
void rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va)
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index f0b2122..778c904 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -46,7 +46,7 @@ public:
void * getPtr() const {return mPtr;}
const Type * getType() const {return mType.get();}
- void deferedUploadToTexture(const Context *rsc, uint32_t lodOffset);
+ void deferedUploadToTexture(const Context *rsc, bool genMipmap, uint32_t lodOffset);
void uploadToTexture(const Context *rsc);
uint32_t getTextureID() const {return mTextureID;}
@@ -98,6 +98,7 @@ protected:
// Is this a legal structure to be used as a texture source.
// Initially this will require 1D or 2D and color data
bool mIsTexture;
+ bool mTextureGenMipmap;
uint32_t mTextureLOD;
uint32_t mTextureID;
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 6b8ed0d..235c153 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -975,7 +975,7 @@ static void SC_hsb(float h, float s, float b, float a)
static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
{
GET_TLS();
- rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
+ rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
}
static void SC_uploadToBufferObject(RsAllocation va)