[Mesa-dev] [PATCH 12/15] i915: Build the driver into the shared mesa_dri_drivers.so.

Eric Anholt eric at anholt.net
Sat Oct 12 03:03:43 CEST 2013


i915 has symbols for formerly-shared code that conflict with i965, so we
define them away using gen-symbol-redefs.py.  Options considered:

- This option.  Downsides: The symbols in profiling and debugging don't
  match the source.  The symbol list may change in the future and we won't
  notice without manually running the tool again.

- Use objcopy --localize-hidden to automatically demote our symbols to
  locals.  This didn't work on i965 due to c++ weak symbols (which can't
  be localized), but could work on i915.  We could do it on i915 only, but
  it does produce libtool warnings at link time due to libtool not knowing
  if the resulting .o file is safe to link (stupid libtool).  Plus you end
  up with different symbols of the same name, which is confusing for
  debugging too.  On the other hand, no future symbol conflicts long term.

- Write our own libelf tool that handles c++ weak symbols like we want and
  apply it to all drivers.  All the downsides of above, but applies
  uniformly across drivers.

- Edit the files to just rename all the i915 or i965 symbols that
  conflict.  There are on the order of 100 that have a prefix we used to
  share, so it would take a bit of typing.  Fewest downsides, but still
  can have conflicts long term.

Ultimately, this is the least invasive change at the moment, and we can
see if the "more symbol conflicts appear later" thing is a real concern or
not.

Note that the ability to compile a version of i915 without INTEL_DEBUG env
support is dropped.  It's too useful.

v2: drop dridir now that it's unused.
v3: Consistently put spaces around += in the updated Makefile.am block.
v4: Set a global driverAPI variable so loaders don't have to update to
    createNewScreen2() (though they may want to for thread safety).

Reviewed-by: Matt Turner <mattst88 at gmail.com> (v2)
---
 configure.ac                                  |   2 +-
 src/mesa/drivers/dri/Makefile.am              |   4 +-
 src/mesa/drivers/dri/i915/Makefile.am         |  18 +----
 src/mesa/drivers/dri/i915/intel_context.c     |   2 -
 src/mesa/drivers/dri/i915/intel_mipmap_tree.h |   1 +
 src/mesa/drivers/dri/i915/intel_screen.c      |  17 ++++-
 src/mesa/drivers/dri/i915/intel_screen.h      | 103 ++++++++++++++++++++++++++
 7 files changed, 126 insertions(+), 21 deletions(-)

diff --git a/configure.ac b/configure.ac
index fc35093..8f9ee15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1035,7 +1035,7 @@ fi
 enable_dricore=no
 enable_megadriver=no
 for driver in $DRI_DIRS; do
-    if test $driver != "i965" -a $driver != "nouveau"; then
+    if test $driver != "i965" -a $driver != "nouveau" -a $driver != "i915"; then
         enable_dricore=yes
     else
         enable_megadriver=yes
diff --git a/src/mesa/drivers/dri/Makefile.am b/src/mesa/drivers/dri/Makefile.am
index f06e1d8..8a28a4f 100644
--- a/src/mesa/drivers/dri/Makefile.am
+++ b/src/mesa/drivers/dri/Makefile.am
@@ -16,7 +16,9 @@ SUBDIRS+=common
 endif
 
 if HAVE_I915_DRI
-SUBDIRS+=i915
+SUBDIRS += i915
+MEGADRIVERS_DEPS += i915/libi915_dri.la
+MEGADRIVERS += i915_dri.so
 endif
 
 if HAVE_I965_DRI
diff --git a/src/mesa/drivers/dri/i915/Makefile.am b/src/mesa/drivers/dri/i915/Makefile.am
index b07ad13..ac49360 100644
--- a/src/mesa/drivers/dri/i915/Makefile.am
+++ b/src/mesa/drivers/dri/i915/Makefile.am
@@ -35,18 +35,6 @@ AM_CFLAGS = \
 	$(VISIBILITY_CFLAGS) \
 	$(INTEL_CFLAGS)
 
-dridir = $(DRI_DRIVER_INSTALL_DIR)
-dri_LTLIBRARIES = i915_dri.la
-
-i915_dri_la_SOURCES = $(i915_FILES)
-i915_dri_la_LDFLAGS = $(DRI_DRIVER_LDFLAGS)
-i915_dri_la_LIBADD = \
-	../common/libdricommon.la \
-	$(DRI_LIB_DEPS) \
-	$(INTEL_LIBS)
-
-# 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.
-all-local: i915_dri.la
-	$(MKDIR_P) $(top_builddir)/$(LIB_DIR);
-	ln -f .libs/i915_dri.so $(top_builddir)/$(LIB_DIR)/i915_dri.so;
+noinst_LTLIBRARIES = libi915_dri.la
+libi915_dri_la_SOURCES = $(i915_FILES)
+libi915_dri_la_LIBADD = $(INTEL_LIBS)
diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c
index d25358b..2748514 100644
--- a/src/mesa/drivers/dri/i915/intel_context.c
+++ b/src/mesa/drivers/dri/i915/intel_context.c
@@ -58,9 +58,7 @@
 #include "utils.h"
 #include "../glsl/ralloc.h"
 
