| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program 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 for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup gpu | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 16:21:44 +01:00
										 |  |  | #include "DNA_userdef_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 10:06:54 +10:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-23 23:47:12 +01:00
										 |  |  | #include "BKE_global.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | #include "GPU_glew.h"
 | 
					
						
							|  |  |  | #include "GPU_state.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-02 14:58:49 +01:00
										 |  |  | #include "GPU_extensions.h"
 | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 14:15:43 +11:00
										 |  |  | static GLenum gpu_get_gl_blendfunction(eGPUBlendFunction blend) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   switch (blend) { | 
					
						
							|  |  |  |     case GPU_ONE: | 
					
						
							|  |  |  |       return GL_ONE; | 
					
						
							|  |  |  |     case GPU_SRC_ALPHA: | 
					
						
							|  |  |  |       return GL_SRC_ALPHA; | 
					
						
							|  |  |  |     case GPU_ONE_MINUS_SRC_ALPHA: | 
					
						
							|  |  |  |       return GL_ONE_MINUS_SRC_ALPHA; | 
					
						
							|  |  |  |     case GPU_DST_COLOR: | 
					
						
							|  |  |  |       return GL_DST_COLOR; | 
					
						
							|  |  |  |     case GPU_ZERO: | 
					
						
							|  |  |  |       return GL_ZERO; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       BLI_assert(!"Unhandled blend mode"); | 
					
						
							|  |  |  |       return GL_ZERO; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_blend(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (enable) { | 
					
						
							|  |  |  |     glEnable(GL_BLEND); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glDisable(GL_BLEND); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 14:15:43 +11:00
										 |  |  | void GPU_blend_set_func(eGPUBlendFunction sfactor, eGPUBlendFunction dfactor) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glBlendFunc(gpu_get_gl_blendfunction(sfactor), gpu_get_gl_blendfunction(dfactor)); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | void GPU_blend_set_func_separate(eGPUBlendFunction src_rgb, | 
					
						
							|  |  |  |                                  eGPUBlendFunction dst_rgb, | 
					
						
							|  |  |  |                                  eGPUBlendFunction src_alpha, | 
					
						
							|  |  |  |                                  eGPUBlendFunction dst_alpha) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glBlendFuncSeparate(gpu_get_gl_blendfunction(src_rgb), | 
					
						
							|  |  |  |                       gpu_get_gl_blendfunction(dst_rgb), | 
					
						
							|  |  |  |                       gpu_get_gl_blendfunction(src_alpha), | 
					
						
							|  |  |  |                       gpu_get_gl_blendfunction(dst_alpha)); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 15:31:32 -03:00
										 |  |  | void GPU_depth_range(float near, float far) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   /* glDepthRangef is only for OpenGL 4.1 or higher */ | 
					
						
							|  |  |  |   glDepthRange(near, far); | 
					
						
							| 
									
										
										
										
											2018-10-30 15:31:32 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | void GPU_depth_test(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (enable) { | 
					
						
							|  |  |  |     glEnable(GL_DEPTH_TEST); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glDisable(GL_DEPTH_TEST); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool GPU_depth_test_enabled() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   return glIsEnabled(GL_DEPTH_TEST); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_line_smooth(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (enable && ((G.debug & G_DEBUG_GPU) == 0)) { | 
					
						
							|  |  |  |     glEnable(GL_LINE_SMOOTH); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glDisable(GL_LINE_SMOOTH); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_line_width(float width) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   float max_size = GPU_max_line_width(); | 
					
						
							|  |  |  |   float final_size = width * U.pixelsize; | 
					
						
							|  |  |  |   /* Fix opengl errors on certain platform / drivers. */ | 
					
						
							|  |  |  |   CLAMP(final_size, 1.0f, max_size); | 
					
						
							|  |  |  |   glLineWidth(final_size); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_point_size(float size) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glPointSize(size * U.pixelsize); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_polygon_smooth(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (enable && ((G.debug & G_DEBUG_GPU) == 0)) { | 
					
						
							|  |  |  |     glEnable(GL_POLYGON_SMOOTH); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glDisable(GL_POLYGON_SMOOTH); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-28 17:14:22 +02:00
										 |  |  | /* Programmable point size
 | 
					
						
							|  |  |  |  * - shaders set their own point size when enabled | 
					
						
							|  |  |  |  * - use glPointSize when disabled */ | 
					
						
							|  |  |  | void GPU_program_point_size(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (enable) { | 
					
						
							|  |  |  |     glEnable(GL_PROGRAM_POINT_SIZE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glDisable(GL_PROGRAM_POINT_SIZE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | void GPU_scissor(int x, int y, int width, int height) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glScissor(x, y, width, height); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 18:27:05 +02:00
										 |  |  | void GPU_scissor_get_f(float coords[4]) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glGetFloatv(GL_SCISSOR_BOX, coords); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 18:27:05 +02:00
										 |  |  | void GPU_scissor_get_i(int coords[4]) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glGetIntegerv(GL_SCISSOR_BOX, coords); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 18:27:05 +02:00
										 |  |  | void GPU_viewport_size_get_f(float coords[4]) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glGetFloatv(GL_VIEWPORT, coords); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 18:27:05 +02:00
										 |  |  | void GPU_viewport_size_get_i(int coords[4]) | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glGetIntegerv(GL_VIEWPORT, coords); | 
					
						
							| 
									
										
										
										
											2018-06-26 15:17:31 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-31 12:28:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GPU_flush(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glFlush(); | 
					
						
							| 
									
										
										
										
											2018-10-31 12:28:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GPU_finish(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   glFinish(); | 
					
						
							| 
									
										
										
										
											2018-11-04 10:08:55 +11:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-02 12:30:55 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GPU_logic_op_invert_set(bool enable) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (enable) { | 
					
						
							|  |  |  |     glLogicOp(GL_INVERT); | 
					
						
							|  |  |  |     glEnable(GL_COLOR_LOGIC_OP); | 
					
						
							|  |  |  |     glDisable(GL_DITHER); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     glLogicOp(GL_COPY); | 
					
						
							|  |  |  |     glDisable(GL_COLOR_LOGIC_OP); | 
					
						
							|  |  |  |     glEnable(GL_DITHER); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |