glamor ddx driver using EGL on KMS
This commit is contained in:
		
							parent
							
								
									47b6531273
								
							
						
					
					
						commit
						49bf0e301e
					
				| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					glamor_la_LTLIBRARIES = glamor.la
 | 
				
			||||||
 | 
					glamor_la_CFLAGS =					\
 | 
				
			||||||
 | 
						-DHAVE_XORG_CONFIG_H				\
 | 
				
			||||||
 | 
						@DIX_CFLAGS@ @XORG_CFLAGS@			\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/common		\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/os-support/bus	\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/parser		\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/modes		\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/ddc			\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/ramdac		\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/hw/xfree86/i2c			\
 | 
				
			||||||
 | 
						-I$(top_srcdir)/glamor				\
 | 
				
			||||||
 | 
						-I/usr/include/drm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					glamor_la_LDFLAGS =							\
 | 
				
			||||||
 | 
						-module -avoid-version -lEGL $(top_builddir)/glamor/libglamor.la -lGLEW
 | 
				
			||||||
 | 
					glamor_ladir = $(moduledir)/drivers
 | 
				
			||||||
 | 
					glamor_la_SOURCES =				\
 | 
				
			||||||
 | 
						glamor.c				\
 | 
				
			||||||
 | 
						glamor_crtc.c				\
 | 
				
			||||||
 | 
						glamor_ddx.h
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,530 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright © 2010 Intel Corporation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person
 | 
				
			||||||
 | 
					 * obtaining a copy of this software and associated documentation
 | 
				
			||||||
 | 
					 * files (the "Software"), to deal in the Software without
 | 
				
			||||||
 | 
					 * restriction, including without limitation the rights to use, copy,
 | 
				
			||||||
 | 
					 * modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
				
			||||||
 | 
					 * of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					 * furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice (including
 | 
				
			||||||
 | 
					 * the next paragraph) shall be included in all copies or substantial
 | 
				
			||||||
 | 
					 * portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
				
			||||||
 | 
					 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
				
			||||||
 | 
					 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
				
			||||||
 | 
					 * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 | 
				
			||||||
 | 
					 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
				
			||||||
 | 
					 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
				
			||||||
 | 
					 * DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Authors:
 | 
				
			||||||
 | 
					 *    Kristian Høgsberg <krh@bitplanet.net>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <xf86drm.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GL_GLEXT_PROTOTYPES
 | 
				
			||||||
 | 
					#define EGL_EGLEXT_PROTOTYPES
 | 
				
			||||||
 | 
					#define EGL_DISPLAY_NO_X_MESA
 | 
				
			||||||
 | 
					#include <GL/gl.h>
 | 
				
			||||||
 | 
					#include <EGL/egl.h>
 | 
				
			||||||
 | 
					#include <EGL/eglext.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../../../mi/micmap.h"
 | 
				
			||||||
 | 
					#include <xf86Crtc.h>
 | 
				
			||||||
 | 
					#include <xf86.h>
 | 
				
			||||||
 | 
					#include <glamor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "glamor_ddx.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GLAMOR_VERSION_MAJOR 0
 | 
				
			||||||
 | 
					#define GLAMOR_VERSION_MINOR 1
 | 
				
			||||||
 | 
					#define GLAMOR_VERSION_PATCH 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char glamor_name[] = "glamor";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					glamor_identify(int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xf86Msg(X_INFO, "%s: OpenGL accelerated X.org driver\n", glamor_name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct glamor_screen_private {
 | 
				
			||||||
 | 
						EGLDisplay display;
 | 
				
			||||||
 | 
						EGLContext context;
 | 
				
			||||||
 | 
						EGLImageKHR root, cursor;
 | 
				
			||||||
 | 
						EGLint major, minor;
 | 
				
			||||||
 | 
						GLuint cursor_tex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CreateScreenResourcesProcPtr CreateScreenResources;
 | 
				
			||||||
 | 
						CloseScreenProcPtr CloseScreen;
 | 
				
			||||||
 | 
						int fd;
 | 
				
			||||||
 | 
						int cpp;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline struct glamor_screen_private *
 | 
				
			||||||
 | 
					glamor_get_screen_private(ScrnInfoPtr scrn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (struct glamor_screen_private *) (scrn->driverPrivate);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					glamor_resize(ScrnInfoPtr scrn, int width, int height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
						ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
 | 
				
			||||||
 | 
						EGLImageKHR image;
 | 
				
			||||||
 | 
						GLuint texture;
 | 
				
			||||||
 | 
						EGLint attribs[] = {
 | 
				
			||||||
 | 
							EGL_IMAGE_WIDTH_INTEL,	0,
 | 
				
			||||||
 | 
							EGL_IMAGE_HEIGHT_INTEL,	0,
 | 
				
			||||||
 | 
							EGL_IMAGE_FORMAT_INTEL,	EGL_FORMAT_RGBA_8888_KHR,
 | 
				
			||||||
 | 
							EGL_IMAGE_USE_INTEL,	EGL_IMAGE_USE_SHARE_INTEL |
 | 
				
			||||||
 | 
										EGL_IMAGE_USE_SCANOUT_INTEL,
 | 
				
			||||||
 | 
							EGL_NONE
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (glamor->root != EGL_NO_IMAGE_KHR &&
 | 
				
			||||||
 | 
						    scrn->virtualX == width && scrn->virtualY == height)
 | 
				
			||||||
 | 
							return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						attribs[1] = width;
 | 
				
			||||||
 | 
						attribs[3] = height;
 | 
				
			||||||
 | 
						image = eglCreateImageKHR(glamor->display, glamor->context,
 | 
				
			||||||
 | 
									  EGL_SYSTEM_IMAGE_INTEL,
 | 
				
			||||||
 | 
									  NULL, attribs);
 | 
				
			||||||
 | 
						if (image == EGL_NO_IMAGE_KHR)
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glGenTextures(1, &texture);
 | 
				
			||||||
 | 
						glBindTexture(GL_TEXTURE_2D, texture);
 | 
				
			||||||
 | 
						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 | 
				
			||||||
 | 
						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 | 
				
			||||||
 | 
						glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor_set_pixmap_texture(screen->GetScreenPixmap(screen),
 | 
				
			||||||
 | 
									  width, height, texture);
 | 
				
			||||||
 | 
						glamor->root = image;
 | 
				
			||||||
 | 
						scrn->virtualX = width;
 | 
				
			||||||
 | 
						scrn->virtualY = height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					glamor_frontbuffer_handle(ScrnInfoPtr scrn, uint32_t *handle, uint32_t *pitch)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
						EGLint name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						eglShareImageINTEL (glamor->display, glamor->context, glamor->root, 0,
 | 
				
			||||||
 | 
								    &name, (EGLint *) handle, (EGLint *) pitch);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					glamor_load_cursor(ScrnInfoPtr scrn, CARD32 *image, int width, int height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (glamor->cursor == NULL) {
 | 
				
			||||||
 | 
							EGLint attribs[] = {
 | 
				
			||||||
 | 
								EGL_IMAGE_WIDTH_INTEL,	0,
 | 
				
			||||||
 | 
								EGL_IMAGE_HEIGHT_INTEL,	0,
 | 
				
			||||||
 | 
								EGL_IMAGE_FORMAT_INTEL,	EGL_FORMAT_RGBA_8888_KHR,
 | 
				
			||||||
 | 
								EGL_IMAGE_USE_INTEL,	EGL_IMAGE_USE_SHARE_INTEL |
 | 
				
			||||||
 | 
											EGL_IMAGE_USE_SCANOUT_INTEL,
 | 
				
			||||||
 | 
								EGL_NONE
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							attribs[1] = width;
 | 
				
			||||||
 | 
							attribs[3] = height;
 | 
				
			||||||
 | 
							glamor->cursor =
 | 
				
			||||||
 | 
								eglCreateImageKHR(glamor->display, glamor->context,
 | 
				
			||||||
 | 
										  EGL_SYSTEM_IMAGE_INTEL,
 | 
				
			||||||
 | 
										  NULL, attribs);
 | 
				
			||||||
 | 
							if (image == EGL_NO_IMAGE_KHR)
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							glGenTextures(1, &glamor->cursor_tex);
 | 
				
			||||||
 | 
							glBindTexture(GL_TEXTURE_2D, glamor->cursor_tex);
 | 
				
			||||||
 | 
							glTexParameteri(GL_TEXTURE_2D,
 | 
				
			||||||
 | 
									GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 | 
				
			||||||
 | 
							glTexParameteri(GL_TEXTURE_2D,
 | 
				
			||||||
 | 
									GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 | 
				
			||||||
 | 
							glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, glamor->cursor);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glBindTexture(GL_TEXTURE_2D, glamor->cursor_tex);
 | 
				
			||||||
 | 
						glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0,
 | 
				
			||||||
 | 
							     GL_RGBA, GL_UNSIGNED_BYTE, image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					glamor_cursor_handle(ScrnInfoPtr scrn, uint32_t *handle, uint32_t *pitch)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
						EGLint name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						eglShareImageINTEL (glamor->display, glamor->context, glamor->cursor, 
 | 
				
			||||||
 | 
								    0, &name, (EGLint *) handle, (EGLint *) pitch);
 | 
				
			||||||
 | 
						ErrorF("cursor stride: %d\n", *pitch);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_pre_init(ScrnInfoPtr scrn, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor;
 | 
				
			||||||
 | 
						rgb defaultWeight = { 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor = xnfcalloc(sizeof *glamor, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn->driverPrivate = glamor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor->fd = open("/dev/dri/card0", O_RDWR);
 | 
				
			||||||
 | 
						glamor->cpp = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn->monitor = scrn->confScreen->monitor;
 | 
				
			||||||
 | 
						scrn->progClock = TRUE;
 | 
				
			||||||
 | 
						scrn->rgbBits = 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!xf86SetDepthBpp(scrn, 0, 0, 0, Support32bppFb))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xf86PrintDepthBpp(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!xf86SetWeight(scrn, defaultWeight, defaultWeight))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						if (!xf86SetDefaultVisual(scrn, -1))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor->cpp = scrn->bitsPerPixel / 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (drmmode_pre_init(scrn, glamor->fd, glamor->cpp) == FALSE) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "Kernel modesetting setup failed\n");
 | 
				
			||||||
 | 
							xfree(glamor);
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn->currentMode = scrn->modes;
 | 
				
			||||||
 | 
						xf86SetDpi(scrn, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Load the required sub modules */
 | 
				
			||||||
 | 
						if (!xf86LoadSubModule(scrn, "fb"))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					glamor_adjust_frame(int scrnIndex, int x, int y, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_enter_vt(int scrnIndex, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (drmSetMaster(glamor->fd)) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 | 
				
			||||||
 | 
								   "drmSetMaster failed: %s\n", strerror(errno));
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					glamor_leave_vt(int scrnIndex, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drmDropMaster(glamor->fd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_create_screen_resources(ScreenPtr screen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[screen->myNum];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen->CreateScreenResources = glamor->CreateScreenResources;
 | 
				
			||||||
 | 
						if (!(*screen->CreateScreenResources) (screen))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!xf86SetDesiredModes(scrn))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_close_screen(int scrnIndex, ScreenPtr screen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (scrn->vtSema == TRUE)
 | 
				
			||||||
 | 
							glamor_leave_vt(scrnIndex, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor_fini(screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						eglMakeCurrent(glamor->display,
 | 
				
			||||||
 | 
							       EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 | 
				
			||||||
 | 
						eglTerminate(glamor->display);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drmmode_closefb(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen->CloseScreen = glamor->CloseScreen;
 | 
				
			||||||
 | 
						(*screen->CloseScreen) (scrnIndex, screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[screen->myNum];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
						EGLDisplayTypeDRMMESA display;
 | 
				
			||||||
 | 
						const char *version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						display.type = EGL_DISPLAY_TYPE_DRM_MESA;
 | 
				
			||||||
 | 
						display.device = NULL;
 | 
				
			||||||
 | 
						display.fd = glamor->fd;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						glamor->display = eglGetDisplay((EGLNativeDisplayType) &display);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (!eglInitialize(glamor->display, &glamor->major, &glamor->minor)) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "eglInitialize() failed\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						version = eglQueryString(glamor->display, EGL_VERSION);
 | 
				
			||||||
 | 
						xf86Msg(X_INFO, "%s: EGL version %s:", glamor_name, version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glamor->context = eglCreateContext(glamor->display,
 | 
				
			||||||
 | 
										   NULL, EGL_NO_CONTEXT, NULL);
 | 
				
			||||||
 | 
						if (glamor->context == EGL_NO_CONTEXT) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "Failed to create EGL context\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!eglMakeCurrent(glamor->display,
 | 
				
			||||||
 | 
								    EGL_NO_SURFACE, EGL_NO_SURFACE, glamor->context)) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "Failed to make EGL context current\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						miClearVisualTypes();
 | 
				
			||||||
 | 
						if (!miSetVisualTypes(scrn->depth,
 | 
				
			||||||
 | 
								      miGetDefaultVisualMask(scrn->depth),
 | 
				
			||||||
 | 
								      scrn->rgbBits, scrn->defaultVisual))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						if (!miSetPixmapDepths())
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!fbScreenInit(screen, NULL,
 | 
				
			||||||
 | 
								  scrn->virtualX, scrn->virtualY,
 | 
				
			||||||
 | 
								  scrn->xDpi, scrn->yDpi,
 | 
				
			||||||
 | 
								  1, scrn->bitsPerPixel))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fbPictureInit(screen, NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xf86SetBlackWhitePixels(screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!glamor_init(screen)) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "Failed to initialize glamor\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						miInitializeBackingStore(screen);
 | 
				
			||||||
 | 
						xf86SetBackingStore(screen);
 | 
				
			||||||
 | 
						xf86SetSilkenMouse(screen);
 | 
				
			||||||
 | 
						miDCInitialize(screen, xf86GetPointerScreenFuncs());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xf86DrvMsg(scrn->scrnIndex, X_INFO, "Initializing HW Cursor\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!xf86_cursors_init(screen, 64, 64,
 | 
				
			||||||
 | 
								       (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_INVERT_MASK |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_UPDATE_UNHIDDEN |
 | 
				
			||||||
 | 
									HARDWARE_CURSOR_ARGB))) {
 | 
				
			||||||
 | 
							xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
								   "Hardware cursor initialization failed\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Must force it before EnterVT, so we are in control of VT and
 | 
				
			||||||
 | 
						 * later memory should be bound when allocating, e.g rotate_mem */
 | 
				
			||||||
 | 
						scrn->vtSema = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!glamor_enter_vt(scrnIndex, 0))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen->SaveScreen = xf86SaveScreen;
 | 
				
			||||||
 | 
						glamor->CreateScreenResources = screen->CreateScreenResources;
 | 
				
			||||||
 | 
						screen->CreateScreenResources = glamor_create_screen_resources;
 | 
				
			||||||
 | 
						glamor->CloseScreen = screen->CloseScreen;
 | 
				
			||||||
 | 
						screen->CloseScreen = glamor_close_screen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					glamor_free_screen(int scrnIndex, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = xf86Screens[scrnIndex];
 | 
				
			||||||
 | 
						struct glamor_screen_private *glamor = glamor_get_screen_private(scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						close(glamor->fd);
 | 
				
			||||||
 | 
						xfree(scrn->driverPrivate);
 | 
				
			||||||
 | 
						scrn->driverPrivate = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static ModeStatus
 | 
				
			||||||
 | 
					glamor_valid_mode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (mode->Flags & V_INTERLACE) {
 | 
				
			||||||
 | 
							if (verbose) {
 | 
				
			||||||
 | 
								xf86DrvMsg(scrnIndex, X_PROBED,
 | 
				
			||||||
 | 
									   "Removing interlaced mode \"%s\"\n",
 | 
				
			||||||
 | 
									   mode->name);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return MODE_BAD;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return MODE_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_probe(struct _DriverRec *drv, int flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ScrnInfoPtr scrn = NULL;
 | 
				
			||||||
 | 
					       	GDevPtr *sections;
 | 
				
			||||||
 | 
						int entity, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n = xf86MatchDevice(glamor_name, §ions);
 | 
				
			||||||
 | 
						if (n <= 0)
 | 
				
			||||||
 | 
						    return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						entity = xf86ClaimFbSlot(drv, 0, sections[0], TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn = xf86ConfigFbEntity(scrn, 0, entity, NULL, NULL, NULL, NULL);
 | 
				
			||||||
 | 
						if (scrn == NULL) {
 | 
				
			||||||
 | 
							xf86Msg(X_ERROR, "Failed to add fb entity\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn->driverVersion = 1;
 | 
				
			||||||
 | 
						scrn->driverName = (char *) glamor_name;
 | 
				
			||||||
 | 
						scrn->name = (char *) glamor_name;
 | 
				
			||||||
 | 
						scrn->Probe = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scrn->PreInit = glamor_pre_init;
 | 
				
			||||||
 | 
						scrn->ScreenInit = glamor_screen_init;
 | 
				
			||||||
 | 
						scrn->AdjustFrame = glamor_adjust_frame;
 | 
				
			||||||
 | 
						scrn->EnterVT = glamor_enter_vt;
 | 
				
			||||||
 | 
						scrn->LeaveVT = glamor_leave_vt;
 | 
				
			||||||
 | 
						scrn->FreeScreen = glamor_free_screen;
 | 
				
			||||||
 | 
						scrn->ValidMode = glamor_valid_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const OptionInfoRec *
 | 
				
			||||||
 | 
					glamor_available_options(int chipid, int busid)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					glamor_driver_func(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xorgHWFlags *flag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (op) {
 | 
				
			||||||
 | 
					        case GET_REQUIRED_HW_INTERFACES:
 | 
				
			||||||
 | 
							flag = (CARD32*)ptr;
 | 
				
			||||||
 | 
							(*flag) = 0;
 | 
				
			||||||
 | 
							return TRUE;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
							/* Unknown or deprecated function */
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_X_EXPORT DriverRec glamor = {
 | 
				
			||||||
 | 
						1,
 | 
				
			||||||
 | 
						"glamor",
 | 
				
			||||||
 | 
						glamor_identify,
 | 
				
			||||||
 | 
						glamor_probe,
 | 
				
			||||||
 | 
						glamor_available_options,
 | 
				
			||||||
 | 
						NULL,
 | 
				
			||||||
 | 
						0,
 | 
				
			||||||
 | 
						glamor_driver_func,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static pointer
 | 
				
			||||||
 | 
					glamor_setup(pointer module, pointer opts, int *errmaj, int *errmin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   static Bool setupDone = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* This module should be loaded only once, but check to be sure.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					   if (!setupDone) {
 | 
				
			||||||
 | 
					      setupDone = 1;
 | 
				
			||||||
 | 
					      xf86AddDriver(&glamor, module, HaveDriverFuncs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
 | 
					       * The return value must be non-NULL on success even though there
 | 
				
			||||||
 | 
					       * is no TearDownProc.
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      return (pointer) 1;
 | 
				
			||||||
 | 
					   } else {
 | 
				
			||||||
 | 
					      if (errmaj)
 | 
				
			||||||
 | 
						 *errmaj = LDR_ONCEONLY;
 | 
				
			||||||
 | 
					      return NULL;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static XF86ModuleVersionInfo glamor_version_info = {
 | 
				
			||||||
 | 
						glamor_name,
 | 
				
			||||||
 | 
						MODULEVENDORSTRING,
 | 
				
			||||||
 | 
						MODINFOSTRING1,
 | 
				
			||||||
 | 
						MODINFOSTRING2,
 | 
				
			||||||
 | 
						XORG_VERSION_CURRENT,
 | 
				
			||||||
 | 
						GLAMOR_VERSION_MAJOR,
 | 
				
			||||||
 | 
						GLAMOR_VERSION_MINOR,
 | 
				
			||||||
 | 
						GLAMOR_VERSION_PATCH,
 | 
				
			||||||
 | 
						ABI_CLASS_VIDEODRV,
 | 
				
			||||||
 | 
						ABI_VIDEODRV_VERSION,
 | 
				
			||||||
 | 
						MOD_CLASS_VIDEODRV,
 | 
				
			||||||
 | 
						{0, 0, 0, 0}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_X_EXPORT XF86ModuleData glamorModuleData = {
 | 
				
			||||||
 | 
						&glamor_version_info,
 | 
				
			||||||
 | 
						glamor_setup,
 | 
				
			||||||
 | 
						NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					#ifndef GLAMOR_DDX_H
 | 
				
			||||||
 | 
					#define GLAMOR_DDX_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool glamor_resize(ScrnInfoPtr scrn, int width, int height);
 | 
				
			||||||
 | 
					void glamor_frontbuffer_handle(ScrnInfoPtr scrn,
 | 
				
			||||||
 | 
								       uint32_t *handle, uint32_t *pitch);
 | 
				
			||||||
 | 
					Bool glamor_load_cursor(ScrnInfoPtr scrn,
 | 
				
			||||||
 | 
								CARD32 *image, int width, int height);
 | 
				
			||||||
 | 
					void glamor_cursor_handle(ScrnInfoPtr scrn,
 | 
				
			||||||
 | 
								  uint32_t *handle, uint32_t *pitch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool drmmode_pre_init(ScrnInfoPtr scrn, int fd, int cpp);
 | 
				
			||||||
 | 
					void drmmode_closefb(ScrnInfoPtr scrn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
		Reference in New Issue