summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/esUtil.h3
-rw-r--r--src/vg/Api.cpp9
-rw-r--r--src/vg/EGLAddOn.cpp39
-rw-r--r--tests/font/main.c34
4 files changed, 80 insertions, 5 deletions
diff --git a/include/esUtil.h b/include/esUtil.h
index c41a599..faa87fd 100644
--- a/include/esUtil.h
+++ b/include/esUtil.h
@@ -90,6 +90,9 @@ typedef struct _escontext
EGLConfig eglConfig;
void *vgContext;
+ void *rieglSurface;
+ void *rieglDisplay;
+ void *rieglContext;
/// Callbacks
void (ESCALLBACK *drawFunc) ( struct _escontext * );
diff --git a/src/vg/Api.cpp b/src/vg/Api.cpp
index 5b97a50..10dcc0d 100644
--- a/src/vg/Api.cpp
+++ b/src/vg/Api.cpp
@@ -511,7 +511,14 @@ void RI_APIENTRY vgSetiv(VGParamType type, VGint count, const VGint * values)
void RI_APIENTRY vgSetfv(VGParamType type, VGint count, const VGfloat * values)
{
- RI_GET_CONTEXT(RI_NO_RETVAL);
+ OSAcquireMutex();
+ VGContext* context = (VGContext*)eglvgGetCurrentVGContext();
+ if(!context)
+ {
+ OSReleaseMutex();
+ return RI_NO_RETVAL;
+ }
+// RI_GET_CONTEXT(RI_NO_RETVAL);
RI_IF_ERROR(count < 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
RI_IF_ERROR((!values && count > 0) || (values && !isAligned(values,4)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
setifv(context, type, count, values, true);
diff --git a/src/vg/EGLAddOn.cpp b/src/vg/EGLAddOn.cpp
index e8da666..f8d25bc 100644
--- a/src/vg/EGLAddOn.cpp
+++ b/src/vg/EGLAddOn.cpp
@@ -306,7 +306,9 @@ public:
int getNumConfigs() const { return EGL_NUMCONFIGS; }
const RIEGLConfig& getConfig(int i) const { RI_ASSERT(i >= 0 && i < EGL_NUMCONFIGS); return m_configs[i]; }
- const RIEGLConfig& getConfig(const EGLConfig config) const { for(int i=0;i<EGL_NUMCONFIGS;i++) { if(m_configs[i].m_config == config) return m_configs[i]; } RI_ASSERT(0); return m_configs[0]; }
+ const RIEGLConfig& getConfig(const EGLConfig config) const { for(int i=0;i<EGL_NUMCONFIGS;i++) { if(m_configs[i].m_config == config) return m_configs[i]; }
+ // RI_ASSERT(0);
+ return m_configs[0]; }
const EGLDisplay getID() const { return m_id; }
@@ -838,19 +840,48 @@ extern "C"
void tgOpenVGCreateContext(ESContext *esContext) {
EGL* egl = getEGL();
+ RIEGLSurface *riSurfaceDraw;
+ RIEGLDisplay *riD;
+ RIEGLContext *riC;
+ Drawable *d;
RIEGLThread* thread = egl->getThread();
- tgOpenVG::VGContext* vgctx = NULL;
- RIEGLContext* c = NULL;
+ if (!thread) {
+ thread = RI_NEW(RIEGLThread, (OSGetCurrentThreadID() ));
+ }
+
+ /* sane defaults */
+ int colorSpace = EGL_VG_COLORSPACE_sRGB;
+ int alphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE;
+ tgOpenVG::VGContext* vgctx = NULL;
try {
vgctx = RI_NEW(tgOpenVG::VGContext, (NULL)); //throws bad_alloc
- c = RI_NEW(RIEGLContext, (vgctx, esContext->eglConfig)); //throws bad_alloc
+ riC = RI_NEW(RIEGLContext, (vgctx, esContext->eglConfig)); //throws bad_alloc
+
esContext->vgContext = vgctx;
+ riD=RI_NEW(RIEGLDisplay, (esContext->eglDisplay));
+ riD->addContext(riC);
+
+ d = RI_NEW(Drawable, (riD->getConfig(esContext->eglConfig).configToDescriptor((colorSpace == EGL_VG_COLORSPACE_LINEAR) ? false : true, (alphaFormat == EGL_VG_ALPHA_FORMAT_PRE) ? true : false), esContext->width, esContext->height, riD->getConfig(esContext->eglConfig).m_samples, riD->getConfig(esContext->eglConfig).m_maskBits));
+
+ riSurfaceDraw=RI_NEW(RIEGLSurface, (esContext->eglContext, esContext->eglConfig, d, false , EGL_BACK_BUFFER));
+ riD->addSurface(riSurfaceDraw);
+
+ thread->makeCurrent(riC, riSurfaceDraw);
+ riC->getVGContext()->setDefaultDrawable(riSurfaceDraw->getDrawable());
+
+ egl->addCurrentThread(thread);
}
catch (std::bad_alloc) {
}
+
+ riC->addReference();
+ riSurfaceDraw->addReference();
+ esContext->rieglSurface=riSurfaceDraw;
+ esContext->rieglDisplay=riD;
+ esContext->rieglContext=riC;
}
diff --git a/tests/font/main.c b/tests/font/main.c
index d65cc09..10abf9a 100644
--- a/tests/font/main.c
+++ b/tests/font/main.c
@@ -476,6 +476,39 @@ GLuint CreateSimpleTexture2D( )
}
+GLuint CreateVGTexture2D(ESContext *esContext)
+{
+ // Texture object handle
+ GLuint textureId;
+
+ // 2x2 Image, 3 bytes per pixel (R, G, B)
+ // Use tightly packed data
+ glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );
+
+ // Generate a texture object
+ glGenTextures ( 1, &textureId );
+
+ // Bind the texture object
+ glBindTexture ( GL_TEXTURE_2D, textureId );
+
+ // Load the texture
+ glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGB, esContext->width, esContext->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tgTextureBuffer);
+
+ // Set the filtering mode
+ glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+
+ return textureId;
+
+}
+
+void Update(ESContext *esContext, float deltaTime) {
+ UserData *userData = esContext ->userData;
+
+ glDeleteTextures ( 1, &userData->textureId );
+ userData->textureId = CreateVGTexture2D (esContext);
+}
+
///
// Initialize the shader and program object
//
@@ -597,6 +630,7 @@ int main ( int argc, char *argv[] )
initFont();
esRegisterDrawFunc ( &esContext, Draw );
+ esRegisterUpdateFunc ( &esContext, Update);
esMainLoop ( &esContext );