159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/*
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2012 jMonkeyEngine
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved.
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met:
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer.
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer in the
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   documentation and/or other materials provided with the distribution.
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   may be used to endorse or promote products derived from this software
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   without specific prior written permission.
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.renderer;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.shader.Shader;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.FrameBuffer;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.FrameBuffer.RenderBuffer;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Collection;
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>Caps</code> is an enum specifying a capability that the {@link Renderer}
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * supports.
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Kirill Vainer
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic enum Caps {
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports {@link FrameBuffer FrameBuffers}.
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL: Renderer exposes the GL_EXT_framebuffer_object extension.<br>
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL ES: Renderer supports OpenGL ES 2.0.
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FrameBuffer,
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports framebuffer Multiple Render Targets (MRT)
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL: Renderer exposes the GL_ARB_draw_buffers extension
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FrameBufferMRT,
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports framebuffer multi-sampling
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL: Renderer exposes the GL EXT framebuffer multisample extension<br>
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL ES: Renderer exposes GL_APPLE_framebuffer_multisample or
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * GL_ANGLE_framebuffer_multisample.
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FrameBufferMultisample,
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports texture multi-sampling
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL: Renderer exposes the GL_ARB_texture_multisample extension<br>
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL ES: Renderer exposes the GL_IMG_multisampled_render_to_texture
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * extension.
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    TextureMultisample,
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL 2.0 or OpenGL ES 2.0.
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    OpenGL20,
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL 2.1
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    OpenGL21,
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL 3.0
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    OpenGL30,
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL 3.1
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    OpenGL31,
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL 3.2
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    OpenGL32,
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports OpenGL ARB program.
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * OpenGL: Renderer exposes ARB_vertex_program and ARB_fragment_program
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * extensions.
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    ARBprogram,
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.0
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL100,
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.1
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL110,
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.2
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL120,
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.3
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL130,
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.4
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL140,
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 1.5
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL150,
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports GLSL 3.3
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GLSL330,
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports reading from textures inside the vertex shader.
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    VertexTextureFetch,
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports geometry shader.
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    GeometryShader,
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports texture arrays
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    TextureArray,
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports texture buffers
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    TextureBuffer,
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports floating point textures (Format.RGB16F)
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FloatTexture,
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports floating point FBO color buffers (Format.RGB16F)
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FloatColorBuffer,
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports floating point depth buffer
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    FloatDepthBuffer,
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Format.RGB111110F for textures
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    PackedFloatTexture,
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Format.RGB9E5 for textures
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    SharedExponentTexture,
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Format.RGB111110F for FBO color buffers
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    PackedFloatColorBuffer,
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Format.RGB9E5 for FBO color buffers
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    SharedExponentColorBuffer,
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Format.LATC for textures, this includes
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * support for ATI's 3Dc texture compression.
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    TextureCompressionLATC,
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports Non-Power-Of-Two (NPOT) textures and framebuffers
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    NonPowerOfTwoTextures,
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /// Vertex Buffer features
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    MeshInstancing,
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports VAO, or vertex buffer arrays
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    VertexBufferArray,
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Supports multisampling on the screen
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    Multisample;
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Returns true if given the renderer capabilities, the texture
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * can be supported by the renderer.
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * This only checks the format of the texture, non-power-of-2
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * textures are scaled automatically inside the renderer
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * if are not supported natively.
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param tex The texture to check
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return True if it is supported, false otherwise.
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static boolean supports(Collection<Caps> caps, Texture tex){
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (tex.getType() == Texture.Type.TwoDimensionalArray
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         && !caps.contains(Caps.TextureArray))
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Image img = tex.getImage();
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (img == null)
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return true;
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Format fmt = img.getFormat();
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        switch (fmt){
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth32F:
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return caps.contains(Caps.FloatDepthBuffer);
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case LATC:
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return caps.contains(Caps.TextureCompressionLATC);
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB16F_to_RGB111110F:
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB111110F:
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return caps.contains(Caps.PackedFloatTexture);
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB16F_to_RGB9E5:
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB9E5:
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return caps.contains(Caps.SharedExponentTexture);
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            default:
26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (fmt.isFloatingPont())
26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.FloatTexture);
26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return true;
26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Returns true if given the renderer capabilities, the framebuffer
27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * can be supported by the renderer.
27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param fb The framebuffer to check
27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return True if it is supported, false otherwise.
27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static boolean supports(Collection<Caps> caps, FrameBuffer fb){
28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (!caps.contains(Caps.FrameBuffer))
28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (fb.getSamples() > 1
28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         && !caps.contains(Caps.FrameBufferMultisample))
28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RenderBuffer colorBuf = fb.getColorBuffer();
28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RenderBuffer depthBuf = fb.getDepthBuffer();
29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (depthBuf != null){
29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Format depthFmt = depthBuf.getFormat();
29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (!depthFmt.isDepthFormat()){
29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return false;
29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }else{
29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (depthFmt == Format.Depth32F
29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                 && !caps.contains(Caps.FloatDepthBuffer))
29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return false;
29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (colorBuf != null){
30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Format colorFmt = colorBuf.getFormat();
30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (colorFmt.isDepthFormat())
30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return false;
30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (colorFmt.isCompressed())
30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return false;
30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            switch (colorFmt){
31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case RGB111110F:
31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.PackedFloatColorBuffer);
31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case RGB16F_to_RGB111110F:
31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case RGB16F_to_RGB9E5:
31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case RGB9E5:
31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return false;
31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                default:
31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    if (colorFmt.isFloatingPont())
31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        return caps.contains(Caps.FloatColorBuffer);
31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return true;
32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return true;
32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Returns true if given the renderer capabilities, the shader
32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * can be supported by the renderer.
32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param shader The shader to check
33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return True if it is supported, false otherwise.
33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static boolean supports(Collection<Caps> caps, Shader shader){
33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        String lang = shader.getLanguage();
33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (lang.startsWith("GLSL")){
33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int ver = Integer.parseInt(lang.substring(4));
33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            switch (ver){
33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 100:
34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL100);
34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 110:
34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL110);
34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 120:
34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL120);
34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 130:
34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL130);
34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 140:
34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL140);
34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 150:
35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL150);
35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                case 330:
35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return caps.contains(Caps.GLSL330);
35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                default:
35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    return false;
35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return false;
35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
361