GLuint IJK_GLES2_loadShader(GLenum shader_type, const char *shader_source) { assert(shader_source); GLuint shader = glCreateShader(shader_type); IJK_GLES2_checkError("glCreateShader"); if (!shader) return 0; assert(shader_source); glShaderSource(shader, 1, &shader_source, NULL); IJK_GLES2_checkError_TRACE("glShaderSource"); glCompileShader(shader); IJK_GLES2_checkError_TRACE("glCompileShader"); GLint compile_status = 0; glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); if (!compile_status) goto fail; return shader; fail: if (shader) { IJK_GLES2_printShaderInfo(shader); glDeleteShader(shader); } return 0; }
static EGLBoolean IJK_EGL_prepareRenderer(IJK_EGL* egl, SDL_VoutOverlay *overlay) { assert(egl); assert(egl->opaque); IJK_EGL_Opaque *opaque = egl->opaque; // FIXME: check render against overlay if (!IJK_GLES2_Renderer_isValid(opaque->renderer)) { opaque->renderer = IJK_GLES2_Renderer_create(overlay); if (!opaque->renderer) { ALOGE("[EGL] Could not create render."); return EGL_FALSE; } if (!IJK_GLES2_Renderer_use(opaque->renderer)) { ALOGE("[EGL] Could not use render."); IJK_GLES2_Renderer_freeP(&opaque->renderer); return EGL_FALSE; } } if (!IJK_EGL_setSurfaceSize(egl, overlay->w, overlay->h)) { ALOGE("[EGL] IJK_EGL_setSurfaceSize(%d, %d) failed\n", overlay->w, overlay->h); return EGL_FALSE; } glViewport(0, 0, egl->width, egl->height); IJK_GLES2_checkError_TRACE("glViewport"); return EGL_TRUE; }
static GLboolean rgb_use(IJK_GLES2_Renderer *renderer) { ALOGI("use render rgb\n"); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glUseProgram(renderer->program); IJK_GLES2_checkError_TRACE("glUseProgram"); if (0 == renderer->plane_textures[0]) glGenTextures(1, renderer->plane_textures); for (int i = 0; i < 1; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, renderer->plane_textures[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i(renderer->us2_sampler[i], i); } return GL_TRUE; }
IJK_GLES2_Renderer *IJK_GLES2_Renderer_create_rgb565() { ALOGI("create render rgb565\n"); IJK_GLES2_Renderer *renderer = IJK_GLES2_Renderer_create_base(IJK_GLES2_getFragmentShader_rgb()); if (!renderer) goto fail; renderer->us2_sampler[0] = glGetUniformLocation(renderer->program, "us2_SamplerX"); IJK_GLES2_checkError_TRACE("glGetUniformLocation(us2_SamplerX)"); renderer->func_use = rgb_use; renderer->func_getBufferWidth = rgb565_getBufferWidth; renderer->func_uploadTexture = rgb565_uploadTexture; return renderer; fail: IJK_GLES2_Renderer_free(renderer); return NULL; }