<div dir="ltr"><div>Hi,</div><div>I'm using Mesa 9.1, EGL and xcb, to make texture from pixmap.</div><div>Using EGL_KHR_image_pixmap,  i get errors in textures.</div><div>I have also checked texture_from_pixmap in the EGL demos, and the demo not work.</div>
<div><br></div>
<div>I have no errors with Mesa 9.0,  my test code and demo work well.</div><div><br></div><div><div><br></div><div>Test code:</div><div><br></div><div>// gcc -Wall -O3 egl-xcb-texture.c -o egl-xcb-texture  -lEGL -lGLESv1_CM -lGLESv2 -lxcb -lxcb-util</div>

<div><br></div><div>#include <xcb/xcb.h></div><div>#include <xcb/xcb_util.h></div><div><br></div><div>#include <GLES/gl.h></div>
<div>#include <GLES/glext.h></div><div>#include <GLES2/gl2.h></div><div>#include <GLES2/gl2ext.h></div><div>//#include <GLES3/gl3.h></div><div>//#include <GLES3/gl3ext.h></div><div>#include <EGL/egl.h></div>

<div>#include <EGL/eglext.h></div><div><br></div><div>#include <stdio.h></div><div>#include <stdlib.h></div><div>#include <string.h></div><div><br></div><div><br></div><div><br></div><div>float vert_tex_data[] = { 1.00f, 1.00f, 0.00f,        // Position 0</div>

<div>                          1.00f, 1.00f,               // TexCoord 0 </div><div>                          -1.00f, 1.00f, 0.00f,        // Position 1</div><div>                          0.00f,  1.00f,                // TexCoord 1</div>

<div>                          -1.00f, -1.00f, 0.00f,       // Position 2</div><div>                          0.00f,  0.00f,               // TexCoord 2</div><div>                          1.00f, -1.00f, 0.00f,       // Position 3</div>

<div>                          1.00f,  0.00f};            // TexCoord 3</div><div><br></div><div>const GLushort index_data[] = {0, 1, 2,</div><div>                               2, 3, 0,};</div><div><br></div><div><br></div>

