iris: Add mechanism for iris-specific driconf options
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 19 Apr 2019 05:13:41 +0000 (22:13 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 22 Apr 2019 16:35:36 +0000 (09:35 -0700)
Based on Nicolai's 0f8c5de8690e7c87aa2e24383065efaca7e6fe78.

Reviewed-by: Dylan Baker <dylan@pnwbakers.com>
src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
src/gallium/auxiliary/target-helpers/drm_helper.h
src/gallium/auxiliary/target-helpers/drm_helper_public.h
src/gallium/drivers/iris/Android.mk
src/gallium/drivers/iris/Makefile.sources
src/gallium/drivers/iris/driinfo_iris.h [new file with mode: 0644]
src/gallium/drivers/iris/iris_screen.c
src/gallium/drivers/iris/iris_screen.h
src/gallium/drivers/iris/meson.build
src/gallium/winsys/iris/drm/iris_drm_public.h
src/gallium/winsys/iris/drm/iris_drm_winsys.c

index a9028394d4deee397c3182c8f91121b4f2f501d3..7aa733d5f59b7955438c041025c585a4e330a407 100644 (file)
@@ -74,7 +74,7 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
     {
         .driver_name = "iris",
         .create_screen = pipe_iris_create_screen,
-        .configuration = pipe_default_configuration_query,
+        .configuration = pipe_iris_configuration_query,
     },
     {
         .driver_name = "nouveau",
index 3280312729e178a6bace61eb81dff19fa01b5e82..b98e17c3d9a5c58c7c54c6725fc27d91b9f49b1d 100644 (file)
@@ -68,10 +68,28 @@ pipe_iris_create_screen(int fd, const struct pipe_screen_config *config)
 {
    struct pipe_screen *screen;
 
-   screen = iris_drm_screen_create(fd);
+   screen = iris_drm_screen_create(fd, config);
    return screen ? debug_screen_wrap(screen) : NULL;
 }
 
+const struct drm_conf_ret *
+pipe_iris_configuration_query(enum drm_conf conf)
+{
+   static const struct drm_conf_ret xml_options_ret = {
+      .type = DRM_CONF_POINTER,
+      .val.val_pointer =
+#include "iris/iris_driinfo.h"
+   };
+
+   switch (conf) {
+   case DRM_CONF_XML_OPTIONS:
+      return &xml_options_ret;
+   default:
+      break;
+   }
+   return pipe_default_configuration_query(conf);
+}
+
 #else
 
 struct pipe_screen *
@@ -81,6 +99,12 @@ pipe_iris_create_screen(int fd, const struct pipe_screen_config *config)
    return NULL;
 }
 
+const struct drm_conf_ret *
+pipe_iris_configuration_query(enum drm_conf conf)
+{
+   return NULL;
+}
+
 #endif
 
 #ifdef GALLIUM_NOUVEAU
index 2cf05eb4577bed046ad60d2e023d11251ecce577..4b34d274926fbde64a6baa79077162c890f29458 100644 (file)
@@ -12,6 +12,8 @@ pipe_i915_create_screen(int fd, const struct pipe_screen_config *config);
 
 struct pipe_screen *
 pipe_iris_create_screen(int fd, const struct pipe_screen_config *config);
+const struct drm_conf_ret *
+pipe_iris_configuration_query(enum drm_conf conf);
 
 struct pipe_screen *
 pipe_nouveau_create_screen(int fd, const struct pipe_screen_config *config);
index ba59eb566bba569f27e7db6e7f3b073abc957305..f80f34f4b7708ac62a6d7e99e691a64515681d7b 100644 (file)
@@ -125,6 +125,24 @@ include $(BUILD_STATIC_LIBRARY)
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := libmesa_pipe_iris
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+intermediates := $(call local-generated-sources-dir)
+
+LOCAL_GENERATED_SOURCES := $(addprefix $(intermediates)/iris/,$(GENERATED_SOURCES))
+
+GEN_DRIINFO_INPUTS := \
+        $(MESA_TOP)/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h \
+        $(LOCAL_PATH)/driinfo_iris.h
+
+MERGE_DRIINFO := $(MESA_TOP)/src/util/merge_driinfo.py
+
+$(intermediates)/iris/si_driinfo.h: $(MERGE_DRIINFO) $(GEN_DRIINFO_INPUTS)
+       @mkdir -p $(dir $@)
+       @echo "Gen Header: $(PRIVATE_MODULE) <= $(notdir $(@))"
+       $(hide) $(MESA_PYTHON2) $(MERGE_DRIINFO) $(GEN_DRIINFO_INPUTS) > $@ || ($(RM) $@; false)
+
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(intermediates)
 
 LOCAL_SRC_FILES := \
        $(IRIS_C_SOURCES)
index 7ea5896e976ef1356c620bd0e5f80d6c42134ea4..6876935b99f297bd9af9d5d1438c5d5531d9b347 100644 (file)
 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 # DEALINGS IN THE SOFTWARE.
 
+GENERATED_SOURCES := \
+       iris_driinfo.h
+
 IRIS_C_SOURCES = \
+       $(GENERATED_SOURCES) \
+       driinfo_iris.h \
        iris_batch.c \
        iris_batch.h \
        iris_binder.c \
diff --git a/src/gallium/drivers/iris/driinfo_iris.h b/src/gallium/drivers/iris/driinfo_iris.h
new file mode 100644 (file)
index 0000000..0d513bc
--- /dev/null
@@ -0,0 +1 @@
+// iris specific driconf options
index 6dff3a47b65daa80df13f82a63e549ab9a7ce4d2..3e1cabafb701522e54273dab3a34d0919e4042e6 100644 (file)
@@ -552,7 +552,7 @@ iris_shader_perf_log(void *data, const char *fmt, ...)
 }
 
 struct pipe_screen *
-iris_screen_create(int fd)
+iris_screen_create(int fd, const struct pipe_screen_config *config)
 {
    struct iris_screen *screen = rzalloc(NULL, struct iris_screen);
    if (!screen)
index 475975747c3963404b0e591944c1b53911ec1dd4..8a75374429f5ca5346a3a7562e97a956eea90bce 100644 (file)
@@ -74,7 +74,8 @@ struct iris_screen {
    struct iris_bo *workaround_bo;
 };
 
-struct pipe_screen *iris_screen_create(int fd);
+struct pipe_screen *
+iris_screen_create(int fd, const struct pipe_screen_config *config);
 
 boolean
 iris_is_format_supported(struct pipe_screen *pscreen,
index 30c317fe4811a2e0d44b37d356019713f672ba1a..673b2170e1a25d4cf6efa361be9f2823cd8f332b 100644 (file)
@@ -19,6 +19,7 @@
 # SOFTWARE.
 
 files_libiris = files(
+  'driinfo_iris.h',
   'iris_batch.c',
   'iris_batch.h',
   'iris_binder.c',
@@ -46,6 +47,17 @@ files_libiris = files(
   'iris_screen.h',
 )
 
+iris_driinfo_h = custom_target(
+  'iris_driinfo.h',
+  input : files(
+    '../../../util/merge_driinfo.py',
+    '../../auxiliary/pipe-loader/driinfo_gallium.h', 'driinfo_iris.h'
+  ),
+  output : 'iris_driinfo.h',
+  command : [prog_python, '@INPUT@'],
+  capture : true,
+)
+
 iris_gen_libs = []
 foreach v : ['80', '90', '100', '110']
   iris_gen_libs += static_library(
@@ -62,7 +74,8 @@ endforeach
 
 libiris = static_library(
   'iris',
-  [files_libiris, gen_xml_pack, nir_opcodes_h, nir_builder_opcodes_h],
+  [files_libiris, gen_xml_pack, nir_opcodes_h, nir_builder_opcodes_h,
+   iris_driinfo_h],
   include_directories : [
     inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_intel, inc_nir,
     inc_gallium_drivers,
@@ -80,5 +93,6 @@ libiris = static_library(
 
 driver_iris = declare_dependency(
   compile_args : '-DGALLIUM_IRIS',
+  sources : iris_driinfo_h,
   link_with : [libiris, libiriswinsys],
 )
index 17c0b2e1a8f6bedb6ee84f7e5130922370353f9b..f942e05ad8b5461861d8fa4643e9158ec5a17ee4 100644 (file)
@@ -25,7 +25,9 @@
 #define IRIS_DRM_PUBLIC_H
 
 struct pipe_screen;
+struct pipe_screen_config;
 
-struct pipe_screen *iris_drm_screen_create(int drm_fd);
+struct pipe_screen *
+iris_drm_screen_create(int drm_fd, const struct pipe_screen_config *config);
 
 #endif /* IRIS_DRM_PUBLIC_H */
index 49c7c0f41e25a9960929f7173a3d812102d8eb17..9903f40a843639217f84a54dcf84673c9c7aecd3 100644 (file)
@@ -28,7 +28,7 @@
 #include "iris/iris_screen.h"
 
 struct pipe_screen *
-iris_drm_screen_create(int fd)
+iris_drm_screen_create(int fd, const struct pipe_screen_config *config)
 {
-   return iris_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3));
+   return iris_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), config);
 }