native.h revision 287c94ea4987033f9c99a2f91c5750c9083504ca
149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/*
249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library
349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version:  7.8
449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"),
949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation
1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions:
1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included
1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software.
1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#ifndef _NATIVE_H_
2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#define _NATIVE_H_
2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "EGL/egl.h"  /* for EGL native types */
3049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/gl.h" /* for GL types needed by __GLcontextModes */
3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/internal/glcore.h"  /* for __GLcontextModes */
3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h"
3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h"
3549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h"
3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h"
3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
38b80b817195d47984907f46ab74d5146e91bce4cfChia-I Wu#include "native_probe.h"
3989a75b763467d83d4d402c91db55548682be14f0Chia-I Wu#include "native_modeset.h"
4089a75b763467d83d4d402c91db55548682be14f0Chia-I Wu
4149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
4249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Only color buffers are listed.  The others are allocated privately through,
4349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * for example, st_renderbuffer_alloc_storage().
4449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
4549381d63e61c724b156b76068058df1c01a906c2Chia-I Wuenum native_attachment {
4649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_LEFT,
4749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_LEFT,
4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_RIGHT,
4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_RIGHT,
5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NUM_NATIVE_ATTACHMENTS
5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
5349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
54fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wuenum native_param_type {
55fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   /*
56fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * Return TRUE if window/pixmap surfaces use the buffers of the native
57fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * types.
58fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    */
59fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   NATIVE_PARAM_USE_NATIVE_BUFFER
60fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu};
61fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
6249381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_surface {
63e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   /**
64e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * Available for caller's use.
65e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    */
66e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void *user_data;
67e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_surface *nsurf);
6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Swap the front and back buffers so that the back buffer is visible.  It
7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * is no-op if the surface is single-buffered.  The contents of the back
7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * buffer after swapping may or may not be preserved.
7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
7549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean (*swap_buffers)(struct native_surface *nsurf);
7649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
7749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
7849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Make the front buffer visible.  In some native displays, changes to the
7949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * front buffer might not be visible immediately and require manual flush.
8049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
8149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean (*flush_frontbuffer)(struct native_surface *nsurf);
8249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
8349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
84fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * Validate the buffers of the surface.  textures, if not NULL, points to an
85fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
86fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * by the caller.  A sequence number is also returned.  The caller can use
87fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * it to check if anything has changed since the last call. Any of the
88fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * pointers may be NULL and it indicates the caller has no interest in those
89fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * values.
901c1015bd53843a840a1fda6d2eb58d45da3e9fd0Chia-I Wu    *
91fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * If this function is called multiple times with different attachment
92fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * masks, those not listed in the latest call might be destroyed.  This
93fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * behavior might change in the future.
9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
95fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu   boolean (*validate)(struct native_surface *nsurf, uint attachment_mask,
96287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                       unsigned int *seq_num, struct pipe_resource **textures,
9749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       int *width, int *height);
9849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
9949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
10049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Wait until all native commands affecting the surface has been executed.
10149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
10249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*wait)(struct native_surface *nsurf);
10349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
10449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
10549381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_config {
1061c1015bd53843a840a1fda6d2eb58d45da3e9fd0Chia-I Wu   /* __GLcontextModes should go away some day */
10749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   __GLcontextModes mode;
10849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format color_format;
10949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format depth_format;
11049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format stencil_format;
111c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
112c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /* treat it as an additional flag to mode.drawableType */
113c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   boolean scanout_bit;
114c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
115c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * A pipe winsys abstracts the OS.  A pipe screen abstracts the graphcis
11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * hardware.  A native display consists of a pipe winsys, a pipe screen, and
11949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the native display server.
12049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display {
12251b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu   /**
12351b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu    * The pipe screen of the native display.
12451b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu    */
12549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct pipe_screen *screen;
12651b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu
127e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   /**
128e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * Available for caller's use.
129e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    */
130e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void *user_data;
131e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
13249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_display *ndpy);
13349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
13449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
135fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * Query the parameters of the native display.
136fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    *
137fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * The return value is defined by the parameter.
138fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    */
139fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   int (*get_param)(struct native_display *ndpy,
140fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu                    enum native_param_type param);
141fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
142fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   /**
14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Get the supported configs.  The configs are owned by the display, but
14449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * the returned array should be free()ed.
14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    *
14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * The configs will be converted to EGL config by
14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * _eglConfigFromContextModesRec and validated by _eglValidateConfig.
14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Those failing to pass the test will be skipped.
14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   const struct native_config **(*get_configs)(struct native_display *ndpy,
15149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                               int *num_configs);
15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
154f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    * Test if a pixmap is supported by the given config.  Required unless no
155f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    * config has GLX_PIXMAP_BIT set.
156f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    *
157f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    * This function is usually called to find a config that supports a given
158f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    * pixmap.  Thus, it is usually called with the same pixmap in a row.
159f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    */
160f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu   boolean (*is_pixmap_supported)(struct native_display *ndpy,
161f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu                                  EGLNativePixmapType pix,
162f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu                                  const struct native_config *nconf);
163f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu
16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
16549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
16649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a window surface.  Required unless no config has GLX_WINDOW_BIT
16749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * set.
16849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
16949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_window_surface)(struct native_display *ndpy,
17049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativeWindowType win,
17149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
17249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
17349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
17449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a pixmap surface.  Required unless no config has GLX_PIXMAP_BIT
17549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * set.
17649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
17849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativePixmapType pix,
17949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
18049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
181c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const struct native_display_modeset *modeset;
182c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
18349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
184c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu/**
185e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * The handler for events that a native display may generate.  The events are
186e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * generated asynchronously and the handler may be called by any thread at any
187e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * time.
188c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */
189e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wustruct native_event_handler {
190c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /**
191e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * This function is called when a surface needs to be validated.
192c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    */
193e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void (*invalid_surface)(struct native_display *ndpy,
194e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu                           struct native_surface *nsurf,
195e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu                           unsigned int seq_num);
196c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
19749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
198fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu/**
199fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu * Test whether an attachment is set in the mask.
200fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu */
201fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wustatic INLINE boolean
202fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wunative_attachment_mask_test(uint mask, enum native_attachment att)
203fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu{
204fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu   return !!(mask & (1 << att));
205fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu}
206fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu
20749381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst char *
20849381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_get_name(void);
20949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
21049381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display *
211e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wunative_create_display(EGLNativeDisplayType dpy,
212e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu                      struct native_event_handler *handler);
21349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
21449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#endif /* _NATIVE_H_ */
215