diff --git a/mesa-no-libkms.patch b/mesa-no-libkms.patch new file mode 100644 index 0000000..17d7b57 --- /dev/null +++ b/mesa-no-libkms.patch @@ -0,0 +1,307 @@ +Reverts: +a669a5055eadae85ffa000cea19a2241d0699348 +6bb71b8cbe6b17a5d59e369631502e642804406e + +diff --git a/configure.ac b/configure.ac +index c30bcf0..54b50a6 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1226,8 +1226,6 @@ if test "x$enable_gbm" = xyes; then + if test "x$enable_shared_glapi" = xno; then + AC_MSG_ERROR([gbm_dri requires --enable-shared-glapi]) + fi +- PKG_CHECK_MODULES([LIBKMS], [libkms], [], +- AC_MSG_ERROR([gbm needs libkms])) + fi + fi + GBM_PC_REQ_PRIV="libudev" +diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h +index 09f63ff..f35f857 100644 +--- a/include/GL/internal/dri_interface.h ++++ b/include/GL/internal/dri_interface.h +@@ -935,7 +935,8 @@ struct __DRIdri2ExtensionRec { + + #define __DRI_IMAGE_USE_SHARE 0x0001 + #define __DRI_IMAGE_USE_SCANOUT 0x0002 +-#define __DRI_IMAGE_USE_CURSOR 0x0004 /* Depricated */ ++#define __DRI_IMAGE_USE_CURSOR 0x0004 ++#define __DRI_IMAGE_USE_WRITE 0x0008 + + /** + * queryImage attributes +@@ -984,6 +985,13 @@ struct __DRIimageExtensionRec { + GLboolean (*validateUsage)(__DRIimage *image, unsigned int use); + + /** ++ * Write data into image. ++ * ++ * \since 4 ++ */ ++ int (*write)(__DRIimage *image, const void *buf, size_t count); ++ ++ /** + * Create an image out of a sub-region of a parent image. This + * entry point lets us create individual __DRIimages for different + * planes in a planar buffer (typically yuv), for example. While a +diff --git a/src/egl/drivers/dri2/Makefile.am b/src/egl/drivers/dri2/Makefile.am +index 45f7dfa..49ec06b 100644 +--- a/src/egl/drivers/dri2/Makefile.am ++++ b/src/egl/drivers/dri2/Makefile.am +@@ -30,7 +30,6 @@ AM_CFLAGS = \ + $(DEFINES) \ + $(LIBDRM_CFLAGS) \ + $(LIBUDEV_CFLAGS) \ +- $(LIBKMS_CFLAGS) \ + -DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\" + + noinst_LTLIBRARIES = libegl_dri2.la +diff --git a/src/gbm/Makefile.am b/src/gbm/Makefile.am +index e22c55c..f079da1 100644 +--- a/src/gbm/Makefile.am ++++ b/src/gbm/Makefile.am +@@ -7,7 +7,6 @@ AM_CFLAGS = \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/src/gbm/main \ + $(LIBUDEV_CFLAGS) \ +- $(LIBKMS_CFLAGS) \ + $(DLOPEN_CFLAGS) \ + $(DEFINES) + +@@ -19,7 +18,7 @@ libgbm_la_SOURCES = \ + main/backend.c \ + main/common.c + libgbm_la_LDFLAGS = -version-info 1:0 +-libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(LIBKMS_LIBS) $(DLOPEN_LIBS) ++libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(DLOPEN_LIBS) + + if HAVE_EGL_PLATFORM_WAYLAND + AM_CPPFLAGS = -DHAVE_WAYLAND_PLATFORM +diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c +index 1831f13..173e727 100644 +--- a/src/gbm/backends/dri/gbm_dri.c ++++ b/src/gbm/backends/dri/gbm_dri.c +@@ -299,21 +299,13 @@ gbm_dri_is_format_supported(struct gbm_device *gbm, + static int + gbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count) + { ++ struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm); + struct gbm_dri_bo *bo = gbm_dri_bo(_bo); +- void *ptr; +- int ret; +- +- if (bo->bo == NULL) +- return -1; + +- ret = kms_bo_map(bo->bo, &ptr); +- if (ret < 0) ++ if (dri->image->base.version < 4) + return -1; + +- memcpy(ptr, buf, count); +- +- kms_bo_unmap(bo->bo); +- return 0; ++ return dri->image->write(bo->image, buf, count); + } + + static void +@@ -322,10 +314,7 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo) + struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm); + struct gbm_dri_bo *bo = gbm_dri_bo(_bo); + +- if (bo->image != NULL) +- dri->image->destroyImage(bo->image); +- if (bo->bo != NULL) +- kms_bo_destroy(&bo->bo); ++ dri->image->destroyImage(bo->image); + free(bo); + } + +@@ -461,6 +450,9 @@ gbm_dri_bo_create(struct gbm_device *gbm, + int dri_format; + unsigned dri_use = 0; + ++ if (dri->image->base.version < 4 && (usage & GBM_BO_USE_WRITE)) ++ return NULL; ++ + bo = calloc(1, sizeof *bo); + if (bo == NULL) + return NULL; +@@ -469,33 +461,6 @@ gbm_dri_bo_create(struct gbm_device *gbm, + bo->base.base.width = width; + bo->base.base.height = height; + +- if (usage & GBM_BO_USE_WRITE) { +- int ret; +- unsigned attrs[7] = { +- KMS_WIDTH, 64, +- KMS_HEIGHT, 64, +- KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8, +- KMS_TERMINATE_PROP_LIST, +- }; +- +- if (!(usage & GBM_BO_USE_CURSOR_64X64)) +- return NULL; +- +- if (dri->kms == NULL) +- return NULL; +- +- ret = kms_bo_create(dri->kms, attrs, &bo->bo); +- if (ret < 0) { +- free(bo); +- return NULL; +- } +- +- kms_bo_get_prop(bo->bo, KMS_PITCH, &bo->base.base.stride); +- kms_bo_get_prop(bo->bo, KMS_HANDLE, (unsigned*)&bo->base.base.handle); +- +- return &bo->base.base; +- } +- + switch (format) { + case GBM_FORMAT_RGB565: + dri_format =__DRI_IMAGE_FORMAT_RGB565; +@@ -519,6 +484,8 @@ gbm_dri_bo_create(struct gbm_device *gbm, + dri_use |= __DRI_IMAGE_USE_SCANOUT; + if (usage & GBM_BO_USE_CURSOR_64X64) + dri_use |= __DRI_IMAGE_USE_CURSOR; ++ if (usage & GBM_BO_USE_WRITE) ++ dri_use |= __DRI_IMAGE_USE_WRITE; + + /* Gallium drivers requires shared in order to get the handle/stride */ + dri_use |= __DRI_IMAGE_USE_SHARE; +@@ -601,21 +568,13 @@ dri_device_create(int fd) + dri->base.type = GBM_DRM_DRIVER_TYPE_DRI; + dri->base.base.name = "drm"; + +- kms_create(fd, &dri->kms); +- if (dri->kms == NULL) +- goto err_kms; +- + ret = dri_screen_create(dri); +- if (ret) +- goto err_dri; ++ if (ret) { ++ free(dri); ++ return NULL; ++ } + + return &dri->base.base; +- +-err_dri: +- kms_destroy(&dri->kms); +-err_kms: +- free(dri); +- return NULL; + } + + struct gbm_backend gbm_dri_backend = { +diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h +index 4b619a0..f404368 100644 +--- a/src/gbm/backends/dri/gbm_driint.h ++++ b/src/gbm/backends/dri/gbm_driint.h +@@ -30,8 +30,6 @@ + + #include "gbmint.h" + +-#include "libkms.h" +- + #include "common.h" + #include "common_drm.h" + +@@ -43,9 +41,6 @@ struct gbm_dri_surface; + struct gbm_dri_device { + struct gbm_drm_device base; + +- /* Only used for cursors */ +- struct kms_driver *kms; +- + void *driver; + + __DRIscreen *screen; +@@ -77,9 +72,6 @@ struct gbm_dri_bo { + struct gbm_drm_bo base; + + __DRIimage *image; +- +- /* Only used for cursors */ +- struct kms_bo *bo; + }; + + struct gbm_dri_surface { +diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h +index 4ff0efe..782d669 100644 +--- a/src/mesa/drivers/dri/intel/intel_regions.h ++++ b/src/mesa/drivers/dri/intel/intel_regions.h +@@ -144,6 +144,7 @@ intel_region_get_aligned_offset(struct intel_region *region, uint32_t x, + struct __DRIimageRec { + struct intel_region *region; + GLenum internal_format; ++ uint32_t usage; + uint32_t dri_format; + GLuint format; + uint32_t offset; +diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c +index 103fcd2..f4c1602 100644 +--- a/src/mesa/drivers/dri/intel/intel_screen.c ++++ b/src/mesa/drivers/dri/intel/intel_screen.c +@@ -339,7 +339,13 @@ intel_create_image(__DRIscreen *screen, + tiling = I915_TILING_NONE; + } + ++ /* We only support write for cursor drm images */ ++ if ((use & __DRI_IMAGE_USE_WRITE) && ++ use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR)) ++ return NULL; ++ + image = intel_allocate_image(format, loaderPrivate); ++ image->usage = use; + cpp = _mesa_get_format_bytes(image->format); + image->region = + intel_region_alloc(intelScreen, tiling, cpp, width, height, true); +@@ -393,6 +399,7 @@ intel_dup_image(__DRIimage *orig_image, void *loaderPrivate) + } + + image->internal_format = orig_image->internal_format; ++ image->usage = orig_image->usage; + image->dri_format = orig_image->dri_format; + image->format = orig_image->format; + image->offset = orig_image->offset; +@@ -409,9 +416,29 @@ intel_validate_usage(__DRIimage *image, unsigned int use) + return GL_FALSE; + } + ++ /* We only support write for cursor drm images */ ++ if ((use & __DRI_IMAGE_USE_WRITE) && ++ use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR)) ++ return GL_FALSE; ++ + return GL_TRUE; + } + ++static int ++intel_image_write(__DRIimage *image, const void *buf, size_t count) ++{ ++ if (image->region->map_refcount) ++ return -1; ++ if (!(image->usage & __DRI_IMAGE_USE_WRITE)) ++ return -1; ++ ++ drm_intel_bo_map(image->region->bo, true); ++ memcpy(image->region->bo->virtual, buf, count); ++ drm_intel_bo_unmap(image->region->bo); ++ ++ return 0; ++} ++ + static __DRIimage * + intel_create_sub_image(__DRIimage *parent, + int width, int height, int dri_format, +@@ -463,6 +490,7 @@ static struct __DRIimageExtensionRec intelImageExtension = { + intel_query_image, + intel_dup_image, + intel_validate_usage, ++ intel_image_write, + intel_create_sub_image + }; + diff --git a/mesa-undefined-symbols.patch b/mesa-undefined-symbols.patch new file mode 100644 index 0000000..5acc91f --- /dev/null +++ b/mesa-undefined-symbols.patch @@ -0,0 +1,57 @@ +From 6a934ff6638352b2c28cf5a7452fed2f32853c17 Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 5 Aug 2012 00:47:06 +0300 +Subject: [PATCH] Fix undefined symbols in libOSMesa and libglapi + +--- + src/mapi/shared-glapi/Makefile.am | 2 +- + src/mesa/Makefile.am | 2 +- + src/mesa/drivers/osmesa/Makefile.am | 6 ++++++ + 3 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/mapi/shared-glapi/Makefile.am b/src/mapi/shared-glapi/Makefile.am +index 8db7688..8d41db2 100644 +--- a/src/mapi/shared-glapi/Makefile.am ++++ b/src/mapi/shared-glapi/Makefile.am +@@ -6,7 +6,7 @@ include $(top_srcdir)/src/mapi/mapi/sources.mak + + lib_LTLIBRARIES = libglapi.la + libglapi_la_SOURCES = $(MAPI_GLAPI_FILES) +-libglapi_la_LDFLAGS = -no-undefined ++libglapi_la_LDFLAGS = -no-undefined -pthread + + include $(GLAPI)/gen/glapi_gen.mk + glapi_mapi_tmp.h : $(GLAPI)/gen/gl_and_es_API.xml $(glapi_gen_mapi_deps) +diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am +index bb70ed6..82b2f36 100644 +--- a/src/mesa/Makefile.am ++++ b/src/mesa/Makefile.am +@@ -120,7 +120,7 @@ libmesa_la_SOURCES = \ + $(MESA_CXX_FILES) \ + $(MESA_ASM_FILES_FOR_ARCH) + +-libmesa_la_LIBADD = $(top_builddir)/src/glsl/libglsl.la ++libmesa_la_LIBADD = $(top_builddir)/src/glsl/libglsl.la -ldl + libmesa_la_LDFLAGS = + + libmesagallium_la_SOURCES = \ +diff --git a/src/mesa/drivers/osmesa/Makefile.am b/src/mesa/drivers/osmesa/Makefile.am +index dbee925..5a1d88e 100644 +--- a/src/mesa/drivers/osmesa/Makefile.am ++++ b/src/mesa/drivers/osmesa/Makefile.am +@@ -39,6 +39,12 @@ lib@OSMESA_LIB@_la_LDFLAGS = -module -version-number @OSMESA_VERSION@ -shared -n + lib@OSMESA_LIB@_la_LIBADD = \ + $(top_builddir)/src/mesa/libmesa.la \ + $(top_builddir)/src/mapi/glapi/libglapi.la ++lib@OSMESA_LIB@_la_LIBTOOLFLAGS = --tag=CXX ++ ++if HAVE_SHARED_GLAPI ++lib@OSMESA_LIB@_la_LDFLAGS += -L$(top_builddir)/$(LIB_DIR) ++lib@OSMESA_LIB@_la_LIBADD += -lglapi ++endif + + # Provide compatibility with scripts for the old Mesa build system for + # a while by putting a link to the driver into /lib of the build tree. +-- +1.7.10 +