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_ */