native.h revision c67ad0eee8f75e1fd65e8ab2fdd660dc132764ee
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 *
1749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#ifndef _NATIVE_H_
2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#define _NATIVE_H_
2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "EGL/egl.h"  /* for EGL native types */
2949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/gl.h" /* for GL types needed by __GLcontextModes */
3049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/internal/glcore.h"  /* for __GLcontextModes */
3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h"
3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h"
3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h"
3549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h"
3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
3849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Only color buffers are listed.  The others are allocated privately through,
3949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * for example, st_renderbuffer_alloc_storage().
4049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
4149381d63e61c724b156b76068058df1c01a906c2Chia-I Wuenum native_attachment {
4249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_LEFT,
4349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_LEFT,
4449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_RIGHT,
4549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_RIGHT,
4649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
4749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NUM_NATIVE_ATTACHMENTS
4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_surface {
5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_surface *nsurf);
5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
5349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
5449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Swap the front and back buffers so that the back buffer is visible.  It
5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * is no-op if the surface is single-buffered.  The contents of the back
5649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * buffer after swapping may or may not be preserved.
5749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
5849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean (*swap_buffers)(struct native_surface *nsurf);
5949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
6049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
6149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Make the front buffer visible.  In some native displays, changes to the
6249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * front buffer might not be visible immediately and require manual flush.
6349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
6449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean (*flush_frontbuffer)(struct native_surface *nsurf);
6549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
6649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
6749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Validate the buffers of the surface.  Those not listed in the attachments
6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * will be destroyed.  The returned textures are owned by the caller.
6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean (*validate)(struct native_surface *nsurf,
7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       const enum native_attachment *natts,
7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       unsigned num_natts,
7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       struct pipe_texture **textures,
7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       int *width, int *height);
7549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
7649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
7749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Wait until all native commands affecting the surface has been executed.
7849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
7949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*wait)(struct native_surface *nsurf);
8049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
8149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
8249381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_config {
8349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   __GLcontextModes mode;
8449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format color_format;
8549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format depth_format;
8649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format stencil_format;
87c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
88c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /* treat it as an additional flag to mode.drawableType */
89c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   boolean scanout_bit;
90c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
91c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
92c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_connector {
93c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   int dummy;
9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
9549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
96c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_mode {
97c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const char *desc;
98c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   int width, height;
99c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   int refresh_rate;
100c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
101c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
102c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_display_modeset;
103c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
10449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
10549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * A pipe winsys abstracts the OS.  A pipe screen abstracts the graphcis
10649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * hardware.  A native display consists of a pipe winsys, a pipe screen, and
10749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the native display server.
10849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
10949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display {
11049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct pipe_screen *screen;
11149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_display *ndpy);
11249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
11349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
11449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Get the supported configs.  The configs are owned by the display, but
11549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * the returned array should be free()ed.
11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    *
11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * The configs will be converted to EGL config by
11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * _eglConfigFromContextModesRec and validated by _eglValidateConfig.
11949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Those failing to pass the test will be skipped.
12049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   const struct native_config **(*get_configs)(struct native_display *ndpy,
12249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                               int *num_configs);
12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
12449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
12549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a pipe context.
12649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
12749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct pipe_context *(*create_context)(struct native_display *ndpy,
12849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                          void *context_private);
12949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
13049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
13149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a window surface.  Required unless no config has GLX_WINDOW_BIT
13249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * set.
13349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
13449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_window_surface)(struct native_display *ndpy,
13549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativeWindowType win,
13649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
13749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
13849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
13949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a pixmap surface.  Required unless no config has GLX_PIXMAP_BIT
14049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * set.
14149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
14249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativePixmapType pix,
14449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Create a pbuffer surface.  Required unless no config has GLX_PBUFFER_BIT
14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * set.
14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_pbuffer_surface)(struct native_display *ndpy,
15149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                    const struct native_config *nconf,
15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                    uint width, uint height);
15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
154c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const struct native_display_modeset *modeset;
155c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
15649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
157c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu/**
158c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Mode setting interface of the native display.  It exposes the mode setting
159c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * capabilities of the underlying graphics hardware.
160c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */
161c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_display_modeset {
16249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
163c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * Get the available physical connectors and the number of CRTCs.
16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
165c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const struct native_connector **(*get_connectors)(struct native_display *ndpy,
166c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                                     int *num_connectors,
167c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                                     int *num_crtcs);
168c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
169c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /**
170c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * Get the current supported modes of a connector.  The returned modes may
171c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * change every time this function is called and those from previous calls
172c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * might become invalid.
173c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    */
174c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const struct native_mode **(*get_modes)(struct native_display *ndpy,
175c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                           const struct native_connector *nconn,
176c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                           int *num_modes);
17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
178c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /**
179c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * Create a scan-out surface.  Required unless no config has
180c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * GLX_SCREEN_BIT_MESA set.
181c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    */
182c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   struct native_surface *(*create_scanout_surface)(struct native_display *ndpy,
183c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                                    const struct native_config *nconf,
184c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                                                    uint width, uint height);
185c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
186c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /**
187c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * Program the CRTC to output the surface to the given connectors with the
188c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * given mode.  When surface is not given, the CRTC is disabled.
189c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    *
190c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * This interface does not export a way to query capabilities of the CRTCs.
191c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * The native display usually needs to dynamically map the index to a CRTC
192c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    * that supports the given connectors.
193c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    */
194c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   boolean (*program)(struct native_display *ndpy, int crtc_idx,
195c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                      struct native_surface *nsurf, uint x, uint y,
196c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                      const struct native_connector **nconns, int num_nconns,
197c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu                      const struct native_mode *nmode);
198c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
19949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
20049381d63e61c724b156b76068058df1c01a906c2Chia-I Wutypedef void (*native_flush_frontbuffer)(void *dummy,
20149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                         struct pipe_surface *surf,
20249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                         void *context_private);
20349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
20449381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst char *
20549381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_get_name(void);
20649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
20749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display *
20849381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_create_display(EGLNativeDisplayType dpy,
20949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                      native_flush_frontbuffer flush_frontbuffer);
21049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
21149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#endif /* _NATIVE_H_ */
212