<div>struct ctx_t {</div><div><span style="white-space:pre-wrap">     </span>xcb_connection_t<span style="white-space:pre-wrap">        </span>*conn;</div><div><span style="white-space:pre-wrap">   </span>int <span style="white-space:pre-wrap">                    </span>num_scr;</div>

<div><span style="white-space:pre-wrap">  </span>xcb_screen_t<span style="white-space:pre-wrap">            </span>*screen;</div><div><span style="white-space:pre-wrap"> </span>const xcb_setup_t<span style="white-space:pre-wrap">       </span>*setup;</div>

<div><span style="white-space:pre-wrap">          </span></div><div><span style="white-space:pre-wrap"> </span>xcb_generic_event_t<span style="white-space:pre-wrap">     </span>*xcb_event;</div><div><br></div><div><span style="white-space:pre-wrap">     </span>xcb_window_t <span style="white-space:pre-wrap">           </span>window;</div>

<div><span style="white-space:pre-wrap">  </span>xcb_pixmap_t<span style="white-space:pre-wrap">            </span>xpix;</div><div><span style="white-space:pre-wrap">    </span>GLuint                  texture_a;</div><div><span style="white-space:pre-wrap">       </span>GLuint                  texture_b;</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>EGLDisplay<span style="white-space:pre-wrap">              </span>egl_dpy;</div><div><span style="white-space:pre-wrap"> </span>EGLConfig  <span style="white-space:pre-wrap">             </span>egl_cfg;</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>EGLContext              egl_context;</div><div>        EGLSurface              egl_surface;</div><div>        GLuint                  shader_program;</div>
<div><br></div><div>        GLint                   loc_v_position;</div><div>        GLint                   loc_tex_coord;</div><div>        GLint                   loc_texture;</div><div><br></div><div>        PFNEGLCREATEIMAGEKHRPROC <span style="white-space:pre-wrap">         </span>eglCreateImageKHR;</div>

<div>   <span style="white-space:pre-wrap">       </span>PFNEGLDESTROYIMAGEKHRPROC <span style="white-space:pre-wrap">              </span>eglDestroyImageKHR;</div><div>   <span style="white-space:pre-wrap">   </span>PFNGLEGLIMAGETARGETTEXTURE2DOESPROC <span style="white-space:pre-wrap">    </span>glEGLImageTargetTexture2DOES;</div>

<div>};</div><div><br></div><div><br></div><div>void new_xwindow(struct ctx_t *ctx)</div><div>{</div><div><span style="white-space:pre-wrap">     </span>uint32_t<span style="white-space:pre-wrap">        </span>values[5], mask;</div>

<div><span style="white-space:pre-wrap">  </span>xcb_colormap_t<span style="white-space:pre-wrap">  </span>colormap = 0;</div><div><span style="white-space:pre-wrap">    </span>xcb_visualtype_t *visual = NULL;</div>
<div><span style="white-space:pre-wrap">  </span>xcb_visualid_t<span style="white-space:pre-wrap">  </span>visual_id;<span style="white-space:pre-wrap">      </span></div><div><span style="white-space:pre-wrap">         </span></div>
<div><span style="white-space:pre-wrap">  </span>visual = xcb_aux_find_visual_by_attrs(ctx->screen, XCB_VISUAL_CLASS_TRUE_COLOR,<span style="white-space:pre-wrap">      </span>32);</div><div><span style="white-space:pre-wrap">     </span>visual_id = visual->visual_id;</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>colormap = xcb_generate_id(ctx->conn);</div><div><span style="white-space:pre-wrap">        </span>xcb_create_colormap(ctx->conn, XCB_COLORMAP_ALLOC_NONE, colormap, ctx->screen->root, visual_id);</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>mask =  XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;</div><div><span style="white-space:pre-wrap">      </span>values[0] = 0;</div>

<div><span style="white-space:pre-wrap">  </span>values[1] = 0; </div><div><span style="white-space:pre-wrap">  </span>values[2] = XCB_GRAVITY_NORTH_WEST;</div><div><span style="white-space:pre-wrap">      </span>values[3] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS;</div>

<div><span style="white-space:pre-wrap">  </span>values[4] = colormap;</div><div><span style="white-space:pre-wrap">    </span></div><div><span style="white-space:pre-wrap"> </span>ctx->window = xcb_generate_id(ctx->conn);</div>

<div><span style="white-space:pre-wrap">  </span>xcb_create_window(ctx->conn,</div><div><span style="white-space:pre-wrap">                  </span>  32,</div><div><span style="white-space:pre-wrap">                    </span>  ctx->window,</div>
<div><span style="white-space:pre-wrap">                  </span>  ctx->screen->root,</div><div><span style="white-space:pre-wrap">                       </span>  0,</div><div><span style="white-space:pre-wrap">                     </span>  0,</div><div><span style="white-space:pre-wrap">                     </span>  800, </div>

<div><span style="white-space:pre-wrap">                  </span>  600, </div><div><span style="white-space:pre-wrap">                  </span>  0, //border </div><div><span style="white-space:pre-wrap">                   </span>  XCB_WINDOW_CLASS_INPUT_OUTPUT,</div>

<div><span style="white-space:pre-wrap">                  </span>  visual_id,</div><div><span style="white-space:pre-wrap">                     </span>  mask,</div><div><span style="white-space:pre-wrap">                  </span>  values);</div><div><span style="white-space:pre-wrap">       </span></div>

<div><span style="white-space:pre-wrap">  </span>xcb_free_colormap(ctx->conn, colormap);</div><div><span style="white-space:pre-wrap">       </span>xcb_flush(ctx->conn);</div><div>}</div><div><br></div><div>void make_pixmap(struct ctx_t *ctx, uint16_t w, uint16_t h, uint8_t depth)</div>

