static Bool glamor_unrealize_font(ScreenPtr screen, FontPtr font) { glamor_screen_private *glamor_priv; glamor_font_t *privates = FontGetPrivate(font, glamor_font_private_index); glamor_font_t *glamor_font; int s; if (!privates) return TRUE; glamor_font = &privates[screen->myNum]; if (!glamor_font->realized) return TRUE; /* Unrealize the font, freeing the allocated texture */ glamor_font->realized = FALSE; glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); glDeleteTextures(1, &glamor_font->texture_id); /* Check to see if all of the screens are done with this font * and free the private when that happens */ for (s = 0; s < glamor_font_screen_count; s++) if (privates[s].realized) return TRUE; free(privates); FontSetPrivate(font, glamor_font_private_index, NULL); return TRUE; }
void glamor_enable_dri3(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); glamor_priv->dri3_enabled = TRUE; }
void glamor_init_solid_shader(ScreenPtr screen) { glamor_screen_private *glamor_priv; const char *solid_vs = "attribute vec4 v_position;" "void main()\n" "{\n" " gl_Position = v_position;\n" "}\n"; const char *solid_fs = GLAMOR_DEFAULT_PRECISION "uniform vec4 color;\n" "void main()\n" "{\n" " gl_FragColor = color;\n" "}\n"; GLint fs_prog, vs_prog; glamor_priv = glamor_get_screen_private(screen); glamor_get_context(glamor_priv); glamor_priv->solid_prog = glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, solid_vs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, solid_fs); glAttachShader(glamor_priv->solid_prog, vs_prog); glAttachShader(glamor_priv->solid_prog, fs_prog); glBindAttribLocation(glamor_priv->solid_prog, GLAMOR_VERTEX_POS, "v_position"); glamor_link_glsl_prog(glamor_priv->solid_prog); glamor_priv->solid_color_uniform_location = glGetUniformLocation(glamor_priv->solid_prog, "color"); glamor_put_context(glamor_priv); }
Bool glamor_supports_pixmap_import_export(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); return glamor_priv->dri3_enabled; }
_X_EXPORT int glamor_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, CARD16 *stride, CARD32 *size) { glamor_pixmap_private *pixmap_priv; glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); pixmap_priv = glamor_get_pixmap_private(pixmap); if (pixmap_priv == NULL || !glamor_priv->dri3_enabled) return -1; switch (pixmap_priv->type) { case GLAMOR_TEXTURE_DRM: case GLAMOR_TEXTURE_ONLY: if (!glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0)) return -1; return glamor_egl_dri3_fd_name_from_tex(screen, pixmap, pixmap_priv->base.fbo->tex, FALSE, stride, size); default: break; } return -1; }
static int glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap, PictFormatShort pict_format, GLenum *format, GLenum *type, int *no_alpha, int *revert, int *swap_rb, int is_upload) { glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { return glamor_get_tex_format_type_from_pictformat_gl(pict_format, format, type, no_alpha, revert, swap_rb, is_upload); } else { return glamor_get_tex_format_type_from_pictformat_gles2(pict_format, format, type, no_alpha, revert, swap_rb, is_upload); } }
Bool glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo) { ScreenPtr screen = pixmap->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); struct glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); struct glamor_egl_screen_private *glamor_egl; EGLImageKHR image; GLuint texture; Bool ret = FALSE; glamor_egl = glamor_egl_get_screen_private(scrn); glamor_get_context(glamor_priv); image = eglCreateImageKHR(glamor_egl->display, glamor_egl->context, EGL_NATIVE_PIXMAP_KHR, bo, NULL); if (image == EGL_NO_IMAGE_KHR) { glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY); goto done; } glamor_create_texture_from_image(glamor_egl, image, &texture); glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM); glamor_set_pixmap_texture(pixmap, texture); dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key, image); ret = TRUE; done: glamor_put_context(glamor_priv); return ret; }
_X_EXPORT void glamor_set_pixmap_texture(PixmapPtr pixmap, unsigned int tex) { ScreenPtr screen = pixmap->drawable.pScreen; glamor_pixmap_private *pixmap_priv; glamor_screen_private *glamor_priv; glamor_pixmap_fbo *fbo; GLenum format; glamor_priv = glamor_get_screen_private(screen); pixmap_priv = glamor_get_pixmap_private(pixmap); if (pixmap_priv->base.fbo) { fbo = glamor_pixmap_detach_fbo(pixmap_priv); glamor_destroy_fbo(fbo); } format = gl_iformat_for_pixmap(pixmap); fbo = glamor_create_fbo_from_tex(glamor_priv, pixmap->drawable.width, pixmap->drawable.height, format, tex, 0); if (fbo == NULL) { ErrorF("XXX fail to create fbo.\n"); return; } glamor_pixmap_attach_fbo(pixmap, fbo); }
/* XXX a kludge for now */ void glamor_format_for_pixmap(PixmapPtr pixmap, GLenum *format, GLenum *type) { switch (pixmap->drawable.depth) { case 24: case 32: *format = GL_BGRA; *type = GL_UNSIGNED_INT_8_8_8_8_REV; break; case 16: *format = GL_RGB; *type = GL_UNSIGNED_SHORT_5_6_5; break; case 15: *format = GL_BGRA; *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; break; case 8: *format = glamor_get_screen_private(pixmap->drawable.pScreen)->one_channel_format; *type = GL_UNSIGNED_BYTE; break; default: FatalError("Invalid pixmap depth %d\n", pixmap->drawable.depth); break; } }
static Bool glamor_glyphs_init_facet(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); return asprintf(&glamor_priv->glyph_defines, "#define ATLAS_DIM_INV %20.18f\n", 1.0/glamor_priv->glyph_atlas_dim) > 0; }
static void glamor_glyphs_fini_facet(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); free(glamor_priv->glyph_defines); }
static int glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap, GLenum *format, GLenum *type, int *no_alpha, int *revert, int *swap_rb, int is_upload) { glamor_pixmap_private *pixmap_priv; PictFormatShort pict_format; glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); pixmap_priv = glamor_get_pixmap_private(pixmap); if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv)) pict_format = pixmap_priv->base.picture->format; else pict_format = format_for_depth(pixmap->drawable.depth); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { return glamor_get_tex_format_type_from_pictformat_gl(pict_format, format, type, no_alpha, revert, swap_rb, is_upload); } else { return glamor_get_tex_format_type_from_pictformat_gles2(pict_format, format, type, no_alpha, revert, swap_rb, is_upload); } }
glamor_pixmap_fbo * glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, GLenum format, GLenum type, int no_alpha, int revert, int swap_rb) { glamor_pixmap_private *source_priv; glamor_screen_private *glamor_priv; ScreenPtr screen; glamor_pixmap_fbo *temp_fbo; float temp_xscale, temp_yscale, source_xscale, source_yscale; static float vertices[8]; static float texcoords[8]; screen = source->drawable.pScreen; glamor_priv = glamor_get_screen_private(screen); source_priv = glamor_get_pixmap_private(source); temp_fbo = glamor_create_fbo(glamor_priv, w, h, format, 0); if (temp_fbo == NULL) return NULL; glamor_make_current(glamor_priv); temp_xscale = 1.0 / w; temp_yscale = 1.0 / h; glamor_set_normalize_vcoords((struct glamor_pixmap_private *) NULL, temp_xscale, temp_yscale, 0, 0, w, h, vertices); glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), vertices); glEnableVertexAttribArray(GLAMOR_VERTEX_POS); pixmap_priv_get_scale(source_priv, &source_xscale, &source_yscale); glamor_set_normalize_tcoords(source_priv, source_xscale, source_yscale, x, y, x + w, y + h, texcoords); glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), texcoords); glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, source_priv->base.fbo->tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glamor_set_destination_pixmap_fbo(temp_fbo, 0, 0, w, h); glUseProgram(glamor_priv->finish_access_prog[no_alpha]); glUniform1i(glamor_priv->finish_access_revert[no_alpha], revert); glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha], swap_rb); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); return temp_fbo; }
void glamor_finish(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); glFinish(); }
void glamor_fini_tile_shader(ScreenPtr screen) { glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); glDeleteProgram(glamor_priv->tile_prog); }
void glamor_block_handler(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); glamor_priv->tick++; glFlush(); glamor_fbo_expire(glamor_priv); }
void glamor_fini_solid_shader(ScreenPtr screen) { glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); glamor_get_context(glamor_priv); glDeleteProgram(glamor_priv->solid_prog); glamor_put_context(glamor_priv); }
static Bool glamor_put_image_gl(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { ScreenPtr screen = drawable->pScreen; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); glamor_pixmap_private *pixmap_priv; uint32_t byte_stride = PixmapBytePad(w, drawable->depth); RegionRec region; BoxRec box; int off_x, off_y; pixmap_priv = glamor_get_pixmap_private(pixmap); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) return FALSE; if (gc->alu != GXcopy) goto bail; if (!glamor_pm_is_solid(&pixmap->drawable, gc->planemask)) goto bail; if (format == XYPixmap && drawable->depth == 1 && leftPad == 0) format = ZPixmap; if (format != ZPixmap) goto bail; x += drawable->x; y += drawable->y; box.x1 = x; box.y1 = y; box.x2 = box.x1 + w; box.y2 = box.y1 + h; RegionInit(®ion, &box, 1); RegionIntersect(®ion, ®ion, gc->pCompositeClip); glamor_get_drawable_deltas(drawable, pixmap, &off_x, &off_y); if (off_x || off_y) { x += off_x; y += off_y; RegionTranslate(®ion, off_x, off_y); } glamor_make_current(glamor_priv); glamor_upload_region(pixmap, ®ion, x, y, (uint8_t *) bits, byte_stride); RegionUninit(®ion); return TRUE; bail: return FALSE; }
static void glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog, struct glamor_glyph_atlas *atlas, int nglyph) { DrawablePtr drawable = dst->pDrawable; glamor_screen_private *glamor_priv = glamor_get_screen_private(drawable->pScreen); PixmapPtr atlas_pixmap = atlas->atlas; glamor_pixmap_private *atlas_priv = glamor_get_pixmap_private(atlas_pixmap); glamor_pixmap_fbo *atlas_fbo = glamor_pixmap_fbo_at(atlas_priv, 0, 0); PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); int box_x, box_y; int off_x, off_y; glamor_put_vbo_space(drawable->pScreen); glEnable(GL_SCISSOR_TEST); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, atlas_fbo->tex); for (;;) { if (!glamor_use_program_render(prog, op, src, dst)) break; glUniform1i(prog->atlas_uniform, 1); glamor_pixmap_loop(pixmap_priv, box_x, box_y) { BoxPtr box = RegionRects(dst->pCompositeClip); int nbox = RegionNumRects(dst->pCompositeClip); glamor_set_destination_drawable(drawable, box_x, box_y, TRUE, FALSE, prog->matrix_uniform, &off_x, &off_y); /* Run over the clip list, drawing the glyphs * in each box */ while (nbox--) { glScissor(box->x1 + off_x, box->y1 + off_y, box->x2 - box->x1, box->y2 - box->y1); box++; if (glamor_glyph_use_130(glamor_priv)) glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nglyph); else glamor_glDrawArrays_GL_QUADS(glamor_priv, nglyph); } } if (prog->alpha != glamor_program_alpha_ca_first) break; prog++; }
void glamor_sync_close(ScreenPtr screen) { #if XSYNC glamor_screen_private *glamor = glamor_get_screen_private(screen); SyncScreenFuncsPtr screen_funcs = miSyncGetScreenFuncs(screen); if (screen_funcs) screen_funcs->CreateFence = glamor->saved_procs.sync_screen_funcs.CreateFence; #endif }
void glamor_fini_finish_access_shaders(ScreenPtr screen) { glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); glamor_get_context(glamor_priv); glDeleteProgram(glamor_priv->finish_access_prog[0]); glDeleteProgram(glamor_priv->finish_access_prog[1]); glamor_put_context(glamor_priv); }
Bool glamor_destroy_pixmap(PixmapPtr pixmap) { glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); if (glamor_priv->dri3_enabled) glamor_egl_destroy_textured_pixmap(pixmap); else glamor_destroy_textured_pixmap(pixmap); return fbDestroyPixmap(pixmap); }
/** * Upload pixmap to a specified texture. * This texture may not be the one attached to it. **/ static Bool __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, GLenum format, GLenum type, int x, int y, int w, int h, void *bits, int pbo) { glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); int non_sub = 0; unsigned int iformat = 0; glamor_make_current(glamor_priv); if (*tex == 0) { glGenTextures(1, tex); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) iformat = gl_iformat_for_pixmap(pixmap); else iformat = format; non_sub = 1; assert(x == 0 && y == 0); } glBindTexture(GL_TEXTURE_2D, *tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); assert(pbo || bits != 0); if (bits == NULL) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); } glamor_priv->suppress_gl_out_of_memory_logging = true; if (non_sub) glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, format, type, bits); else glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, format, type, bits); glamor_priv->suppress_gl_out_of_memory_logging = false; if (glGetError() == GL_OUT_OF_MEMORY) { if (non_sub) { glDeleteTextures(1, tex); *tex = 0; } return FALSE; } if (bits == NULL) glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); return TRUE; }
void glamor_set_screen_pixmap(PixmapPtr screen_pixmap, PixmapPtr *back_pixmap) { glamor_pixmap_private *pixmap_priv; glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen_pixmap->drawable.pScreen); pixmap_priv = glamor_get_pixmap_private(screen_pixmap); glamor_priv->screen_fbo = pixmap_priv->fbo->fb; pixmap_priv->fbo->width = screen_pixmap->drawable.width; pixmap_priv->fbo->height = screen_pixmap->drawable.height; }
static void _glamor_block_handler(ScreenPtr screen, void *timeout, void *readmask) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); screen->BlockHandler = glamor_priv->saved_procs.block_handler; screen->BlockHandler(screen, timeout, readmask); glamor_priv->saved_procs.block_handler = screen->BlockHandler; screen->BlockHandler = _glamor_block_handler; glamor_make_current(glamor_priv); glFlush(); }
static void glamor_release_screen_priv(ScreenPtr screen) { glamor_screen_private *glamor_priv; glamor_priv = glamor_get_screen_private(screen); glamor_fini_vbo(screen); glamor_fini_pixmap_fbo(screen); glamor_pixmap_fini(screen); free(glamor_priv); glamor_set_screen_private(screen, NULL); }
void glamor_init_putimage_shaders(ScreenPtr screen) { #if 0 glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); const char *xybitmap_vs = "uniform float x_bias;\n" "uniform float x_scale;\n" "uniform float y_bias;\n" "uniform float y_scale;\n" "varying vec2 bitmap_coords;\n" "void main()\n" "{\n" " gl_Position = vec4((gl_Vertex.x + x_bias) * x_scale,\n" " (gl_Vertex.y + y_bias) * y_scale,\n" " 0,\n" " 1);\n" " bitmap_coords = gl_MultiTexCoord0.xy;\n" "}\n"; const char *xybitmap_fs = "uniform vec4 fg, bg;\n" "varying vec2 bitmap_coords;\n" "uniform sampler2D bitmap_sampler;\n" "void main()\n" "{\n" " float bitmap_value = texture2D(bitmap_sampler,\n" " bitmap_coords).x;\n" " gl_FragColor = mix(bg, fg, bitmap_value);\n" "}\n"; GLint fs_prog, vs_prog, prog; GLint sampler_uniform_location; if (!GLEW_ARB_fragment_shader) return; prog = dispatch->glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, xybitmap_vs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, xybitmap_fs); dispatch->glAttachShader(prog, vs_prog); dispatch->glAttachShader(prog, fs_prog); glamor_link_glsl_prog(prog); dispatch->glUseProgram(prog); sampler_uniform_location = dispatch->glGetUniformLocation(prog, "bitmap_sampler"); dispatch->glUniform1i(sampler_uniform_location, 0); glamor_priv->put_image_xybitmap_fg_uniform_location = dispatch->glGetUniformLocation(prog, "fg"); glamor_priv->put_image_xybitmap_bg_uniform_location = dispatch->glGetUniformLocation(prog, "bg"); glamor_get_transform_uniform_locations(prog, &glamor_priv->put_image_xybitmap_transform); glamor_priv->put_image_xybitmap_prog = prog; dispatch->glUseProgram(0); #endif }
void glamor_init_tile_shader(ScreenPtr screen) { glamor_screen_private *glamor_priv; const char *tile_vs = "attribute vec4 v_position;\n" "attribute vec4 v_texcoord0;\n" "varying vec2 tile_texture;\n" "void main()\n" "{\n" " gl_Position = v_position;\n" " tile_texture = v_texcoord0.xy;\n" "}\n"; const char *tile_fs = GLAMOR_DEFAULT_PRECISION "varying vec2 tile_texture;\n" "uniform sampler2D sampler;\n" "uniform vec2 wh;" "void main()\n" "{\n" " vec2 rel_tex;" " rel_tex = tile_texture * wh; \n" " rel_tex = floor(rel_tex) + (fract(rel_tex) / wh); \n" " gl_FragColor = texture2D(sampler, rel_tex);\n" "}\n"; GLint fs_prog, vs_prog; GLint sampler_uniform_location; glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); glamor_priv->tile_prog = glCreateProgram(); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, tile_vs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, tile_fs); glAttachShader(glamor_priv->tile_prog, vs_prog); glAttachShader(glamor_priv->tile_prog, fs_prog); glBindAttribLocation(glamor_priv->tile_prog, GLAMOR_VERTEX_POS, "v_position"); glBindAttribLocation(glamor_priv->tile_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord0"); glamor_link_glsl_prog(screen, glamor_priv->tile_prog, "tile"); sampler_uniform_location = glGetUniformLocation(glamor_priv->tile_prog, "sampler"); glUseProgram(glamor_priv->tile_prog); glUniform1i(sampler_uniform_location, 0); glamor_priv->tile_wh = glGetUniformLocation(glamor_priv->tile_prog, "wh"); }
void glamor_init_pixmap_fbo(ScreenPtr screen) { glamor_screen_private *glamor_priv; int i, j, k; glamor_priv = glamor_get_screen_private(screen); for (i = 0; i < CACHE_FORMAT_COUNT; i++) for (j = 0; j < CACHE_BUCKET_WCOUNT; j++) for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) { xorg_list_init(&glamor_priv->fbo_cache[i][j][k]); } glamor_priv->fbo_cache_watermark = 0; }
Bool glamor_close_screen(ScreenPtr screen) { glamor_screen_private *glamor_priv; PixmapPtr screen_pixmap; int flags; #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(screen); #endif glamor_priv = glamor_get_screen_private(screen); flags = glamor_priv->flags; glamor_sync_close(screen); glamor_glyphs_fini(screen); screen->CloseScreen = glamor_priv->saved_procs.close_screen; screen->CreateScreenResources = glamor_priv->saved_procs.create_screen_resources; if (flags & GLAMOR_USE_SCREEN) { screen->CreateGC = glamor_priv->saved_procs.create_gc; screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap; screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap; screen->GetSpans = glamor_priv->saved_procs.get_spans; screen->ChangeWindowAttributes = glamor_priv->saved_procs.change_window_attributes; screen->CopyWindow = glamor_priv->saved_procs.copy_window; screen->BitmapToRegion = glamor_priv->saved_procs.bitmap_to_region; } #ifdef RENDER if (ps && (flags & GLAMOR_USE_PICTURE_SCREEN)) { ps->Composite = glamor_priv->saved_procs.composite; ps->Trapezoids = glamor_priv->saved_procs.trapezoids; ps->Triangles = glamor_priv->saved_procs.triangles; ps->CreatePicture = glamor_priv->saved_procs.create_picture; } ps->CompositeRects = glamor_priv->saved_procs.composite_rects; ps->Glyphs = glamor_priv->saved_procs.glyphs; ps->UnrealizeGlyph = glamor_priv->saved_procs.unrealize_glyph; screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap; #endif screen_pixmap = screen->GetScreenPixmap(screen); glamor_set_pixmap_private(screen_pixmap, NULL); if (glamor_priv->back_pixmap && *glamor_priv->back_pixmap) glamor_set_pixmap_private(*glamor_priv->back_pixmap, NULL); glamor_release_screen_priv(screen); return screen->CloseScreen(screen); }