Python GPU: Add reference of PyObject GPU object to the GPU object itself
Instead of creating different python wrappers for the same GPU object, return the same `PyObject` created earlier. This also allows for more secure access to existing GPU objects. Reviewed By: brecht Differential Revision: https://developer.blender.org/D11044
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
#pragma once
|
||||
|
||||
#define PROGRAM_NO_OPTI 0
|
||||
#define USE_PY_REFERENCES 1
|
||||
|
||||
#if defined(NDEBUG)
|
||||
# define TRUST_NO_ONE 0
|
||||
|
@@ -209,6 +209,11 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb,
|
||||
void (*callback)(void *userData, int level),
|
||||
void *userData);
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
void **GPU_framebuffer_py_reference_get(GPUFrameBuffer *gpu_fb);
|
||||
void GPU_framebuffer_py_reference_set(GPUFrameBuffer *gpu_fb, void **py_ref);
|
||||
#endif
|
||||
|
||||
void GPU_framebuffer_push(GPUFrameBuffer *fb);
|
||||
GPUFrameBuffer *GPU_framebuffer_pop(void);
|
||||
uint GPU_framebuffer_stack_level_get(void);
|
||||
|
@@ -269,6 +269,12 @@ bool GPU_texture_cube(const GPUTexture *tex);
|
||||
bool GPU_texture_depth(const GPUTexture *tex);
|
||||
bool GPU_texture_stencil(const GPUTexture *tex);
|
||||
bool GPU_texture_integer(const GPUTexture *tex);
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
void **GPU_texture_py_reference_get(GPUTexture *tex);
|
||||
void GPU_texture_py_reference_set(GPUTexture *tex, void **py_ref);
|
||||
#endif
|
||||
|
||||
int GPU_texture_opengl_bindcode(const GPUTexture *tex);
|
||||
|
||||
void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size);
|
||||
|
@@ -71,6 +71,12 @@ FrameBuffer::~FrameBuffer()
|
||||
reinterpret_cast<Texture *>(attachment.tex)->detach_from(this);
|
||||
}
|
||||
}
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
if (this->py_ref) {
|
||||
*this->py_ref = nullptr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/** \} */
|
||||
@@ -473,6 +479,19 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb,
|
||||
unwrap(gpu_fb)->recursive_downsample(max_lvl, callback, userData);
|
||||
}
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
void **GPU_framebuffer_py_reference_get(GPUFrameBuffer *gpu_fb)
|
||||
{
|
||||
return unwrap(gpu_fb)->py_ref;
|
||||
}
|
||||
|
||||
void GPU_framebuffer_py_reference_set(GPUFrameBuffer *gpu_fb, void **py_ref)
|
||||
{
|
||||
BLI_assert(ref == nullptr || unwrap(gpu_fb)->py_ref == nullptr);
|
||||
unwrap(gpu_fb)->py_ref = py_ref;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
@@ -100,6 +100,15 @@ class FrameBuffer {
|
||||
bool scissor_test_ = false;
|
||||
bool dirty_state_ = true;
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
public:
|
||||
/**
|
||||
* Reference of a pointer that needs to be cleaned when deallocating the frame-buffer.
|
||||
* Points to #BPyGPUFrameBuffer.fb
|
||||
*/
|
||||
void **py_ref = nullptr;
|
||||
#endif
|
||||
|
||||
public:
|
||||
FrameBuffer(const char *name);
|
||||
virtual ~FrameBuffer();
|
||||
|
@@ -60,6 +60,12 @@ Texture::~Texture()
|
||||
fb_[i]->attachment_remove(fb_attachment_[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
if (this->py_ref) {
|
||||
*this->py_ref = nullptr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Texture::init_1D(int w, int layers, eGPUTextureFormat format)
|
||||
@@ -581,6 +587,19 @@ bool GPU_texture_array(const GPUTexture *tex)
|
||||
return (reinterpret_cast<const Texture *>(tex)->type_get() & GPU_TEXTURE_ARRAY) != 0;
|
||||
}
|
||||
|
||||
#if USE_PY_REFERENCES
|
||||
void **GPU_texture_py_reference_get(GPUTexture *tex)
|
||||
{
|
||||
return unwrap(tex)->py_ref;
|
||||
}
|
||||
|
||||
void GPU_texture_py_reference_set(GPUTexture *tex, void **py_ref)
|
||||
{
|
||||
BLI_assert(py_ref == nullptr || unwrap(tex)->py_ref == nullptr);
|
||||
unwrap(tex)->py_ref = py_ref;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* TODO remove */
|
||||
int GPU_texture_opengl_bindcode(const GPUTexture *tex)
|
||||
{
|
||||
|
@@ -80,6 +80,13 @@ class Texture {
|
||||
int refcount = 1;
|
||||
/** Width & Height (of source data), optional. */
|
||||
int src_w = 0, src_h = 0;
|
||||
#if USE_PY_REFERENCES
|
||||
/**
|
||||
* Reference of a pointer that needs to be cleaned when deallocating the texture.
|
||||
* Points to #BPyGPUTexture.tex
|
||||
*/
|
||||
void **py_ref = nullptr;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
/* ---- Texture format (immutable after init). ---- */
|
||||
|
Reference in New Issue
Block a user