<div>{</div><div><span style="white-space:pre-wrap">  </span>xcb_gcontext_t gc = 0;</div><div><span style="white-space:pre-wrap">   </span>xcb_rectangle_t rec = {0, 0, w - 1, h - 1};</div><div><span style="white-space:pre-wrap">      </span>xcb_arc_t arc[] = {{0, 0, w - 1, h - 1, 0, 90 * 64}, {0, 0, w - 1, h - 1, 90 * 64, 90 * 64}, </div>

<div><span style="white-space:pre-wrap">                  </span>   {0, 0, w - 1, h - 1, 180 * 64, 90 * 64}, {0, 0, w - 1, h - 1, 270 * 64, 90 * 64}};</div><div><span style="white-space:pre-wrap">    </span>uint32_t red = 0xff0000, yellow = 0x808000, blue = 0x0000ff, green = 0x00ff00, violet = 0xff00ff;</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>ctx->xpix = xcb_generate_id(ctx->conn);</div><div>        xcb_create_pixmap(ctx->conn, depth, ctx->xpix, ctx->screen->root, w, h);</div>
<div><br></div><div>        gc = xcb_generate_id(ctx->conn);</div><div>        xcb_create_gc(ctx->conn, gc, ctx->xpix, XCB_GC_FOREGROUND, &yellow);</div><div>        xcb_poly_fill_rectangle(ctx->conn, ctx->xpix, gc, 1, &rec);</div>

<div><br></div><div>        xcb_change_gc(ctx->conn, gc, XCB_GC_FOREGROUND, &blue);</div><div>        xcb_poly_rectangle(ctx->conn, ctx->xpix, gc, 1, &rec);</div><div><br></div><div>        xcb_change_gc(ctx->conn, gc, XCB_GC_FOREGROUND, &red);</div>

<div>        xcb_poly_fill_arc(ctx->conn, ctx->xpix, gc, 1, &arc[0]);</div><div><br></div><div>        xcb_change_gc(ctx->conn, gc, XCB_GC_FOREGROUND, &blue);</div><div>        xcb_poly_fill_arc(ctx->conn, ctx->xpix, gc, 1, &arc[1]);</div>

<div><br></div><div>        xcb_change_gc(ctx->conn, gc, XCB_GC_FOREGROUND, &green);</div><div>        xcb_poly_fill_arc(ctx->conn, ctx->xpix, gc, 1, &arc[2]);</div><div>        </div><div>        xcb_change_gc(ctx->conn, gc, XCB_GC_FOREGROUND, &violet);</div>

<div>        xcb_poly_fill_arc(ctx->conn, ctx->xpix, gc, 1, &arc[3]);</div><div><br></div><div>        xcb_copy_area(ctx->conn, ctx->xpix, ctx->window, gc, 0, 0, 0, 0, w, h);</div><div>        xcb_free_gc(ctx->conn, gc);</div>

<div>}</div><div><br></div><div>void mirror(uint8_t *src, int len, int stride, uint8_t *dst)</div><div>{</div><div><span style="white-space:pre-wrap">      </span>uint8_t *out = dst + len - stride;</div><div><span style="white-space:pre-wrap">       </span>uint8_t *in = NULL;</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>for (in = src; in < src + len; in += stride) {</div><div><span style="white-space:pre-wrap">                </span>memcpy(out, in, stride);</div><div><span style="white-space:pre-wrap">         </span>out -= stride;</div>

<div><span style="white-space:pre-wrap">  </span>}</div><div>} </div><div><br></div><div>int make_texture_b(struct ctx_t *ctx)</div><div>{<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>xcb_get_geometry_cookie_t g_cookie;</div>

<div><span style="white-space:pre-wrap">  </span>xcb_get_geometry_reply_t *g_reply = NULL;</div><div><span style="white-space:pre-wrap">        </span>uint16_t w, h;</div><div><span style="white-space:pre-wrap">   </span>xcb_get_image_cookie_t cookie;</div>

<div><span style="white-space:pre-wrap">  </span>xcb_get_image_reply_t *reply =NULL;</div><div><span style="white-space:pre-wrap">      </span>uint8_t *pixels = NULL;</div><div><span style="white-space:pre-wrap">  </span>uint8_t *buffer = NULL;</div>

<div><span style="white-space:pre-wrap">  </span>int len, stride;</div><div><span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>g_cookie = xcb_get_geometry(ctx->conn, ctx->xpix);</div>

<div><span style="white-space:pre-wrap">  </span>g_reply = xcb_get_geometry_reply(ctx->conn, g_cookie, NULL);</div><div><span style="white-space:pre-wrap">  </span>if (!g_reply) return -1;</div><div><br></div><div>
<span style="white-space:pre-wrap">     </span>w = g_reply->width;</div><div><span style="white-space:pre-wrap">   </span>h = g_reply->height;</div><div><span style="white-space:pre-wrap">  </span>free(g_reply);</div>
<div><br></div><div><span style="white-space:pre-wrap"> </span>cookie = xcb_get_image(ctx->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, ctx->xpix, 0, 0, w, h, 0xffffffff);</div><div><span style="white-space:pre-wrap">   </span>reply = xcb_get_image_reply(ctx->conn, cookie, NULL);</div>

<div><span style="white-space:pre-wrap">  </span>if (!reply) return -1;</div><div><br></div><div><span style="white-space:pre-wrap">  </span>pixels = xcb_get_image_data(reply);</div><div><span style="white-space:pre-wrap">      </span>len = xcb_get_image_data_length(reply);</div>

<div><br></div><div><span style="white-space:pre-wrap"> </span>stride = w * 4;</div><div><span style="white-space:pre-wrap">  </span>buffer = malloc(len);</div><div><span style="white-space:pre-wrap">    </span>mirror(pixels, len, stride, buffer);</div>

<div><span style="white-space:pre-wrap">  </span>free(reply);</div><div><br></div><div><span style="white-space:pre-wrap">    </span>glGenTextures(1, &ctx->texture_b); </div><div>        glBindTexture(GL_TEXTURE_2D, ctx->texture_b); </div>

<div>        </div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);</div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);</div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);</div>

