1 /*
2  * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #ifndef _JDGADEVICE_H_
27 #define _JDGADEVICE_H_
28 
29 /*
30  *   Interface for Supporting DGA to Framebuffers under Java
31  *   -------------------------------------------------------
32  *
33  *  This interface will allow third party (and Sun) framebuffers which
34  *  support the Direct Graphics Access (DGA) interface to be accessed with
35  *  DGA in Java applications.
36  *
37  *  It coexists with the existing device-independent interfaces provided in
38  *  libsunwjdga.so.
39  *
40  *  Framebuffers desiring access to Java DGA must supply a dynamically
41  *  loaded library named "libjdga<fbname>.so", where <fbname> is the name
42  *  returned by the VIS_GETIDENTIFIER ioctl as defined in the Solaris
43  *  VISUAL environment (visual_io(7i)). For example, the Java DGA library
44  *  for Sun's cg6 framebuffer will be named libjdgaSUNWcg6.so.
45  *
46  *  Because multiple instances of a framebuffer type may exist on a system,
47  *  the device-dependent library must avoid the use of static or global
48  *  variables for any framebuffer-related variables. In other words it
49  *  must be reentrant.
50  *
51  *  The device-independent function Solaris_JDga_LibInit() is called in the
52  *  static initializer for X11Graphics.java. Solaris_JDga_LibInit() will be
53  *  modified to seek out a device-dependent DGA library as follows.
54  *
55  *  - DGA grab the DefaultRootWindow to get a Dga_drawable.
56  *
57  *  - Use the Dga_drawable ID to get the device file descriptor
58  *       fd = dga_win_devfd(dga_draw_id)
59  *
60  *  - Use the VIS_GETIDENTIFIER ioctl to get the device name string.
61  *
62  *  - Construct the library path name using the device name string.
63  *    The device-dependent library must be located in a location specified
64  *    in the LD_LIBRARY_PATH.
65  *
66  *  - The device-dependent library will be dlopen'ed and then a dlsym will
67  *    be performed for the function "SolarisJDgaDevOpen", which must
68  *    be implemented by the device-dependent library writer.
69  *
70  *  - The function SolarisJDgaDevOpen() will then be called with a
71  *    pointer to a SolarisJDgaDevInfo structure. This structure will
72  *    have its major and minor version numbers filled in with their
73  *    current values by the device-independent calling code. The
74  *    device-dependent library must examine these version numbers and
75  *    act as follows:
76  *
77  *      - In all cases, the device-dependent code should reset the
78  *        supplied major and minor version numbers to those of the
79  *        device-dependent library.
80  *
81  *      - If the supplied major version number is not the same as that
82  *        of the device library, the open must fail and return JDGA_FAILED.
83  *
84  *      - If the supplied minor version number is less than or equal to
85  *        the device minor version number, then backward compatibility
86  *        is assumed and the open should return JDGA_SUCCESS.
87  *
88  *      - If the supplied minor version number is greater than the
89  *        device minor version number, the open should also return
90  *        JDGA_SUCCESS. The returned device minor version number will
91  *        indicate to the device-independent code what features are
92  *        supported in the device library.
93  *
94  *  - The function SolarisJDgaDevOpen() must also return a structure
95  *    containing function pointers as given in the SolarisJDgaDevFunc
96  *    structure below. The winlock and winunlock functions are
97  *    required only if there is some device-specific locking to be done
98  *    in addition to the DGA lock. If this is not required for the device
99  *    these function pointers may be specified as NULL pointers.
100  *
101  */
102 
103 #include <dga/dga.h>
104 #include <unistd.h>     /* ioctl */
105 #include <stdlib.h>
106 #include <sys/mman.h>   /* mmap */
107 #include <sys/visual_io.h>
108 #include <X11/Xlib.h>
109 
110 /*
111  * Status return codes
112  */
113 #ifndef _DEFINE_JDGASTATUS_
114 #define _DEFINE_JDGASTATUS_
115 typedef enum {
116     JDGA_SUCCESS        = 0,    /* operation succeeded */
117     JDGA_FAILED         = 1     /* unable to complete operation */
118 } JDgaStatus;
119 #endif
120 
121 /*
122  * Structure to be filled in by device-dependent library's
123  * SolarisJDgaDevOpen() function
124  */
125 typedef struct {
126   char *                         visidName; /* device name from ioctl */
127   int                         majorVersion;
128   int                         minorVersion;
129   struct _SolarisJDgaDevFuncList* function;    /* Device function pointers */
130 } SolarisJDgaDevInfo;
131 
132 /*
133  * Structure returned by device-dependent library for a window
134  */
135 typedef struct {
136   SolarisJDgaDevInfo* devInfo;        /* Supplied by caller */
137   Dga_drawable        dgaDraw;        /* Supplied by caller */
138   caddr_t             mapAddr;        /* FB mapping for this window */
139   int                 mapDepth;       /* Depth in bits */
140   int                 mapWidth;       /* Width in pixels */
141   int                 mapHeight;      /* Height in lines */
142   int                 mapLineStride;  /* Byte stride line-to-line */
143   int                 mapPixelStride; /* Byte stride pixel-to-pixel */
144   void*               privateData;    /* Handle for device-dependent library */
145 } SolarisJDgaWinInfo;
146 
147 typedef JDgaStatus (*SolarisJDgaDevFunction)(SolarisJDgaDevInfo*);
148 typedef JDgaStatus (*SolarisJDgaWinFunction)(SolarisJDgaWinInfo*);
149 
150 /*
151  * Structure for device-dependent functions
152  */
153 typedef struct _SolarisJDgaDevFuncList {
154   SolarisJDgaDevFunction devclose;
155   SolarisJDgaWinFunction winopen;
156   SolarisJDgaWinFunction winclose;
157   SolarisJDgaWinFunction winlock;
158   SolarisJDgaWinFunction winunlock;
159 } SolarisJDgaDevFuncList;
160 
161 /*
162  * Function to be supplied by the device-dependent library implementor.
163  * It will accept a SolarisJDgaDevInfo structure with a filled-in
164  * major and minor version number and will return updated version
165  * numbers and the function pointers described below.
166  */
167 typedef JDgaStatus SolarisJDgaDevOpenFunc(SolarisJDgaDevInfo* devInfo);
168 
169 JDgaStatus SolarisJDgaDevOpen(SolarisJDgaDevInfo* devInfo);
170 
171 /*
172  * Functions supplied by the device-dependent library.
173  * These function pointers will be returned to the
174  * device-independent code in the SolarisJDgaDevFunc structure.
175  */
176 
177 JDgaStatus (*winopen)(SolarisJDgaWinInfo* info);
178 
179 /*
180  *  Fills in window-specific information in the supplied SolarisJDgaWinInfo
181  *  structure. Because multiple windows may be open concurrently,
182  *  implementations should avoid the use of static structures.
183  */
184 
185 JDgaStatus (*winclose)(SolarisJDgaWinInfo* info);
186 
187 /*
188  *  Frees any resources allocated by the device-dependent library for
189  *  this window.  It may also perform an unmap if this is the last
190  *  window using this particular memory map. Devices, such as the FFB,
191  *  which support multiple depths, can have different device memory
192  *  mappings for different depths.
193  */
194 
195 JDgaStatus (*winlock)(SolarisJDgaWinInfo* info);
196 
197 /*
198  *  Performs any device-specific locking needed for the framebuffer.
199  *  In most cases it will be unnecessary. In those cases, the
200  *  device-dependent library can supply NULL for this function pointer.
201  */
202 
203 JDgaStatus (*winunlock)(SolarisJDgaWinInfo* info);
204 
205 /*
206  *  Performs any device-specific unlocking needed for the framebuffer.
207  *  In most cases it will be unnecessary. In those cases, the
208  *  device-dependent library can supply NULL for this function pointer.
209  */
210 
211 JDgaStatus (*devclose)(SolarisJDgaDevInfo* info);
212 
213 /*
214  *  This function will be called at the last usage of the framebuffer
215  *  device to allow the library to clean up any remaining resources.
216  */
217 
218 #endif  /* _JDGADEVICE_H_ */
219