| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | /** \file blender/python/gpu/gpu_py_api.c
 | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  |  *  \ingroup bpygpu | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  |  * Experimental Python API, not considered public yet (called '_gpu'), | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  |  * we may re-expose as public later. | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  |  * | 
					
						
							|  |  |  |  * - Use ``bpygpu_`` for local API. | 
					
						
							|  |  |  |  * - Use ``BPyGPU`` for public API. | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "../generic/python_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-02 10:01:46 -02:00
										 |  |  | #include "GPU_init_exit.h"
 | 
					
						
							|  |  |  | #include "GPU_primitive.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | #include "gpu_py_matrix.h"
 | 
					
						
							|  |  |  | #include "gpu_py_select.h"
 | 
					
						
							|  |  |  | #include "gpu_py_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-02 10:01:46 -02:00
										 |  |  | #include "gpu_py.h" /* own include */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* -------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \name Utils to invalidate functions
 | 
					
						
							|  |  |  |  * \{ */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool bpygpu_is_initialized(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!GPU_is_initialized()) { | 
					
						
							|  |  |  | 		PyErr_SetString( | 
					
						
							|  |  |  | 		        PyExc_SystemError, | 
					
						
							|  |  |  | 		        "GPU functions for drawing are not available in background mode"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \} */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* -------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \name Primitive Type Utils
 | 
					
						
							|  |  |  |  * \{ */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int bpygpu_ParsePrimType(PyObject *o, void *p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Py_ssize_t mode_id_len; | 
					
						
							|  |  |  | 	const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len); | 
					
						
							|  |  |  | 	if (mode_id == NULL) { | 
					
						
							|  |  |  | 		PyErr_Format(PyExc_ValueError, | 
					
						
							|  |  |  | 		             "expected a string, got %s", | 
					
						
							|  |  |  | 		             Py_TYPE(o)->tp_name); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #define MATCH_ID(id) \
 | 
					
						
							|  |  |  | 	if (mode_id_len == strlen(STRINGIFY(id))) { \ | 
					
						
							|  |  |  | 		if (STREQ(mode_id, STRINGIFY(id))) { \ | 
					
						
							|  |  |  | 			mode = GPU_PRIM_##id; \ | 
					
						
							|  |  |  | 			goto success; \ | 
					
						
							|  |  |  | 		} \ | 
					
						
							|  |  |  | 	} ((void)0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GPUPrimType mode; | 
					
						
							|  |  |  | 	MATCH_ID(POINTS); | 
					
						
							|  |  |  | 	MATCH_ID(LINES); | 
					
						
							|  |  |  | 	MATCH_ID(TRIS); | 
					
						
							|  |  |  | 	MATCH_ID(LINE_STRIP); | 
					
						
							|  |  |  | 	MATCH_ID(LINE_LOOP); | 
					
						
							|  |  |  | 	MATCH_ID(TRI_STRIP); | 
					
						
							|  |  |  | 	MATCH_ID(TRI_FAN); | 
					
						
							|  |  |  | 	MATCH_ID(LINE_STRIP_ADJ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #undef MATCH_ID
 | 
					
						
							|  |  |  | 	PyErr_Format(PyExc_ValueError, | 
					
						
							|  |  |  | 	             "unknown type literal: '%s'", | 
					
						
							|  |  |  | 	             mode_id); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | success: | 
					
						
							|  |  |  | 	(*(GPUPrimType *)p) = mode; | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \} */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* -------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \name GPU Module
 | 
					
						
							|  |  |  |  * \{ */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | PyDoc_STRVAR(GPU_doc, | 
					
						
							| 
									
										
										
										
											2018-11-05 19:26:53 +01:00
										 |  |  | "This module provides Python wrappers for the GPU implementation in Blender. " | 
					
						
							|  |  |  | "Some higher level functions can be found in the `gpu_extras` module. " | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | "\n\n" | 
					
						
							|  |  |  | "Submodules:\n" | 
					
						
							|  |  |  | "\n" | 
					
						
							|  |  |  | ".. toctree::\n" | 
					
						
							|  |  |  | "   :maxdepth: 1\n" | 
					
						
							|  |  |  | "\n" | 
					
						
							|  |  |  | "   gpu.types.rst\n" | 
					
						
							| 
									
										
										
										
											2018-11-13 13:33:09 +01:00
										 |  |  | "   gpu.shader.rst\n" | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | "   gpu.matrix.rst\n" | 
					
						
							|  |  |  | "   gpu.select.rst\n" | 
					
						
							|  |  |  | "\n" | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | ); | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | static struct PyModuleDef GPU_module_def = { | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | 	PyModuleDef_HEAD_INIT, | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | 	.m_name = "gpu", | 
					
						
							|  |  |  | 	.m_doc = GPU_doc, | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | PyObject *BPyInit_gpu(void) | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-09-13 17:08:58 +10:00
										 |  |  | 	PyObject *sys_modules = PyImport_GetModuleDict(); | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | 	PyObject *submodule; | 
					
						
							|  |  |  | 	PyObject *mod; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | 	mod = PyModule_Create(&GPU_module_def); | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 00:12:21 +02:00
										 |  |  | 	PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types())); | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | 	PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 21:10:42 -03:00
										 |  |  | 	PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix())); | 
					
						
							|  |  |  | 	PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select())); | 
					
						
							|  |  |  | 	PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 09:32:19 -03:00
										 |  |  | 	PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader())); | 
					
						
							|  |  |  | 	PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-17 20:32:42 +10:00
										 |  |  | 	return mod; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-01-02 10:01:46 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** \} */ |