<div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);</div><div><br></div><div>        glTexImage2D(GL_TEXTURE_2D, </div><div>                     0, </div><div>                     GL_BGRA_EXT, </div>

<div>                     w,</div><div>                     h, </div><div>                     0, </div><div>                     GL_BGRA_EXT, </div><div>                     GL_UNSIGNED_BYTE,</div><div>                     buffer);</div>

<div><br></div><div>        free(buffer);</div><div>        return 0;</div><div>}</div><div><br></div><div>void make_texture_a(struct ctx_t *ctx)</div><div>{</div><div><span style="white-space:pre-wrap">       </span>EGLImageKHR khrimg = NULL;</div>

<div><span style="white-space:pre-wrap">  </span>const EGLint attr[] = {<span style="white-space:pre-wrap"> </span>EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,</div><div><span style="white-space:pre-wrap">                               </span>//EGL_GL_TEXTURE_LEVEL_KHR, 0, // mip map level to reference</div>

<div><span style="white-space:pre-wrap">                          </span>EGL_NONE};</div><div><br></div><div><span style="white-space:pre-wrap">      </span>khrimg = ctx->eglCreateImageKHR(ctx->egl_dpy, </div><div><span style="white-space:pre-wrap">     </span>                                EGL_NO_CONTEXT, </div>

<div><span style="white-space:pre-wrap">  </span>                                EGL_NATIVE_PIXMAP_KHR, </div><div><span style="white-space:pre-wrap">  </span>                                (EGLClientBuffer)(uintptr_t)ctx->xpix, </div>

<div><span style="white-space:pre-wrap">  </span>                                attr);</div><div><br></div><div><span style="white-space:pre-wrap">  </span>glGenTextures(1, &ctx->texture_a); </div><div>        glBindTexture(GL_TEXTURE_2D, ctx->texture_a); </div>

<div>        </div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);</div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);</div><div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);</div>

