• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2012 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 package com.jme3.renderer;
34 
35 import com.jme3.shader.Shader;
36 import com.jme3.texture.FrameBuffer;
37 import com.jme3.texture.FrameBuffer.RenderBuffer;
38 import com.jme3.texture.Image;
39 import com.jme3.texture.Image.Format;
40 import com.jme3.texture.Texture;
41 import java.util.Collection;
42 
43 /**
44  * <code>Caps</code> is an enum specifying a capability that the {@link Renderer}
45  * supports.
46  *
47  * @author Kirill Vainer
48  */
49 public enum Caps {
50 
51     /**
52      * Supports {@link FrameBuffer FrameBuffers}.
53      * <p>
54      * OpenGL: Renderer exposes the GL_EXT_framebuffer_object extension.<br>
55      * OpenGL ES: Renderer supports OpenGL ES 2.0.
56      */
57     FrameBuffer,
58 
59     /**
60      * Supports framebuffer Multiple Render Targets (MRT)
61      * <p>
62      * OpenGL: Renderer exposes the GL_ARB_draw_buffers extension
63      */
64     FrameBufferMRT,
65 
66     /**
67      * Supports framebuffer multi-sampling
68      * <p>
69      * OpenGL: Renderer exposes the GL EXT framebuffer multisample extension<br>
70      * OpenGL ES: Renderer exposes GL_APPLE_framebuffer_multisample or
71      * GL_ANGLE_framebuffer_multisample.
72      */
73     FrameBufferMultisample,
74 
75     /**
76      * Supports texture multi-sampling
77      * <p>
78      * OpenGL: Renderer exposes the GL_ARB_texture_multisample extension<br>
79      * OpenGL ES: Renderer exposes the GL_IMG_multisampled_render_to_texture
80      * extension.
81      */
82     TextureMultisample,
83 
84     /**
85      * Supports OpenGL 2.0 or OpenGL ES 2.0.
86      */
87     OpenGL20,
88 
89     /**
90      * Supports OpenGL 2.1
91      */
92     OpenGL21,
93 
94     /**
95      * Supports OpenGL 3.0
96      */
97     OpenGL30,
98 
99     /**
100      * Supports OpenGL 3.1
101      */
102     OpenGL31,
103 
104     /**
105      * Supports OpenGL 3.2
106      */
107     OpenGL32,
108 
109     /**
110      * Supports OpenGL ARB program.
111      * <p>
112      * OpenGL: Renderer exposes ARB_vertex_program and ARB_fragment_program
113      * extensions.
114      */
115     ARBprogram,
116 
117     /**
118      * Supports GLSL 1.0
119      */
120     GLSL100,
121 
122     /**
123      * Supports GLSL 1.1
124      */
125     GLSL110,
126 
127     /**
128      * Supports GLSL 1.2
129      */
130     GLSL120,
131 
132     /**
133      * Supports GLSL 1.3
134      */
135     GLSL130,
136 
137     /**
138      * Supports GLSL 1.4
139      */
140     GLSL140,
141 
142     /**
143      * Supports GLSL 1.5
144      */
145     GLSL150,
146 
147     /**
148      * Supports GLSL 3.3
149      */
150     GLSL330,
151 
152     /**
153      * Supports reading from textures inside the vertex shader.
154      */
155     VertexTextureFetch,
156 
157     /**
158      * Supports geometry shader.
159      */
160     GeometryShader,
161 
162     /**
163      * Supports texture arrays
164      */
165     TextureArray,
166 
167     /**
168      * Supports texture buffers
169      */
170     TextureBuffer,
171 
172     /**
173      * Supports floating point textures (Format.RGB16F)
174      */
175     FloatTexture,
176 
177     /**
178      * Supports floating point FBO color buffers (Format.RGB16F)
179      */
180     FloatColorBuffer,
181 
182     /**
183      * Supports floating point depth buffer
184      */
185     FloatDepthBuffer,
186 
187     /**
188      * Supports Format.RGB111110F for textures
189      */
190     PackedFloatTexture,
191 
192     /**
193      * Supports Format.RGB9E5 for textures
194      */
195     SharedExponentTexture,
196 
197     /**
198      * Supports Format.RGB111110F for FBO color buffers
199      */
200     PackedFloatColorBuffer,
201 
202     /**
203      * Supports Format.RGB9E5 for FBO color buffers
204      */
205     SharedExponentColorBuffer,
206 
207     /**
208      * Supports Format.LATC for textures, this includes
209      * support for ATI's 3Dc texture compression.
210      */
211     TextureCompressionLATC,
212 
213     /**
214      * Supports Non-Power-Of-Two (NPOT) textures and framebuffers
215      */
216     NonPowerOfTwoTextures,
217 
218     /// Vertex Buffer features
219     MeshInstancing,
220 
221     /**
222      * Supports VAO, or vertex buffer arrays
223      */
224     VertexBufferArray,
225 
226     /**
227      * Supports multisampling on the screen
228      */
229     Multisample;
230 
231     /**
232      * Returns true if given the renderer capabilities, the texture
233      * can be supported by the renderer.
234      * <p>
235      * This only checks the format of the texture, non-power-of-2
236      * textures are scaled automatically inside the renderer
237      * if are not supported natively.
238      *
239      * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
240      * @param tex The texture to check
241      * @return True if it is supported, false otherwise.
242      */
supports(Collection<Caps> caps, Texture tex)243     public static boolean supports(Collection<Caps> caps, Texture tex){
244         if (tex.getType() == Texture.Type.TwoDimensionalArray
245          && !caps.contains(Caps.TextureArray))
246             return false;
247 
248         Image img = tex.getImage();
249         if (img == null)
250             return true;
251 
252         Format fmt = img.getFormat();
253         switch (fmt){
254             case Depth32F:
255                 return caps.contains(Caps.FloatDepthBuffer);
256             case LATC:
257                 return caps.contains(Caps.TextureCompressionLATC);
258             case RGB16F_to_RGB111110F:
259             case RGB111110F:
260                 return caps.contains(Caps.PackedFloatTexture);
261             case RGB16F_to_RGB9E5:
262             case RGB9E5:
263                 return caps.contains(Caps.SharedExponentTexture);
264             default:
265                 if (fmt.isFloatingPont())
266                     return caps.contains(Caps.FloatTexture);
267 
268                 return true;
269         }
270     }
271 
272     /**
273      * Returns true if given the renderer capabilities, the framebuffer
274      * can be supported by the renderer.
275      *
276      * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
277      * @param fb The framebuffer to check
278      * @return True if it is supported, false otherwise.
279      */
supports(Collection<Caps> caps, FrameBuffer fb)280     public static boolean supports(Collection<Caps> caps, FrameBuffer fb){
281         if (!caps.contains(Caps.FrameBuffer))
282             return false;
283 
284         if (fb.getSamples() > 1
285          && !caps.contains(Caps.FrameBufferMultisample))
286             return false;
287 
288         RenderBuffer colorBuf = fb.getColorBuffer();
289         RenderBuffer depthBuf = fb.getDepthBuffer();
290 
291         if (depthBuf != null){
292             Format depthFmt = depthBuf.getFormat();
293             if (!depthFmt.isDepthFormat()){
294                 return false;
295             }else{
296                 if (depthFmt == Format.Depth32F
297                  && !caps.contains(Caps.FloatDepthBuffer))
298                     return false;
299             }
300         }
301         if (colorBuf != null){
302             Format colorFmt = colorBuf.getFormat();
303             if (colorFmt.isDepthFormat())
304                 return false;
305 
306             if (colorFmt.isCompressed())
307                 return false;
308 
309             switch (colorFmt){
310                 case RGB111110F:
311                     return caps.contains(Caps.PackedFloatColorBuffer);
312                 case RGB16F_to_RGB111110F:
313                 case RGB16F_to_RGB9E5:
314                 case RGB9E5:
315                     return false;
316                 default:
317                     if (colorFmt.isFloatingPont())
318                         return caps.contains(Caps.FloatColorBuffer);
319 
320                     return true;
321             }
322         }
323         return true;
324     }
325 
326     /**
327      * Returns true if given the renderer capabilities, the shader
328      * can be supported by the renderer.
329      *
330      * @param caps The collection of renderer capabilities {@link Renderer#getCaps() }.
331      * @param shader The shader to check
332      * @return True if it is supported, false otherwise.
333      */
supports(Collection<Caps> caps, Shader shader)334     public static boolean supports(Collection<Caps> caps, Shader shader){
335         String lang = shader.getLanguage();
336         if (lang.startsWith("GLSL")){
337             int ver = Integer.parseInt(lang.substring(4));
338             switch (ver){
339                 case 100:
340                     return caps.contains(Caps.GLSL100);
341                 case 110:
342                     return caps.contains(Caps.GLSL110);
343                 case 120:
344                     return caps.contains(Caps.GLSL120);
345                 case 130:
346                     return caps.contains(Caps.GLSL130);
347                 case 140:
348                     return caps.contains(Caps.GLSL140);
349                 case 150:
350                     return caps.contains(Caps.GLSL150);
351                 case 330:
352                     return caps.contains(Caps.GLSL330);
353                 default:
354                     return false;
355             }
356         }
357         return false;
358     }
359 
360 }
361