मैं ओपनजीएल ईएस 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 सी प्राप्त कर सकता हूं, तो यह भी सहायक होगा।
कभी सोची सपने में मैं कल्पना होगा अल बंडी C++ लेखन कोड ... –