19 #include "../generic/py_capi_utils.h"
32 PyErr_SetString(PyExc_ReferenceError,
34 "GPU uniform buffer was freed, no further access is valid");
37 "GPU uniform buffer: internal error");
44 #define BPYGPU_UNIFORMBUF_CHECK_OBJ(bpygpu) \
46 if (UNLIKELY(pygpu_uniformbuffer_valid_check(bpygpu) == -1)) { \
65 PyObject *pybuffer_obj;
66 char err_out[256] =
"unknown error. See console";
68 static const char *_keywords[] = {
"data",
NULL};
69 static _PyArg_Parser _parser = {
71 ":GPUUniformBuf.__new__",
75 if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, &pybuffer_obj)) {
80 STRNCPY(err_out,
"No active GPU context found");
84 if (PyObject_GetBuffer(pybuffer_obj, &pybuffer, PyBUF_SIMPLE) == -1) {
89 if ((pybuffer.len % 16) != 0) {
90 STRNCPY(err_out,
"UBO is not padded to size of vec4");
95 PyBuffer_Release(&pybuffer);
99 PyErr_Format(PyExc_RuntimeError,
"GPUUniformBuf.__new__(...) failed with '%s'", err_out);
107 ".. method:: update(data)\n"
109 " Update the data of the uniform buffer object.\n");
115 if (PyObject_GetBuffer(obj, &pybuffer, PyBUF_SIMPLE) == -1) {
121 PyBuffer_Release(&pybuffer);
125 #ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
127 ".. method::free()\n"
129 " Free the uniform buffer object.\n"
130 " The uniform buffer object will no longer be accessible.\n");
146 Py_TYPE(
self)->tp_free((PyObject *)
self);
155 #ifdef BPYGPU_USE_GPUOBJ_FREE_METHOD
156 {
"free", (PyCFunction)pygpu_uniformbuffer_free, METH_NOARGS, pygpu_uniformbuffer_free_doc},
162 ".. class:: GPUUniformBuf(data)\n"
164 " This object gives access to off uniform buffers.\n"
166 " :arg data: Data to fill the buffer.\n"
167 " :type data: object exposing buffer interface\n");
169 PyVarObject_HEAD_INIT(
NULL, 0).tp_name =
"GPUUniformBuf",
172 .tp_flags = Py_TPFLAGS_DEFAULT,
173 .tp_doc = pygpu_uniformbuffer__tp_doc,
192 return (PyObject *)
self;
197 #undef BPYGPU_UNIFORMBUF_CHECK_OBJ
#define STRNCPY(dst, src)
GPUContext * GPU_context_active_get(void)
#define BPYGPU_IS_INIT_OR_ERROR_OBJ
#define BPYGPU_USE_GPUOBJ_FREE_METHOD