2012-09-15 18 views
5

मैं ओपनजीएल ईएस 2.0, और एंड्रॉइड एनडीके आर 8 बी का उपयोग कर रहा हूं। मेरे पास एक साझा संदर्भ है जिसे मैं वर्कर थ्रेड के लिए उपयोग करता हूं। जब मैं eglMakeCurrent का उपयोग करके एक वर्कर थ्रेड में साझा संदर्भ को बाध्य करने का प्रयास करता हूं, तो मुझे त्रुटि EGL_BAD_ALLOC मिलती है।eglMakeCurrent EGL_BAD_ALLOC के साथ विफल क्यों है?

अब मुझे भ्रमित करने वाला यह है कि यह कोड पहले से काम कर रहा था .. और मुझे यकीन नहीं है कि मैंने इसे तोड़ने के लिए क्या किया है .. ईजीएल दस्तावेज़ कहते हैं कि इस त्रुटि को संसाधनों के साथ अनुपलब्ध होना है, लेकिन मैं हूं एक ही ऐप चला रहा है जो इस सटीक डिवाइस पर पूरी तरह से काम करता था, और सभी बनावट मुख्य धागे से ठीक से लोड होती हैं।


तो इस त्रुटि का कारण क्या हो सकता है?

यह मेरा EGL आरंभीकरण है:

bool Initialize(void *displaySurface) 
{ 
    assert(displaySurface); 
    ANativeWindow *window = (ANativeWindow*)displaySurface; 

    EGLint dummy, format; 

    display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 

    eglInitialize(display, 0, 0); 

    const EGLint configAttribs[] = 
    { 
     EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
     EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_ALPHA_SIZE, 8, 
     EGL_BUFFER_SIZE, 32, 
     EGL_DEPTH_SIZE, 24, 
     EGL_NONE 
    }; 

    const EGLint auxConfigAttribs[] = 
    { 
     EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 
     EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_ALPHA_SIZE, 8, 
     EGL_BUFFER_SIZE, 32, 
     EGL_DEPTH_SIZE, 24, 
     EGL_NONE 
    }; 

    EGLint contextAttribs[] = 
    { 
     EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE 
    }; 

    EGLint numConfigs; 
    EGLConfig config; 

//// create main context 
    eglChooseConfig(display, configAttribs, &config, 1, &numConfigs); 
    Trace("eglChooseConfig: " + GetEglError()); 

    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); 
    Trace("eglGetConfigAttrib: " + GetEglError()); 

    ANativeWindow_setBuffersGeometry(window, 0, 0, format); 
    Trace("ANativeWindow_setBuffersGeometry: " + GetEglError()); 

    surface = eglCreateWindowSurface(display, config, window, NULL); 
    Trace("eglCreateWindowSurface: " + GetEglError()); 

    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); 
    Trace("eglCreateContext: " + GetEglError()); 

//// create auxiliary context 
    eglChooseConfig(display, auxConfigAttribs, &config, 1, &numConfigs); 
    Trace("AUX eglChooseConfig: " + GetEglError()); 

    auxSurface = eglCreatePbufferSurface(display, config, NULL); 
    Trace("AUX eglCreatePbufferSurface: " + GetEglError()); 

    auxContext = eglCreateContext(display, config, context, contextAttribs); 
    Trace("AUX eglCreateContext: " + GetEglError()); 

//// make main context current 
    eglMakeCurrent(display, surface, surface, context); 
    Trace("eglMakeCurrent: " + GetError()); 

    eglQuerySurface(display, surface, EGL_WIDTH, &width); 
    eglQuerySurface(display, surface, EGL_HEIGHT, &height); 

    SetViewport(width, height); 

    EnableDepthBuffer(enableDepthTest); 
    EnableBackfaceCulling(enableBackfaceCull); 
    SetBackgroundColor(backgroundColor); 

    glDisable(GL_DITHER); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    Trace("finished" + GetEglError()); 

    alive = true; 

    return true; 
} 