-#ifndef INTEL_DEBUG
 int INTEL_DEBUG = (0);
-#endif
 
 
 static const GLubyte *
diff --git a/src/mesa/drivers/dri/i915/intel_mipmap_tree.h b/src/mesa/drivers/dri/i915/intel_mipmap_tree.h
index 2b2a644..1142af6 100644
--- a/src/mesa/drivers/dri/i915/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i915/intel_mipmap_tree.h
@@ -30,6 +30,7 @@
 
 #include <assert.h>
 
+#include "intel_screen.h"
 #include "intel_regions.h"
 
 #ifdef __cplusplus
diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
index 49bae5d..3f54752 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.c
+++ b/src/mesa/drivers/dri/i915/intel_screen.c
@@ -1190,7 +1190,7 @@ intelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
 }
 
 
-const struct __DriverAPIRec driDriverAPI = {
+static const struct __DriverAPIRec i915_driver_api = {
    .InitScreen		 = intelInitScreen2,
    .DestroyScreen	 = intelDestroyScreen,
    .CreateContext	 = intelCreateContext,
@@ -1203,10 +1203,23 @@ const struct __DriverAPIRec driDriverAPI = {
    .ReleaseBuffer        = intelReleaseBuffer
 };
 
+static const struct __DRIDriverVtableExtensionRec i915_vtable = {
+   .base = { __DRI_DRIVER_VTABLE, 1 },
+   .vtable = &i915_driver_api,
+};
+
 /* This is the table of extensions that the loader will dlsym() for. */
-PUBLIC const __DRIextension *__driDriverExtensions[] = {
+static const __DRIextension *i915_driver_extensions[] = {
     &driCoreExtension.base,
     &driDRI2Extension.base,
+    &i915_vtable.base,
     &i915_config_options.base,
     NULL
 };
+
+PUBLIC const __DRIextension **__driDriverGetExtensions_i915(void)
+{
+   globalDriverAPI = &i915_driver_api;
+
+   return i915_driver_extensions;
+}
diff --git a/src/mesa/drivers/dri/i915/intel_screen.h b/src/mesa/drivers/dri/i915/intel_screen.h
index 331ce90..4ae259c 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.h
+++ b/src/mesa/drivers/dri/i915/intel_screen.h
@@ -55,10 +55,113 @@ struct intel_screen
    driOptionCache optionCache;
 };
 
+/* These defines are to ensure that i915_dri's symbols don't conflict with
+ * i965's when linked together.
+ */
+#define intel_region_alloc                  old_intel_region_alloc
+#define intel_region_alloc_for_fd           old_intel_region_alloc_for_fd
+#define intel_region_alloc_for_handle       old_intel_region_alloc_for_handle
+#define intel_region_flink                  old_intel_region_flink
+#define intel_region_get_aligned_offset     old_intel_region_get_aligned_offset
+#define intel_region_get_tile_masks         old_intel_region_get_tile_masks
+#define intel_region_reference              old_intel_region_reference
+#define intel_region_release                old_intel_region_release
+#define intel_bufferobj_buffer              old_intel_bufferobj_buffer
+#define intel_bufferobj_source              old_intel_bufferobj_source
+#define intelInitBufferObjectFuncs          old_intelInitBufferObjectFuncs
+#define intel_upload_data                   old_intel_upload_data
+#define intel_upload_finish                 old_intel_upload_finish
+#define intel_batchbuffer_data              old_intel_batchbuffer_data
+#define intel_batchbuffer_emit_mi_flush     old_intel_batchbuffer_emit_mi_flush
+#define intel_batchbuffer_emit_reloc        old_intel_batchbuffer_emit_reloc
+#define intel_batchbuffer_emit_reloc_fenced old_intel_batchbuffer_emit_reloc_fenced
+#define _intel_batchbuffer_flush            old__intel_batchbuffer_flush
+#define intel_batchbuffer_free              old_intel_batchbuffer_free
+#define intel_batchbuffer_init              old_intel_batchbuffer_init
+#define intelInitClearFuncs                 old_intelInitClearFuncs
+#define intelInitExtensions                 old_intelInitExtensions
+#define intel_miptree_copy_teximage         old_intel_miptree_copy_teximage
+#define intel_miptree_create                old_intel_miptree_create
+#define intel_miptree_create_for_bo         old_intel_miptree_create_for_bo
+#define intel_miptree_create_for_dri2_buffer old_intel_miptree_create_for_dri2_buffer
+#define intel_miptree_create_for_renderbuffer old_intel_miptree_create_for_renderbuffer
+#define intel_miptree_create_layout         old_intel_miptree_create_layout
+#define intel_miptree_get_dimensions_for_image old_intel_miptree_get_dimensions_for_image
+#define intel_miptree_get_image_offset      old_intel_miptree_get_image_offset
+#define intel_miptree_get_tile_offsets      old_intel_miptree_get_tile_offsets
+#define intel_miptree_map                   old_intel_miptree_map
+#define intel_miptree_map_raw               old_intel_miptree_map_raw
+#define intel_miptree_match_image           old_intel_miptree_match_image
+#define intel_miptree_reference             old_intel_miptree_reference
+#define intel_miptree_release               old_intel_miptree_release
+#define intel_miptree_set_image_offset      old_intel_miptree_set_image_offset
+#define intel_miptree_set_level_info        old_intel_miptree_set_level_info
+#define intel_miptree_unmap                 old_intel_miptree_unmap
+#define intel_miptree_unmap_raw             old_intel_miptree_unmap_raw
+#define i945_miptree_layout_2d              old_i945_miptree_layout_2d
+#define intel_get_texture_alignment_unit    old_intel_get_texture_alignment_unit
+#define intelInitTextureImageFuncs          old_intelInitTextureImageFuncs
+#define intel_miptree_create_for_teximage   old_intel_miptree_create_for_teximage
+#define intelSetTexBuffer                   old_intelSetTexBuffer
+#define intelSetTexBuffer2                  old_intelSetTexBuffer2
+#define intelInitTextureSubImageFuncs       old_intelInitTextureSubImageFuncs
+#define intelInitTextureCopyImageFuncs      old_intelInitTextureCopyImageFuncs
+#define intel_finalize_mipmap_tree          old_intel_finalize_mipmap_tree
+#define intelInitTextureFuncs               old_intelInitTextureFuncs
+#define intel_check_blit_fragment_ops       old_intel_check_blit_fragment_ops
+#define intelInitPixelFuncs                 old_intelInitPixelFuncs
+#define intelBitmap                         old_intelBitmap
+#define intelCopyPixels                     old_intelCopyPixels
+#define intelDrawPixels                     old_intelDrawPixels
+#define intelReadPixels                     old_intelReadPixels
+#define intel_check_front_buffer_rendering  old_intel_check_front_buffer_rendering
+#define intelInitBufferFuncs                old_intelInitBufferFuncs
+#define intelClearWithBlit                  old_intelClearWithBlit
+#define intelEmitCopyBlit                   old_intelEmitCopyBlit
+#define intelEmitImmediateColorExpandBlit   old_intelEmitImmediateColorExpandBlit
+#define intel_emit_linear_blit              old_intel_emit_linear_blit
+#define intel_miptree_blit                  old_intel_miptree_blit
+#define i945_miptree_layout                 old_i945_miptree_layout
+#define intel_init_texture_formats          old_intel_init_texture_formats
+#define intelCalcViewport                   old_intelCalcViewport
+#define INTEL_DEBUG                         old_INTEL_DEBUG
+#define intelDestroyContext                 old_intelDestroyContext
+#define intelFinish                         old_intelFinish
+#define _intel_flush                        old__intel_flush
+#define intel_flush_rendering_to_batch      old_intel_flush_rendering_to_batch
+#define intelInitContext                    old_intelInitContext
+#define intelInitDriverFunctions            old_intelInitDriverFunctions
+#define intelMakeCurrent                    old_intelMakeCurrent
+#define intel_prepare_render                old_intel_prepare_render
+#define intelUnbindContext                  old_intelUnbindContext
+#define intel_update_renderbuffers          old_intel_update_renderbuffers
+#define aub_dump_bmp                        old_aub_dump_bmp
+#define get_time                            old_get_time
+#define intel_translate_blend_factor        old_intel_translate_blend_factor
+#define intel_translate_compare_func        old_intel_translate_compare_func
+#define intel_translate_logic_op            old_intel_translate_logic_op
+#define intel_translate_shadow_compare_func old_intel_translate_shadow_compare_func
+#define intel_translate_stencil_op          old_intel_translate_stencil_op
+#define intel_init_syncobj_functions        old_intel_init_syncobj_functions
+#define intelChooseRenderState              old_intelChooseRenderState
+#define intelFallback                       old_intelFallback
+#define intel_finish_vb                     old_intel_finish_vb
+#define intel_flush_prim                    old_intel_flush_prim
+#define intel_get_prim_space                old_intel_get_prim_space
+#define intelInitTriFuncs                   old_intelInitTriFuncs
+#define intel_set_prim                      old_intel_set_prim
+#define intel_create_private_renderbuffer   old_intel_create_private_renderbuffer
+#define intel_create_renderbuffer           old_intel_create_renderbuffer
+#define intel_fbo_init                      old_intel_fbo_init
+#define intel_get_rb_region                 old_intel_get_rb_region
+#define intel_renderbuffer_set_draw_offset  old_intel_renderbuffer_set_draw_offset
+
 extern void intelDestroyContext(__DRIcontext * driContextPriv);
 
 extern GLboolean intelUnbindContext(__DRIcontext * driContextPriv);
 
+const __DRIextension **__driDriverGetExtensions_i915(void);
+
 extern GLboolean
 intelMakeCurrent(__DRIcontext * driContextPriv,
                  __DRIdrawable * driDrawPriv,
-- 
1.8.4.rc3



More information about the mesa-dev mailing list