<div>        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);</div><div>        </div><div>        ctx->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)khrimg);</div><div>        ctx->eglDestroyImageKHR(ctx->egl_dpy, khrimg);</div>

<div>}</div><div><br></div><div>void init_xcb(struct ctx_t *ctx)</div><div>{</div><div><span style="white-space:pre-wrap">  </span>ctx->conn = xcb_connect(NULL, &ctx->num_scr);</div><div><span style="white-space:pre-wrap">  </span>ctx->screen = xcb_aux_get_screen(ctx->conn, ctx->num_scr);</div>

<div><span style="white-space:pre-wrap">  </span>ctx->setup = xcb_get_setup(ctx->conn);</div><div><span style="white-space:pre-wrap">     </span>xcb_flush(ctx->conn);</div><div>}</div><div><br></div><div>void init_egl(struct ctx_t *ctx)</div>

<div>{</div><div><span style="white-space:pre-wrap">  </span>EGLint attr[] = {EGL_BUFFER_SIZE, 32,</div><div>      <span style="white-space:pre-wrap">                      </span> EGL_RED_SIZE, 8,</div><div>        <span style="white-space:pre-wrap">                </span> EGL_GREEN_SIZE, 8,</div>

<div>        <span style="white-space:pre-wrap">          </span> EGL_BLUE_SIZE, 8,</div><div>        <span style="white-space:pre-wrap">               </span> EGL_ALPHA_SIZE, 8,</div><div>      <span style="white-space:pre-wrap">                        </span> EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT | EGL_OPENGL_BIT,</div>

<div>      <span style="white-space:pre-wrap">                    </span> EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PIXMAP_BIT,</div><div>      <span style="white-space:pre-wrap">                        </span> EGL_MATCH_NATIVE_PIXMAP, (GLint)ctx->screen->root,</div>

<div>      <span style="white-space:pre-wrap">                    </span> EGL_NONE};</div><div> </div><div>  <span style="white-space:pre-wrap">    </span>//ctx->egl_dpy  =  eglGetDisplay((EGLNativeDisplayType)NULL);</div><div>  <span style="white-space:pre-wrap">       </span>ctx->egl_dpy  =  eglGetDisplay(EGL_DEFAULT_DISPLAY);</div>

<div>   <span style="white-space:pre-wrap">       </span>eglInitialize(ctx->egl_dpy, NULL, NULL);</div><div><br></div><div>   <span style="white-space:pre-wrap">  </span>EGLint     num_config;</div><div>   <span style="white-space:pre-wrap">        </span>eglChooseConfig(ctx->egl_dpy, attr, &ctx->egl_cfg, 1, &num_config);</div>

<div>    </div><div>   <span style="white-space:pre-wrap">    </span>ctx->egl_surface = eglCreateWindowSurface(ctx->egl_dpy, ctx->egl_cfg, ctx->window, NULL);</div><div>        ctx->egl_context = eglCreateContext(ctx->egl_dpy, </div>

<div>                                            ctx->egl_cfg, </div><div>                                            EGL_NO_CONTEXT, </div><div>                                            (EGLint[]){EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE});</div>

<div>                     </div><div>        eglMakeCurrent(ctx->egl_dpy, ctx->egl_surface, ctx->egl_surface, ctx->egl_context);</div><div><br></div><div>        eglBindAPI(EGL_OPENGL_ES_API);</div><div><br></div>

<div>        ctx->eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR");</div><div><span style="white-space:pre-wrap">   </span>ctx->eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR");</div>