संपादित करें: मैं गलत हो सकता है, लेकिन इस त्रुटि एक ही समय NDK toolchain अद्यतन किया गया था पर दिखाई दिया है लगता है ... लेकिन मैं परीक्षण नहीं कर सकते यह सिद्धांत क्योंकि मेरे पास अब एनडीके की कोई पुरानी प्रतियां नहीं हैं .. इसलिए यदि किसी के पास कोई लिंक है जहां मैं एनडीके 7 सी प्राप्त कर सकता हूं, तो यह भी सहायक होगा।

+1

कभी सोची सपने में मैं कल्पना होगा अल बंडी C++ लेखन कोड ... –

उत्तर

8

ठीक है, ऐसा लगता है कि समस्या यह थी कि PBuffer को काम करने के लिए कम से कम 1x1 पिक्सल होने की आवश्यकता है, और डिफ़ॉल्ट EGL_WIDTH और EGL_HEIGHT के लिए 0 है।

जीतने configurtation:

bool Initialize(void *displaySurface) 
{ 
    assert(displaySurface); 
    ANativeWindow *window = (ANativeWindow*)displaySurface; 

    EGLint dummy, format; 

    display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 

    eglInitialize(display, 0, 0); 

    EGLint contextAttribs[] = 
    { 
     EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE 
    }; 

//// create main context 
    const EGLint configAttribs[] = 
    { 
     EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
     EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_ALPHA_SIZE, 8, 
     EGL_BUFFER_SIZE, 32, 
     EGL_DEPTH_SIZE, 24, 
     EGL_NONE 
    }; 

    EGLint numConfigs; 
    EGLConfig config; 

    eglChooseConfig(display, configAttribs, &config, 1, &numConfigs); 
    Trace("eglChooseConfig: " + GetEglError()); 

    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); 
    Trace("eglGetConfigAttrib: " + GetEglError()); 

    ANativeWindow_setBuffersGeometry(window, 0, 0, format); 
    Trace("ANativeWindow_setBuffersGeometry: " + GetEglError()); 

    surface = eglCreateWindowSurface(display, config, window, NULL); 
    Trace("eglCreateWindowSurface: " + GetEglError()); 

    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); 
    Trace("eglCreateContext: " + GetEglError()); 

//// create auxiliary context 

    const EGLint auxConfigAttribs[] = 
    { 
     EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_ALPHA_SIZE, 0, 
     EGL_DEPTH_SIZE, 0, 
     EGL_STENCIL_SIZE, 0, 
     EGL_NONE 
    }; 

    EGLint pbufferAttribs[] = 
    { 
     EGL_WIDTH, 1, 
     EGL_HEIGHT, 1, 
     EGL_TEXTURE_TARGET, EGL_NO_TEXTURE, 
     EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE, 
     EGL_NONE 
    }; 

    EGLint auxNumConfigs; 
    EGLConfig auxConfig; 

    eglChooseConfig(display, auxConfigAttribs, &auxConfig, 1, &auxNumConfigs); 
    Trace("AUX eglChooseConfig: " + GetEglError()); 

    auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs); 
    Trace("AUX eglCreatePbufferSurface: " + GetEglError()); 

    auxContext = eglCreateContext(display, auxConfig, context, contextAttribs); 
    Trace("AUX eglCreateContext: " + GetEglError()); 

//// make main context current 
    eglMakeCurrent(display, surface, surface, context); 
    Trace("eglMakeCurrent main: " + GetError()); 

    eglQuerySurface(display, surface, EGL_WIDTH, &width); 
    eglQuerySurface(display, surface, EGL_HEIGHT, &height); 

    SetViewport(width, height); 

    EnableDepthBuffer(enableDepthTest); 
    EnableBackfaceCulling(enableBackfaceCull); 
    SetBackgroundColor(backgroundColor); 

    glDisable(GL_DITHER); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    Trace("finished" + GetEglError()); 

    alive = true; 

    return true; 
} 
संबंधित मुद्दे