jdk/src/java.desktop/unix/native/libsunwjdga/jdgadevice.h
changeset 47213 57173ad5c534
parent 47212 000f4e4ddd39
parent 47211 75e8600f1136
child 47214 22850b3a5524
equal deleted inserted replaced
47212:000f4e4ddd39 47213:57173ad5c534
     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_ */