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
3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h"
3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h"
3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h"
3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h"
35d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu#include "state_tracker/sw_winsys.h"
3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
37a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu#ifdef __cplusplus
38a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wuextern "C" {
39a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu#endif
40a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu
41af977b53826695afcdcfe900816a93671aec00f5Chia-I Wu#include "native_buffer.h"
4289a75b763467d83d4d402c91db55548682be14f0Chia-I Wu#include "native_modeset.h"
43184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#include "native_wayland_bufmgr.h"
4489a75b763467d83d4d402c91db55548682be14f0Chia-I Wu
4549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
4649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Only color buffers are listed.  The others are allocated privately through,
4749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * for example, st_renderbuffer_alloc_storage().
4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wuenum native_attachment {
5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_LEFT,
5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_LEFT,
5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_FRONT_RIGHT,
5349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NATIVE_ATTACHMENT_BACK_RIGHT,
5449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   NUM_NATIVE_ATTACHMENTS
5649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
5749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
58fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wuenum native_param_type {
59fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   /*
60fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * Return TRUE if window/pixmap surfaces use the buffers of the native
61fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * types.
62fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    */
6394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   NATIVE_PARAM_USE_NATIVE_BUFFER,
6494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
6594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   /**
6694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    * Return TRUE if native_surface::present can preserve the buffer.
6794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    */
6894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   NATIVE_PARAM_PRESERVE_BUFFER,
6994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
7094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   /**
7194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    * Return the maximum supported swap interval.
7294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    */
73f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu   NATIVE_PARAM_MAX_SWAP_INTERVAL,
74f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu
75f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu   /**
76f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu    * Return TRUE if the display supports premultiplied alpha, regardless of
77f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu    * the surface color format.
7841f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu    *
7941f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu    * Note that returning TRUE for this parameter will make
8041f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu    * EGL_VG_ALPHA_FORMAT_PRE_BIT to be set for all EGLConfig's with non-zero
8141f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu    * EGL_ALPHA_SIZE.  EGL_VG_ALPHA_FORMAT attribute of a surface will affect
8241f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu    * how the surface is presented.
83f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu    */
84fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   NATIVE_PARAM_PREMULTIPLIED_ALPHA,
85fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund
86fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   /**
87fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund    * Return TRUE if native_surface::present supports presenting a partial
88fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund    * surface.
89fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund    */
90fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   NATIVE_PARAM_PRESENT_REGION
91fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu};
92fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
9308e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu/**
9408e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu * Control how a surface presentation should happen.
9508e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu */
9608e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wustruct native_present_control {
9708e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   /**< the attachment to present */
9808e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   enum native_attachment natt;
9908e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu
10008e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   /**< the contents of the presented attachment should be preserved */
10108e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   boolean preserve;
10208e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu
10308e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   /**< wait until the given vsyncs has passed since the last presentation */
10408e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   uint swap_interval;
105f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu
106f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu   /**< pixels use premultiplied alpha */
107f4c37d6ab256f860a755fe69dfea5fb8df217a2fChia-I Wu   boolean premultiplied_alpha;
108fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund
109fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   /**< The region to present. y=0=top.
110fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund        If num_rects is 0, the whole surface is to be presented */
111fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   int num_rects;
112fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund   const int *rects; /* x, y, width, height */
11308e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu};
11408e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu
11549381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_surface {
116e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   /**
117e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * Available for caller's use.
118e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    */
119e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void *user_data;
120e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_surface *nsurf);
12249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
12494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    * Present the given buffer to the native engine.
12594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu    */
12694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   boolean (*present)(struct native_surface *nsurf,
12708e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu                      const struct native_present_control *ctrl);
12894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
12994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   /**
130fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * Validate the buffers of the surface.  textures, if not NULL, points to an
131fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
132fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * by the caller.  A sequence number is also returned.  The caller can use
133fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * it to check if anything has changed since the last call. Any of the
134fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * pointers may be NULL and it indicates the caller has no interest in those
135fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * values.
1361c1015bd53843a840a1fda6d2eb58d45da3e9fd0Chia-I Wu    *
137fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * If this function is called multiple times with different attachment
138fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * masks, those not listed in the latest call might be destroyed.  This
139fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu    * behavior might change in the future.
14049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
141fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu   boolean (*validate)(struct native_surface *nsurf, uint attachment_mask,
142287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                       unsigned int *seq_num, struct pipe_resource **textures,
14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                       int *width, int *height);
14449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Wait until all native commands affecting the surface has been executed.
14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*wait)(struct native_surface *nsurf);
14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
151f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu/**
152f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu * Describe a native display config.
153f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu */
15449381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_config {
155f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   /* available buffers and their format */
156f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   uint buffer_mask;
15749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format color_format;
158c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
159f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   /* supported surface types */
160f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   boolean window_bit;
161f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   boolean pixmap_bit;
162c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   boolean scanout_bit;
163f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu
164f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   int native_visual_id;
165f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   int native_visual_type;
166f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   int level;
167f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   boolean transparent_rgb;
168f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   int transparent_rgb_values[3];
169c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
170c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu
17149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
17249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * A pipe winsys abstracts the OS.  A pipe screen abstracts the graphcis
17349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * hardware.  A native display consists of a pipe winsys, a pipe screen, and
17449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the native display server.
17549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
17649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display {
17751b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu   /**
17851b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu    * The pipe screen of the native display.
17951b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu    */
18049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct pipe_screen *screen;
18151b00574a2ef81629548b079ef70c016bdd4251dChia-I Wu
182e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   /**
183d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom    * Context used for copy operations.
184d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom    */
185d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   struct pipe_context *pipe;
186d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom
187d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   /**
188e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * Available for caller's use.
189e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    */
190e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void *user_data;
191e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
19273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   /**
19373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    * Initialize and create the pipe screen.
19473df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    */
19573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   boolean (*init_screen)(struct native_display *ndpy);
19673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu
19749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   void (*destroy)(struct native_display *ndpy);
19849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
19949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
200fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * Query the parameters of the native display.
201fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    *
202fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    * The return value is defined by the parameter.
203fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu    */
204fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   int (*get_param)(struct native_display *ndpy,
205fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu                    enum native_param_type param);
206fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
207fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   /**
20849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    * Get the supported configs.  The configs are owned by the display, but
209870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu    * the returned array should be FREE()ed.
21049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
21149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   const struct native_config **(*get_configs)(struct native_display *ndpy,
21249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                               int *num_configs);
21349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
21449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
215a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu    * Get the color format of the pixmap.  Required unless no config has
216a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu    * pixmap_bit set.
217f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu    */
218a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   boolean (*get_pixmap_format)(struct native_display *ndpy,
219a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu                                EGLNativePixmapType pix,
220a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu                                enum pipe_format *format);
221f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu
2227c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu   /**
2237c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu    * Copy the contents of the resource to the pixmap's front-left attachment.
2247c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu    * This is used to implement eglCopyBuffers.  Required unless no config has
2257c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu    * pixmap_bit set.
2267c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu    */
2277c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu   boolean (*copy_to_pixmap)(struct native_display *ndpy,
2287c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu                             EGLNativePixmapType pix,
2297c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu                             struct pipe_resource *src);
23049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
23149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
232f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu    * Create a window surface.  Required unless no config has window_bit set.
23349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
23449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_window_surface)(struct native_display *ndpy,
23549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativeWindowType win,
23649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
23749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
23849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /**
239af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu    * Create a pixmap surface.  The native config may be NULL.  In that case, a
240af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu    * "best config" will be picked.  Required unless no config has pixmap_bit
241af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu    * set.
24249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu    */
24349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
24449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   EGLNativePixmapType pix,
24549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                                   const struct native_config *nconf);
24649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
247af977b53826695afcdcfe900816a93671aec00f5Chia-I Wu   const struct native_display_buffer *buffer;
248c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   const struct native_display_modeset *modeset;
249184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   const struct native_display_wayland_bufmgr *wayland_bufmgr;
250c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
25149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
252c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu/**
253e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * The handler for events that a native display may generate.  The events are
254e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * generated asynchronously and the handler may be called by any thread at any
255e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu * time.
256c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */
257e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wustruct native_event_handler {
258c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu   /**
259e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu    * This function is called when a surface needs to be validated.
260c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu    */
261e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   void (*invalid_surface)(struct native_display *ndpy,
262e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu                           struct native_surface *nsurf,
263e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu                           unsigned int seq_num);
264d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu
265d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu   struct pipe_screen *(*new_drm_screen)(struct native_display *ndpy,
266d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu                                         const char *name, int fd);
267d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu   struct pipe_screen *(*new_sw_screen)(struct native_display *ndpy,
268d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu                                        struct sw_winsys *ws);
269737bd7367e5a99cf64ec4bfc4420e3380b60878fBenjamin Franzke
270737bd7367e5a99cf64ec4bfc4420e3380b60878fBenjamin Franzke   struct pipe_resource *(*lookup_egl_image)(struct native_display *ndpy,
271737bd7367e5a99cf64ec4bfc4420e3380b60878fBenjamin Franzke                                             void *egl_image);
272c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu};
27349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
274fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu/**
275fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu * Test whether an attachment is set in the mask.
276fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu */
277fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wustatic INLINE boolean
278fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wunative_attachment_mask_test(uint mask, enum native_attachment att)
279fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu{
280fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu   return !!(mask & (1 << att));
281fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu}
282fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu
283d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom/**
284d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom * Get the display copy context
285d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom */
286d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstromstatic INLINE struct pipe_context *
287d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstromndpy_get_copy_context(struct native_display *ndpy)
288d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom{
289d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   if (!ndpy->pipe)
290d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom      ndpy->pipe = ndpy->screen->context_create(ndpy->screen, NULL);
291d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   return ndpy->pipe;
292d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom}
293d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom
294d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom/**
295d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom * Free display screen and context resources
296d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom */
297d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstromstatic INLINE void
298d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstromndpy_uninit(struct native_display *ndpy)
299d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom{
300d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   if (ndpy->pipe)
301d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom      ndpy->pipe->destroy(ndpy->pipe);
302d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom   if (ndpy->screen)
303d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom      ndpy->screen->destroy(ndpy->screen);
304d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom}
305d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom
306f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wustruct native_platform {
307f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu   const char *name;
30849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
30973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   /**
31073df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    * Create the native display and usually establish a connection to the
31173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    * display server.
31273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    *
31373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    * No event should be generated at this stage.
31473df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu    */
31573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   struct native_display *(*create_display)(void *dpy, boolean use_sw);
316f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu};
317f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu
318f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wuconst struct native_platform *
31973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_gdi_platform(const struct native_event_handler *event_handler);
320ea05299ce54ea0463626277907cab8e849884740Chia-I Wu
321ea05299ce54ea0463626277907cab8e849884740Chia-I Wuconst struct native_platform *
32273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_x11_platform(const struct native_event_handler *event_handler);
323ea05299ce54ea0463626277907cab8e849884740Chia-I Wu
324ea05299ce54ea0463626277907cab8e849884740Chia-I Wuconst struct native_platform *
32573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_wayland_platform(const struct native_event_handler *event_handler);
326381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
327381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkeconst struct native_platform *
32873df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_drm_platform(const struct native_event_handler *event_handler);
329ea05299ce54ea0463626277907cab8e849884740Chia-I Wu
330ea05299ce54ea0463626277907cab8e849884740Chia-I Wuconst struct native_platform *
33173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_fbdev_platform(const struct native_event_handler *event_handler);
33249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
33315418a850575b2a33132165605293ed835b4be53Chia-I Wuconst struct native_platform *
334a5f8d37be141fac5c4ac605163a552ac64324e15Chia-I Wunative_get_null_platform(const struct native_event_handler *event_handler);
335a5f8d37be141fac5c4ac605163a552ac64324e15Chia-I Wu
336a5f8d37be141fac5c4ac605163a552ac64324e15Chia-I Wuconst struct native_platform *
33715418a850575b2a33132165605293ed835b4be53Chia-I Wunative_get_android_platform(const struct native_event_handler *event_handler);
33815418a850575b2a33132165605293ed835b4be53Chia-I Wu
339a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu#ifdef __cplusplus
340a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu}
341a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu#endif
342a5f4338fc4f9b4500c5754de237f77549b3cedf8Chia-I Wu
34349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#endif /* _NATIVE_H_ */
344