src/java.desktop/macosx/classes/sun/java2d/metal/MetalVolatileSurfaceManager.java
author aghaisas
Wed, 20 Feb 2019 17:00:40 +0530
branchmetal-prototype-branch
changeset 57196 a95707a39ff5
permissions -rw-r--r--
Description : Metal Rendering Pipeline - initial implementation of line and quad rendering Contributed-by: jdv, aghaisas

/*
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package sun.java2d.metal;

import sun.awt.AWTAccessor;
import sun.awt.image.SunVolatileImage;
import sun.awt.image.VolatileSurfaceManager;
import sun.java2d.SurfaceData;
import sun.java2d.opengl.OGLSurfaceData;

import java.awt.*;
import java.awt.image.ColorModel;
import java.awt.peer.ComponentPeer;

public class MetalVolatileSurfaceManager extends VolatileSurfaceManager {
    //private final boolean accelerationEnabled;
    public MetalVolatileSurfaceManager(SunVolatileImage vImg, Object context) {
        super(vImg, context);
        
        /*
         * We will attempt to accelerate this image only under the
         * following conditions:
         *   - the image is not bitmask AND the GraphicsConfig supports the FBO
         *     extension
         */
        /*int transparency = vImg.getTransparency();
         MetalGraphicsConfig gc = (MetalGraphicsConfig) vImg.getGraphicsConfig();
         accelerationEnabled = gc.isCapPresent(CAPS_EXT_FBOBJECT)
         && transparency != Transparency.BITMASK;*/
    }
    
    protected boolean isAccelerationEnabled() {
        return true;
    }
    
    /**
     * Create a FBO-based SurfaceData object (or init the backbuffer
     * of an existing window if this is a double buffered GraphicsConfig)
     */
    protected SurfaceData initAcceleratedSurface() {
        SurfaceData sData = null;
        Component comp = vImg.getComponent();
        final AWTAccessor.ComponentAccessor acc = AWTAccessor.getComponentAccessor();
        final ComponentPeer peer = (comp != null) ? acc.getPeer(comp) : null;
        
        try {
            /*boolean createVSynced = false;
             boolean forceback = false;
             if (context instanceof Boolean) {
             forceback = ((Boolean)context).booleanValue();
             if (forceback && peer instanceof BackBufferCapsProvider) {
             BackBufferCapsProvider provider =
             (BackBufferCapsProvider)peer;
             BufferCapabilities caps = provider.getBackBufferCaps();
             if (caps instanceof ExtendedBufferCapabilities) {
             ExtendedBufferCapabilities ebc =
             (ExtendedBufferCapabilities)caps;
             if (ebc.getVSync() == VSYNC_ON &&
             ebc.getFlipContents() == COPIED)
             {
             createVSynced = true;
             forceback = false;
             }
             }
             }
             }*/
            
            /*if (forceback) {
             // peer must be non-null in this case
             // TODO: modify parameter to delegate
             //                sData = CGLSurfaceData.createData(peer, vImg, FLIP_BACKBUFFER);
             } else {*/
            MetalGraphicsConfig gc =
            (MetalGraphicsConfig)vImg.getGraphicsConfig();
            ColorModel cm = gc.getColorModel(vImg.getTransparency());
            int type = vImg.getForcedAccelSurfaceType();
            // if acceleration type is forced (type != UNDEFINED) then
            // use the forced type, otherwise choose FBOBJECT
            //if (type == OGLSurfaceData.UNDEFINED) {
            //type = OGLSurfaceData.FBOBJECT;
            //}
            //if (createVSynced) {
            /*
             * TODO: modify parameter to delegate, this TODO is
             * present in OGL also
             */
            //                  sData = CGLSurfaceData.createData(peer, vImg, type);
            //} else {
            sData = MetalSurfaceData.createData(gc,
                                                vImg.getWidth(),
                                                vImg.getHeight(),
                                                cm, vImg, type);
            //}
            //}
        } catch (NullPointerException ex) {
            sData = null;
        } catch (OutOfMemoryError er) {
            sData = null;
        }
        
        return sData;
    }
    
    @Override
    public void initContents() {
        // TODO : Check what is special case of TEXTURE
        //if (vImg.getForcedAccelSurfaceType() != OGLSurfaceData.TEXTURE) {
        super.initContents();
        //}
    }
}