<div><span style="white-space:pre-wrap">  </span>ctx->glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) eglGetProcAddress("glEGLImageTargetTexture2DOES");</div><div>}</div><div><br></div>
<div>void init_shaders(struct ctx_t *ctx)</div><div>{</div><div><span style="white-space:pre-wrap">       </span>const char *vertx_src = "<span style="white-space:pre-wrap">                  </span>\</div><div><span style="white-space:pre-wrap">                </span>attribute vec4 v_position;  <span style="white-space:pre-wrap">            </span>\</div>

<div><span style="white-space:pre-wrap">          </span>attribute vec2 tex_coord; <span style="white-space:pre-wrap">              </span>\</div><div><span style="white-space:pre-wrap">                </span>varying mediump vec2 v_tex_coord;<span style="white-space:pre-wrap">       </span>\</div>

<div>   <span style="white-space:pre-wrap">                                                       </span>\</div><div><span style="white-space:pre-wrap">                </span>void main()                          <span style="white-space:pre-wrap">   </span>\</div><div><span style="white-space:pre-wrap">                </span>{                                    <span style="white-space:pre-wrap">   </span>\</div>

<div><span style="white-space:pre-wrap">                  </span>gl_Position = v_position;  <span style="white-space:pre-wrap">     </span>\</div><div>      <span style="white-space:pre-wrap">                  </span>v_tex_coord = tex_coord; <span style="white-space:pre-wrap">       </span>\</div>

<div><span style="white-space:pre-wrap">          </span>}";</div><div><br></div><div><span style="white-space:pre-wrap">        </span>const char *frag_src = "<span style="white-space:pre-wrap">                                   </span>\</div>
<div><span style="white-space:pre-wrap">          </span>varying mediump vec2 v_tex_coord;  <span style="white-space:pre-wrap">                     </span>\</div><div><span style="white-space:pre-wrap">                </span>uniform sampler2D texture;<span style="white-space:pre-wrap">                              </span>\</div>

<div><span style="white-space:pre-wrap">                          </span> <span style="white-space:pre-wrap">                                       </span>\</div><div><span style="white-space:pre-wrap">                </span>void  main()<span style="white-space:pre-wrap">                                            </span>\</div>

<div><span style="white-space:pre-wrap">          </span>{<span style="white-space:pre-wrap">                                                       </span>\</div><div><span style="white-space:pre-wrap">                        </span>gl_FragColor = texture2D(texture, v_tex_coord);<span style="white-space:pre-wrap"> </span>\</div>

<div><span style="white-space:pre-wrap">          </span>}";</div><div><br></div><div><span style="white-space:pre-wrap">        </span>GLuint vertex_shader, fragment_shader; </div><div><br></div><div><span style="white-space:pre-wrap"> </span>ctx->shader_program = glCreateProgram();</div>

<div><br></div><div>   <span style="white-space:pre-wrap">      </span>vertex_shader = glCreateShader(GL_VERTEX_SHADER);</div><div>    <span style="white-space:pre-wrap">    </span>glShaderSource(vertex_shader, 1, &vertx_src, NULL);</div>

<div>   <span style="white-space:pre-wrap">       </span>glCompileShader(vertex_shader);</div><div><br></div><div>   <span style="white-space:pre-wrap">      </span>fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);</div>
<div>    <span style="white-space:pre-wrap">      </span>glShaderSource(fragment_shader, 1, &frag_src, NULL);</div><div>   <span style="white-space:pre-wrap">      </span>glCompileShader(fragment_shader);</div><div><span style="white-space:pre-wrap">        </span></div>

<div><span style="white-space:pre-wrap">  </span>glAttachShader(ctx->shader_program, vertex_shader);            </div><div>   <span style="white-space:pre-wrap">    </span>glAttachShader(ctx->shader_program, fragment_shader);          </div>

<div> </div><div>   <span style="white-space:pre-wrap">       </span>glLinkProgram(ctx->shader_program);</div><div><br></div><div>   <span style="white-space:pre-wrap">       </span>glDetachShader(ctx->shader_program, vertex_shader);</div>

<div><span style="white-space:pre-wrap">  </span>glDetachShader(ctx->shader_program, fragment_shader);</div><div><span style="white-space:pre-wrap"> </span>glDeleteShader(vertex_shader);</div><div><span style="white-space:pre-wrap">   </span>glDeleteShader(fragment_shader);</div>

