| 
									
										
										
										
											2018-07-17 14:46:44 +02: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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2016 by Mike Erwin. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-19 23:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup gpu | 
					
						
							| 
									
										
										
										
											2018-07-17 14:46:44 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-09-24 18:46:51 +02:00
										 |  |  |  * This interface allow GPU to manage GL objects for multiple context and threads. | 
					
						
							| 
									
										
										
										
											2018-07-17 14:46:44 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-19 23:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-07 09:50:34 +02:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2018-02-19 23:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 18:16:39 +02:00
										 |  |  | #include "GPU_context.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-25 23:27:40 +02:00
										 |  |  | #include "gpu_framebuffer_private.hh"
 | 
					
						
							| 
									
										
										
										
											2020-08-31 15:14:47 +02:00
										 |  |  | #include "gpu_immediate_private.hh"
 | 
					
						
							| 
									
										
										
										
											2020-08-21 13:48:34 +02:00
										 |  |  | #include "gpu_shader_private.hh"
 | 
					
						
							| 
									
										
										
										
											2020-08-16 20:56:39 +02:00
										 |  |  | #include "gpu_state_private.hh"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 03:01:45 +02:00
										 |  |  | #include <pthread.h>
 | 
					
						
							| 
									
										
										
										
											2018-02-19 23:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | struct GPUMatrixState; | 
					
						
							| 
									
										
										
										
											2018-07-19 15:48:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  | namespace blender::gpu { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Context { | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  |  public: | 
					
						
							| 
									
										
										
										
											2020-09-02 09:58:26 +10:00
										 |  |  |   /** State management */ | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  |   Shader *shader = NULL; | 
					
						
							|  |  |  |   FrameBuffer *active_fb = NULL; | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  |   GPUMatrixState *matrix_state = NULL; | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  |   GPUStateManager *state_manager = NULL; | 
					
						
							|  |  |  |   Immediate *imm = NULL; | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-29 01:13:54 +02:00
										 |  |  |   /**
 | 
					
						
							| 
									
										
										
										
											2020-09-02 09:58:26 +10:00
										 |  |  |    * All 4 window frame-buffers. | 
					
						
							|  |  |  |    * None of them are valid in an off-screen context. | 
					
						
							|  |  |  |    * Right frame-buffers are only available if using stereo rendering. | 
					
						
							|  |  |  |    * Front frame-buffers contains (in principle, but not always) the last frame color. | 
					
						
							|  |  |  |    * Default frame-buffer is back_left. | 
					
						
							| 
									
										
										
										
											2020-08-29 01:13:54 +02:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  |   FrameBuffer *back_left = NULL; | 
					
						
							|  |  |  |   FrameBuffer *front_left = NULL; | 
					
						
							|  |  |  |   FrameBuffer *back_right = NULL; | 
					
						
							|  |  |  |   FrameBuffer *front_right = NULL; | 
					
						
							| 
									
										
										
										
											2020-08-29 01:13:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  |  protected: | 
					
						
							|  |  |  |   /** Thread on which this context is active. */ | 
					
						
							|  |  |  |   pthread_t thread_; | 
					
						
							|  |  |  |   bool is_active_; | 
					
						
							| 
									
										
										
										
											2020-09-02 09:58:26 +10:00
										 |  |  |   /** Avoid including GHOST headers. Can be NULL for off-screen contexts. */ | 
					
						
							| 
									
										
										
										
											2020-08-29 14:03:15 +02:00
										 |  |  |   void *ghost_window_; | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |  public: | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  |   Context(); | 
					
						
							|  |  |  |   virtual ~Context(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static Context *get(void); | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   virtual void activate(void) = 0; | 
					
						
							|  |  |  |   virtual void deactivate(void) = 0; | 
					
						
							| 
									
										
										
										
											2020-09-08 00:10:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* Will push all pending commands to the GPU. */ | 
					
						
							|  |  |  |   virtual void flush(void) = 0; | 
					
						
							|  |  |  |   /* Will wait until the GPU has finished executing all command. */ | 
					
						
							|  |  |  |   virtual void finish(void) = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-07 19:53:48 +02:00
										 |  |  |   virtual void memory_statistics_get(int *total_mem, int *free_mem) = 0; | 
					
						
							| 
									
										
										
										
											2020-08-08 01:18:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   bool is_active_on_thread(void); | 
					
						
							| 
									
										
										
										
											2020-08-07 17:00:28 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 04:12:12 +02:00
										 |  |  | /* Syntacting suggar. */ | 
					
						
							|  |  |  | static inline GPUContext *wrap(Context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return reinterpret_cast<GPUContext *>(ctx); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | static inline Context *unwrap(GPUContext *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return reinterpret_cast<Context *>(ctx); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | static inline const Context *unwrap(const GPUContext *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return reinterpret_cast<const Context *>(ctx); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace blender::gpu
 |