<div>}</div><div><br></div><div><br></div><div>void  render(struct ctx_t *ctx)</div><div>{</div><div><span style="white-space:pre-wrap">  </span>glClear(GL_COLOR_BUFFER_BIT);</div><div><span style="white-space:pre-wrap">    </span></div>

<div>        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, index_data);</div><div>        eglSwapBuffers(ctx->egl_dpy, ctx->egl_surface);</div><div>}</div><div><br></div><div><br></div><div>int main()</div><div>

{</div><div><span style="white-space:pre-wrap">     </span>struct ctx_t ctx;</div><div><br></div><div><span style="white-space:pre-wrap">       </span>init_xcb(&ctx);</div><div><span style="white-space:pre-wrap">      </span>new_xwindow(&ctx);</div>

<div><span style="white-space:pre-wrap">  </span>xcb_map_window(ctx.conn, ctx.window);</div><div><span style="white-space:pre-wrap">    </span>xcb_flush(ctx.conn);</div><div><br></div><div><span style="white-space:pre-wrap">    </span>make_pixmap(&ctx, 400, 200, 32);</div>

<div><span style="white-space:pre-wrap">  </span>xcb_flush(ctx.conn);</div><div><span style="white-space:pre-wrap">     </span></div><div><span style="white-space:pre-wrap"> </span>init_egl(&ctx);</div><div><span style="white-space:pre-wrap">      </span>make_texture_a(&ctx);</div>

<div><span style="white-space:pre-wrap">  </span>make_texture_b(&ctx);</div><div><br></div><div><span style="white-space:pre-wrap">       </span>init_shaders(&ctx);</div><div><br></div><div><span style="white-space:pre-wrap"> </span>glUseProgram(ctx.shader_program); </div>

<div><span style="white-space:pre-wrap">  </span>ctx.loc_v_position = glGetAttribLocation(ctx.shader_program, "v_position");</div><div>        ctx.loc_texture = glGetUniformLocation(ctx.shader_program, "texture");</div>

<div>        ctx.loc_tex_coord = glGetAttribLocation(ctx.shader_program, "tex_coord");</div><div><br></div><div>        glActiveTexture(GL_TEXTURE0);  </div><div>        glBindTexture(GL_TEXTURE_2D, ctx.texture_a);  </div>

<div>        // Set the sampler texture unit to 0</div><div>        glUniform1i(ctx.loc_texture, 0); </div><div><br></div><div>        glEnableVertexAttribArray(ctx.loc_v_position);</div><div>        glVertexAttribPointer(ctx.loc_v_position, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vert_tex_data);</div>

<div>        // set the texture coords  </div><div>        glEnableVertexAttribArray(ctx.loc_tex_coord);</div><div>        glVertexAttribPointer(ctx.loc_tex_coord, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &vert_tex_data[3]);</div>

<div><br></div><div>        glViewport(0, 0, 800, 600);</div><div>                </div><div>        xcb_flush(ctx.conn);</div><div><span style="white-space:pre-wrap">     </span>for (;;) {</div><div><span style="white-space:pre-wrap">               </span>ctx.xcb_event = xcb_wait_for_event(ctx.conn);</div>

<div><span style="white-space:pre-wrap">          </span>if (xcb_connection_has_error(ctx.conn)) goto out;</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">         </span>uint8_t ev_type; <span style="white-space:pre-wrap">               </span></div>

<div><span style="white-space:pre-wrap">          </span>ev_type = ctx.xcb_event->response_type & ~0x80;</div><div><span style="white-space:pre-wrap">           </span>if (ev_type == XCB_KEY_PRESS) {</div><div><span style="white-space:pre-wrap">                  </span>xcb_key_press_event_t *ev = (xcb_key_press_event_t *)ctx.xcb_event;</div>

<div><span style="white-space:pre-wrap">                  </span>if (ev->detail == 9) { //Esc</div><div><span style="white-space:pre-wrap">                          </span>goto out;</div><div><span style="white-space:pre-wrap">                        </span>} </div>
<div><span style="white-space:pre-wrap">                  </span>if (ev->detail == 38) { //key a</div><div><span style="white-space:pre-wrap">                               </span>glBindTexture(GL_TEXTURE_2D, ctx.texture_a); </div><div><span style="white-space:pre-wrap">                            </span>render(&ctx);</div>

<div><span style="white-space:pre-wrap">                  </span>}</div><div><span style="white-space:pre-wrap">                        </span>if (ev->detail == 56) { //key b</div><div><span style="white-space:pre-wrap">                               </span>glBindTexture(GL_TEXTURE_2D, ctx.texture_b); </div>

<div><span style="white-space:pre-wrap">                          </span>render(&ctx);</div><div><span style="white-space:pre-wrap">                        </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div><div><br></div><div><span style="white-space:pre-wrap">               </span>free(ctx.xcb_event);</div>

<div><span style="white-space:pre-wrap">          </span>ctx.xcb_event = NULL;</div><div><span style="white-space:pre-wrap">            </span>xcb_flush(ctx.conn);</div><div><span style="white-space:pre-wrap">     </span>}</div><div>
out:</div><div><span style="white-space:pre-wrap">  </span>glDisableVertexAttribArray(ctx.loc_v_position);</div><div>        glDisableVertexAttribArray(ctx.loc_tex_coord);</div><div>        glDeleteTextures(1, &ctx.texture_a);</div>

<div>        glDeleteTextures(1, &ctx.texture_b);</div><div><span style="white-space:pre-wrap">   </span>glDeleteProgram(ctx.shader_program);</div><div>        eglDestroySurface(ctx.egl_dpy, ctx.egl_surface);</div><div>

        eglMakeCurrent(ctx.egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);</div><div>   <span style="white-space:pre-wrap">       </span>eglDestroyContext(ctx.egl_dpy, ctx.egl_context);</div><div>   <span style="white-space:pre-wrap">      </span>eglTerminate(ctx.egl_dpy);</div>

<div>   <span style="white-space:pre-wrap">       </span>eglReleaseThread();</div><div>   <span style="white-space:pre-wrap">   </span></div><div>   <span style="white-space:pre-wrap">      </span>if (ctx.xcb_event) free(ctx.xcb_event);</div>

<div><br></div><div>   <span style="white-space:pre-wrap">      </span>xcb_free_pixmap(ctx.conn, ctx.xpix);</div><div>   <span style="white-space:pre-wrap">  </span>xcb_destroy_window(ctx.conn, ctx.window);</div><div>   <span style="white-space:pre-wrap">     </span>xcb_disconnect(ctx.conn);</div>

<div>   <span style="white-space:pre-wrap">       </span>return 0;</div><div>}</div><div><br></div><div><br></div><div><br></div><div>original pixmap:</div><div><a href="http://www.freeimagehosting.net/33j4c">http://www.freeimagehosting.net/33j4c</a></div>
<div><br></div><div>texture ok:</div><div><a href="http://www.freeimagehosting.net/dzh2d">http://www.freeimagehosting.net/dzh2d</a></div><div><br></div><div>texture bad:</div><div><a href="http://www.freeimagehosting.net/pnd7r">http://www.freeimagehosting.net/pnd7r</a></div>
<div><br></div><div><br></div><div>Linux: archlinux</div></div><div>Mesa: mesa-9.1-2, (mesa-demos from git)</div><div>Drivers: intel-dri 9.1-2, xf86-video-intel 2.21.3-1</div><div>Kernel: 3.8.0-2-ARCH (same results with kernel 3.7.9)</div>
<div><br></div><div>I appreciate any help, thanks.</div><div><br></div><div>(Sorry for my English, not my native language)</div><div>Gabriel.</div><div><br></div><div><br></div></div>