Revert "Cleanup: remove image->bindcode, always wrap in GPUTexture."
This reverts commit 8242a5bc85
. This isn't
quite ready to use yet.
This commit is contained in:
parent
8242a5bc85
commit
1d111cd046
|
@ -271,7 +271,7 @@ bool BKE_image_scale(struct Image *image, int width, int height);
|
|||
bool BKE_image_has_alpha(struct Image *image);
|
||||
|
||||
/* check if texture has gpu texture code */
|
||||
bool BKE_image_has_opengl_texture(struct Image *ima);
|
||||
bool BKE_image_has_bindcode(struct Image *ima);
|
||||
|
||||
void BKE_image_get_size(struct Image *image, struct ImageUser *iuser, int *width, int *height);
|
||||
void BKE_image_get_size_fl(struct Image *image, struct ImageUser *iuser, float size[2]);
|
||||
|
|
|
@ -473,6 +473,7 @@ void BKE_image_copy_data(Main *UNUSED(bmain), Image *ima_dst, const Image *ima_s
|
|||
BLI_listbase_clear(&ima_dst->anims);
|
||||
|
||||
for (int i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
ima_dst->bindcode[i] = 0;
|
||||
ima_dst->gputexture[i] = NULL;
|
||||
}
|
||||
|
||||
|
@ -537,14 +538,16 @@ bool BKE_image_scale(Image *image, int width, int height)
|
|||
return (ibuf != NULL);
|
||||
}
|
||||
|
||||
bool BKE_image_has_opengl_texture(Image *ima)
|
||||
bool BKE_image_has_bindcode(Image *ima)
|
||||
{
|
||||
bool has_bindcode = false;
|
||||
for (int i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
if (ima->gputexture[i]) {
|
||||
return true;
|
||||
if (ima->bindcode[i]) {
|
||||
has_bindcode = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return has_bindcode;
|
||||
}
|
||||
|
||||
static void image_init_color_management(Image *ima)
|
||||
|
@ -927,6 +930,21 @@ void BKE_image_tag_time(Image *ima)
|
|||
ima->lastused = PIL_check_seconds_timer_i();
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void tag_all_images_time(Main *bmain)
|
||||
{
|
||||
Image *ima;
|
||||
int ctime = PIL_check_seconds_timer_i();
|
||||
|
||||
ima = bmain->image.first;
|
||||
while (ima) {
|
||||
if (ima->bindcode || ima->repbind || ima->ibufs.first) {
|
||||
ima->lastused = ctime;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static uintptr_t image_mem_size(Image *image)
|
||||
{
|
||||
uintptr_t size = 0;
|
||||
|
|
|
@ -1681,6 +1681,7 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
|
|||
if (ima->cache == NULL) {
|
||||
ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
|
||||
for (i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
ima->bindcode[i] = 0;
|
||||
ima->gputexture[i] = NULL;
|
||||
}
|
||||
ima->rr = NULL;
|
||||
|
@ -3915,6 +3916,7 @@ static void direct_link_image(FileData *fd, Image *ima)
|
|||
if (!ima->cache) {
|
||||
ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
|
||||
for (int i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
ima->bindcode[i] = 0;
|
||||
ima->gputexture[i] = NULL;
|
||||
}
|
||||
ima->rr = NULL;
|
||||
|
|
|
@ -161,7 +161,6 @@ GPUTexture *GPU_texture_create_from_vertbuf(
|
|||
GPUTexture *GPU_texture_create_buffer(
|
||||
GPUTextureFormat data_type, const uint buffer);
|
||||
|
||||
GPUTexture *GPU_texture_from_bindcode(int textarget, int bindcode);
|
||||
GPUTexture *GPU_texture_from_blender(
|
||||
struct Image *ima, struct ImageUser *iuser, int textarget, bool is_data, double time, int mipmap);
|
||||
GPUTexture *GPU_texture_from_preview(struct PreviewImage *prv, int mipmap);
|
||||
|
|
|
@ -127,6 +127,8 @@ static int smaller_power_of_2_limit(int num)
|
|||
/* Current OpenGL state caching for GPU_set_tpage */
|
||||
|
||||
static struct GPUTextureState {
|
||||
Image *ima, *curima;
|
||||
|
||||
/* also controls min/mag filtering */
|
||||
bool domipmap;
|
||||
/* only use when 'domipmap' is set */
|
||||
|
@ -134,9 +136,10 @@ static struct GPUTextureState {
|
|||
/* store this so that new images created while texture painting won't be set to mipmapped */
|
||||
bool texpaint;
|
||||
|
||||
int alphablend;
|
||||
float anisotropic;
|
||||
int gpu_mipmap;
|
||||
} GTS = {1, 0, 0, 1.0f, 0};
|
||||
} GTS = {NULL, NULL, 1, 0, 0, -1, 1.0f, 0};
|
||||
|
||||
/* Mipmap settings */
|
||||
|
||||
|
@ -224,14 +227,16 @@ float GPU_get_anisotropic(void)
|
|||
|
||||
/* Set OpenGL state for an MTFace */
|
||||
|
||||
static GPUTexture **gpu_get_image_gputexture(Image *ima, GLenum textarget)
|
||||
static unsigned int *gpu_get_image_bindcode(Image *ima, GLenum textarget)
|
||||
{
|
||||
if (textarget == GL_TEXTURE_2D)
|
||||
return &ima->gputexture[TEXTARGET_TEXTURE_2D];
|
||||
else if (textarget == GL_TEXTURE_CUBE_MAP)
|
||||
return &ima->gputexture[TEXTARGET_TEXTURE_CUBE_MAP];
|
||||
unsigned int *bind = 0;
|
||||
|
||||
return NULL;
|
||||
if (textarget == GL_TEXTURE_2D)
|
||||
bind = &ima->bindcode[TEXTARGET_TEXTURE_2D];
|
||||
else if (textarget == GL_TEXTURE_CUBE_MAP)
|
||||
bind = &ima->bindcode[TEXTARGET_TEXTURE_CUBE_MAP];
|
||||
|
||||
return bind;
|
||||
}
|
||||
|
||||
typedef struct VerifyThreadData {
|
||||
|
@ -284,38 +289,33 @@ static void gpu_verify_high_bit_srgb_buffer(float *srgb_frect,
|
|||
}
|
||||
}
|
||||
|
||||
GPUTexture *GPU_texture_from_blender(Image *ima,
|
||||
ImageUser *iuser,
|
||||
int textarget,
|
||||
bool is_data,
|
||||
double UNUSED(time),
|
||||
int mipmap)
|
||||
int GPU_verify_image(
|
||||
Image *ima, ImageUser *iuser,
|
||||
int textarget, bool compare, bool mipmap, bool is_data)
|
||||
{
|
||||
unsigned int *bind = NULL;
|
||||
int tpx = 0, tpy = 0;
|
||||
unsigned int *rect = NULL;
|
||||
float *frect = NULL;
|
||||
float *srgb_frect = NULL;
|
||||
/* flag to determine whether deep format is used */
|
||||
bool use_high_bit_depth = false, do_color_management = false;
|
||||
|
||||
GTS.ima = ima;
|
||||
|
||||
if (compare && ima == GTS.curima) {
|
||||
return (ima != NULL);
|
||||
}
|
||||
|
||||
/* check if we have a valid image */
|
||||
if (ima == NULL || ima->ok == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* currently, tpage refresh is used by ima sequences */
|
||||
if (ima->tpageflag & IMA_TPAGE_REFRESH) {
|
||||
GPU_free_image(ima);
|
||||
ima->tpageflag &= ~IMA_TPAGE_REFRESH;
|
||||
}
|
||||
|
||||
/* Test if we already have a texture. */
|
||||
GPUTexture **tex = gpu_get_image_gputexture(ima, textarget);
|
||||
if (*tex) {
|
||||
return *tex;
|
||||
}
|
||||
if (ima == NULL || ima->ok == 0)
|
||||
return 0;
|
||||
|
||||
/* check if we have a valid image buffer */
|
||||
ImBuf *ibuf = BKE_image_acquire_ibuf(ima, iuser, NULL);
|
||||
if (ibuf == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* flag to determine whether deep format is used */
|
||||
bool use_high_bit_depth = false, do_color_management = false;
|
||||
if (ibuf == NULL)
|
||||
return 0;
|
||||
|
||||
if (ibuf->rect_float) {
|
||||
if (U.use_16bit_textures) {
|
||||
|
@ -337,38 +337,54 @@ GPUTexture *GPU_texture_from_blender(Image *ima,
|
|||
}
|
||||
}
|
||||
|
||||
const int rectw = ibuf->x;
|
||||
const int recth = ibuf->y;
|
||||
unsigned int *rect = ibuf->rect;
|
||||
float *frect = NULL;
|
||||
float *srgb_frect = NULL;
|
||||
/* currently, tpage refresh is used by ima sequences */
|
||||
if (ima->tpageflag & IMA_TPAGE_REFRESH) {
|
||||
GPU_free_image(ima);
|
||||
ima->tpageflag &= ~IMA_TPAGE_REFRESH;
|
||||
}
|
||||
|
||||
if (use_high_bit_depth) {
|
||||
if (do_color_management) {
|
||||
frect = srgb_frect = MEM_mallocN(ibuf->x * ibuf->y * sizeof(*srgb_frect) * 4, "floar_buf_col_cor");
|
||||
gpu_verify_high_bit_srgb_buffer(srgb_frect, ibuf);
|
||||
}
|
||||
else {
|
||||
frect = ibuf->rect_float;
|
||||
{
|
||||
/* regular image mode */
|
||||
bind = gpu_get_image_bindcode(ima, textarget);
|
||||
|
||||
if (*bind == 0) {
|
||||
tpx = ibuf->x;
|
||||
tpy = ibuf->y;
|
||||
rect = ibuf->rect;
|
||||
if (use_high_bit_depth) {
|
||||
if (do_color_management) {
|
||||
frect = srgb_frect = MEM_mallocN(ibuf->x * ibuf->y * sizeof(*srgb_frect) * 4, "floar_buf_col_cor");
|
||||
gpu_verify_high_bit_srgb_buffer(srgb_frect, ibuf);
|
||||
}
|
||||
else
|
||||
frect = ibuf->rect_float;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int bindcode = 0;
|
||||
if (*bind != 0) {
|
||||
/* enable opengl drawing with textures */
|
||||
glBindTexture(textarget, *bind);
|
||||
BKE_image_release_ibuf(ima, ibuf, NULL);
|
||||
return *bind;
|
||||
}
|
||||
|
||||
const int rectw = tpx;
|
||||
const int recth = tpy;
|
||||
|
||||
#ifdef WITH_DDS
|
||||
if (ibuf->ftype == IMB_FTYPE_DDS)
|
||||
GPU_create_gl_tex_compressed(&bindcode, rect, rectw, recth, textarget, mipmap, ima, ibuf);
|
||||
GPU_create_gl_tex_compressed(bind, rect, rectw, recth, textarget, mipmap, ima, ibuf);
|
||||
else
|
||||
#endif
|
||||
GPU_create_gl_tex(&bindcode, rect, frect, rectw, recth, textarget, mipmap, use_high_bit_depth, ima);
|
||||
GPU_create_gl_tex(bind, rect, frect, rectw, recth, textarget, mipmap, use_high_bit_depth, ima);
|
||||
|
||||
/* mark as non-color data texture */
|
||||
if (bindcode) {
|
||||
if (*bind) {
|
||||
if (is_data)
|
||||
ima->tpageflag |= IMA_GLBIND_IS_DATA;
|
||||
else
|
||||
ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
|
||||
|
||||
*tex = GPU_texture_from_bindcode(textarget, bindcode);
|
||||
}
|
||||
|
||||
/* clean up */
|
||||
|
@ -377,7 +393,7 @@ GPUTexture *GPU_texture_from_blender(Image *ima,
|
|||
|
||||
BKE_image_release_ibuf(ima, ibuf, NULL);
|
||||
|
||||
return *tex;
|
||||
return *bind;
|
||||
}
|
||||
|
||||
static void **gpu_gen_cube_map(unsigned int *rect, float *frect, int rectw, int recth, bool use_high_bit_depth)
|
||||
|
@ -578,8 +594,6 @@ void GPU_create_gl_tex(
|
|||
if (GLEW_EXT_texture_filter_anisotropic)
|
||||
glTexParameterf(textarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, GPU_get_anisotropic());
|
||||
|
||||
glBindTexture(textarget, 0);
|
||||
|
||||
if (ibuf)
|
||||
IMB_freeImBuf(ibuf);
|
||||
}
|
||||
|
@ -666,8 +680,6 @@ void GPU_create_gl_tex_compressed(
|
|||
glDeleteTextures(1, (GLuint *)bind);
|
||||
GPU_create_gl_tex(bind, pix, NULL, x, y, textarget, mipmap, 0, ima);
|
||||
}
|
||||
|
||||
glBindTexture(textarget, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -684,13 +696,17 @@ void GPU_paint_set_mipmap(bool mipmap)
|
|||
|
||||
if (mipmap) {
|
||||
for (Image *ima = G.main->image.first; ima; ima = ima->id.next) {
|
||||
if (BKE_image_has_opengl_texture(ima)) {
|
||||
if (BKE_image_has_bindcode(ima)) {
|
||||
if (ima->tpageflag & IMA_MIPMAP_COMPLETE) {
|
||||
if (ima->gputexture[TEXTARGET_TEXTURE_2D]) {
|
||||
GPU_texture_bind(ima->gputexture[TEXTARGET_TEXTURE_2D], 0);
|
||||
if (ima->bindcode[TEXTARGET_TEXTURE_2D]) {
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
|
||||
GPU_texture_unbind(ima->gputexture[TEXTARGET_TEXTURE_2D]);
|
||||
}
|
||||
if (ima->bindcode[TEXTARGET_TEXTURE_CUBE_MAP]) {
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, ima->bindcode[TEXTARGET_TEXTURE_CUBE_MAP]);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -703,12 +719,16 @@ void GPU_paint_set_mipmap(bool mipmap)
|
|||
}
|
||||
else {
|
||||
for (Image *ima = G.main->image.first; ima; ima = ima->id.next) {
|
||||
if (BKE_image_has_opengl_texture(ima)) {
|
||||
if (ima->gputexture[TEXTARGET_TEXTURE_2D]) {
|
||||
GPU_texture_bind(ima->gputexture[TEXTARGET_TEXTURE_2D], 0);
|
||||
if (BKE_image_has_bindcode(ima)) {
|
||||
if (ima->bindcode[TEXTARGET_TEXTURE_2D]) {
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
|
||||
GPU_texture_unbind(ima->gputexture[TEXTARGET_TEXTURE_2D]);
|
||||
}
|
||||
if (ima->bindcode[TEXTARGET_TEXTURE_CUBE_MAP]) {
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, ima->bindcode[TEXTARGET_TEXTURE_CUBE_MAP]);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -741,13 +761,12 @@ static bool gpu_check_scaled_image(ImBuf *ibuf, Image *ima, float *frect, int x,
|
|||
if (rectw + x > x_limit) rectw--;
|
||||
if (recth + y > y_limit) recth--;
|
||||
|
||||
GPU_texture_bind(ima->gputexture[TEXTARGET_TEXTURE_2D], 0);
|
||||
|
||||
/* float rectangles are already continuous in memory so we can use IMB_scaleImBuf */
|
||||
if (frect) {
|
||||
ImBuf *ibuf_scale = IMB_allocFromBuffer(NULL, frect, w, h);
|
||||
IMB_scaleImBuf(ibuf_scale, rectw, recth);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, rectw, recth, GL_RGBA,
|
||||
GL_FLOAT, ibuf_scale->rect_float);
|
||||
|
||||
|
@ -767,7 +786,7 @@ static bool gpu_check_scaled_image(ImBuf *ibuf, Image *ima, float *frect, int x,
|
|||
bilinear_interpolation_color_wrap(ibuf, (unsigned char *)(p + i + j * (rectw)), NULL, u, v);
|
||||
}
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, rectw, recth, GL_RGBA,
|
||||
GL_UNSIGNED_BYTE, scalerect);
|
||||
|
||||
|
@ -781,8 +800,6 @@ static bool gpu_check_scaled_image(ImBuf *ibuf, Image *ima, float *frect, int x,
|
|||
ima->tpageflag &= ~IMA_MIPMAP_COMPLETE;
|
||||
}
|
||||
|
||||
GPU_texture_unbind(ima->gputexture[TEXTARGET_TEXTURE_2D]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -794,7 +811,7 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
|
|||
ImBuf *ibuf = BKE_image_acquire_ibuf(ima, iuser, NULL);
|
||||
|
||||
if ((!GTS.gpu_mipmap && GPU_get_mipmap()) ||
|
||||
(ima->gputexture[TEXTARGET_TEXTURE_2D] == NULL) ||
|
||||
(ima->bindcode[TEXTARGET_TEXTURE_2D] == 0) ||
|
||||
(ibuf == NULL) ||
|
||||
(w == 0) || (h == 0))
|
||||
{
|
||||
|
@ -818,7 +835,7 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
|
|||
return;
|
||||
}
|
||||
|
||||
GPU_texture_bind(ima->gputexture[TEXTARGET_TEXTURE_2D], 0);
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, GL_FLOAT, buffer);
|
||||
|
||||
MEM_freeN(buffer);
|
||||
|
@ -832,8 +849,6 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
|
|||
ima->tpageflag &= ~IMA_MIPMAP_COMPLETE;
|
||||
}
|
||||
|
||||
GPU_texture_unbind(ima->gputexture[TEXTARGET_TEXTURE_2D]);
|
||||
|
||||
BKE_image_release_ibuf(ima, ibuf, NULL);
|
||||
return;
|
||||
}
|
||||
|
@ -843,7 +858,7 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
|
|||
return;
|
||||
}
|
||||
|
||||
GPU_texture_bind(ima->gputexture[TEXTARGET_TEXTURE_2D], 0);
|
||||
glBindTexture(GL_TEXTURE_2D, ima->bindcode[TEXTARGET_TEXTURE_2D]);
|
||||
|
||||
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length);
|
||||
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skip_pixels);
|
||||
|
@ -867,8 +882,6 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
|
|||
else {
|
||||
ima->tpageflag &= ~IMA_MIPMAP_COMPLETE;
|
||||
}
|
||||
|
||||
GPU_texture_unbind(ima->gputexture[TEXTARGET_TEXTURE_2D]);
|
||||
}
|
||||
|
||||
BKE_image_release_ibuf(ima, ibuf, NULL);
|
||||
|
@ -1003,6 +1016,11 @@ void GPU_free_image(Image *ima)
|
|||
}
|
||||
|
||||
for (int i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
/* free regular image binding */
|
||||
if (ima->bindcode[i]) {
|
||||
glDeleteTextures(1, (GLuint *)&ima->bindcode[i]);
|
||||
ima->bindcode[i] = 0;
|
||||
}
|
||||
/* free glsl image binding */
|
||||
if (ima->gputexture[i]) {
|
||||
GPU_texture_free(ima->gputexture[i]);
|
||||
|
@ -1053,7 +1071,7 @@ void GPU_free_images_old(void)
|
|||
if ((ima->flag & IMA_NOCOLLECT) == 0 && ctime - ima->lastused > U.textimeout) {
|
||||
/* If it's in GL memory, deallocate and set time tag to current time
|
||||
* This gives textures a "second chance" to be used before dying. */
|
||||
if (BKE_image_has_opengl_texture(ima)) {
|
||||
if (BKE_image_has_bindcode(ima)) {
|
||||
GPU_free_image(ima);
|
||||
ima->lastused = ctime;
|
||||
}
|
||||
|
|
|
@ -79,6 +79,7 @@ struct GPUTexture {
|
|||
GLenum target_base; /* same as target, (but no multisample)
|
||||
* use it for unbinding */
|
||||
GLuint bindcode; /* opengl identifier for texture */
|
||||
int fromblender; /* we got the texture from Blender */
|
||||
|
||||
GPUTextureFormat format;
|
||||
GPUTextureFormatFlag format_flag;
|
||||
|
@ -672,24 +673,42 @@ GPUTexture *GPU_texture_create_buffer(GPUTextureFormat data_type, const GLuint b
|
|||
return tex;
|
||||
}
|
||||
|
||||
GPUTexture *GPU_texture_from_bindcode(int textarget, int bindcode)
|
||||
GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, int textarget, bool is_data, double UNUSED(time), int mipmap)
|
||||
{
|
||||
int gputt;
|
||||
/* this binds a texture, so that's why to restore it to 0 */
|
||||
GLint bindcode = GPU_verify_image(ima, iuser, textarget, 0, mipmap, is_data);
|
||||
|
||||
/* see GPUInput::textarget: it can take two values - GL_TEXTURE_2D and GL_TEXTURE_CUBE_MAP
|
||||
* these values are correct for glDisable, so textarget can be safely used in
|
||||
* GPU_texture_bind/GPU_texture_unbind through tex->target_base */
|
||||
/* (is any of this obsolete now that we don't glEnable/Disable textures?) */
|
||||
if (textarget == GL_TEXTURE_2D)
|
||||
gputt = TEXTARGET_TEXTURE_2D;
|
||||
else
|
||||
gputt = TEXTARGET_TEXTURE_CUBE_MAP;
|
||||
|
||||
if (ima->gputexture[gputt]) {
|
||||
ima->gputexture[gputt]->bindcode = bindcode;
|
||||
glBindTexture(textarget, 0);
|
||||
return ima->gputexture[gputt];
|
||||
}
|
||||
|
||||
GPUTexture *tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
|
||||
tex->bindcode = bindcode;
|
||||
tex->number = -1;
|
||||
tex->refcount = 1;
|
||||
tex->target = textarget;
|
||||
tex->target_base = textarget;
|
||||
tex->fromblender = 1;
|
||||
tex->format = -1;
|
||||
tex->components = -1;
|
||||
tex->samples = 0;
|
||||
|
||||
ima->gputexture[gputt] = tex;
|
||||
|
||||
if (!glIsTexture(tex->bindcode)) {
|
||||
GPU_print_error_debug("Invalid bindcode in GPU_texture_from_bindcode");
|
||||
GPU_print_error_debug("Blender Texture Not Loaded");
|
||||
}
|
||||
else {
|
||||
GLint w, h;
|
||||
|
@ -706,9 +725,10 @@ GPUTexture *GPU_texture_from_bindcode(int textarget, int bindcode)
|
|||
glGetTexLevelParameteriv(gettarget, 0, GL_TEXTURE_HEIGHT, &h);
|
||||
tex->w = w;
|
||||
tex->h = h;
|
||||
glBindTexture(textarget, 0);
|
||||
}
|
||||
|
||||
glBindTexture(textarget, 0);
|
||||
|
||||
return tex;
|
||||
}
|
||||
|
||||
|
@ -1070,6 +1090,9 @@ void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat)
|
|||
|
||||
static void gpu_texture_delete(GPUTexture *tex)
|
||||
{
|
||||
if (tex->bindcode && !tex->fromblender)
|
||||
glDeleteTextures(1, &tex->bindcode);
|
||||
|
||||
gpu_texture_memory_footprint_remove(tex);
|
||||
|
||||
MEM_freeN(tex);
|
||||
|
|
|
@ -118,6 +118,7 @@ typedef struct Image {
|
|||
/* texture page */
|
||||
short tpageflag;
|
||||
short pad2;
|
||||
unsigned int bindcode[2]; /* only for current image... 2 = TEXTARGET_COUNT */
|
||||
unsigned int pad3;
|
||||
|
||||
struct PackedFile *packedfile DNA_DEPRECATED; /* deprecated */
|
||||
|
|
|
@ -298,13 +298,6 @@ static void rna_Image_resolution_set(PointerRNA *ptr, const float *values)
|
|||
BKE_image_release_ibuf(im, ibuf, lock);
|
||||
}
|
||||
|
||||
static int rna_Image_bindcode_get(PointerRNA *ptr)
|
||||
{
|
||||
Image *ima = (Image *)ptr->data;
|
||||
GPUTexture *tex = ima->gputexture[TEXTARGET_TEXTURE_2D];
|
||||
return (tex) ? GPU_texture_opengl_bindcode(tex) : 0;
|
||||
}
|
||||
|
||||
static int rna_Image_depth_get(PointerRNA *ptr)
|
||||
{
|
||||
Image *im = (Image *)ptr->data;
|
||||
|
@ -803,7 +796,7 @@ static void rna_def_image(BlenderRNA *brna)
|
|||
RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "bindcode", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_funcs(prop, "rna_Image_bindcode_get", NULL, NULL);
|
||||
RNA_def_property_int_sdna(prop, NULL, "bindcode");
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Bindcode", "OpenGL bindcode");
|
||||
RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, NULL);
|
||||
|
|
|
@ -220,30 +220,29 @@ static void rna_Image_scale(Image *image, ReportList *reports, int width, int he
|
|||
|
||||
static int rna_Image_gl_load(Image *image, ReportList *reports, int frame, int filter, int mag)
|
||||
{
|
||||
GPUTexture *tex = image->gputexture[TEXTARGET_TEXTURE_2D];
|
||||
ImBuf *ibuf;
|
||||
unsigned int *bind = &image->bindcode[TEXTARGET_TEXTURE_2D];
|
||||
int error = GL_NO_ERROR;
|
||||
|
||||
if (*tex)
|
||||
return error;
|
||||
|
||||
ImageUser iuser = {NULL};
|
||||
void *lock;
|
||||
|
||||
if (*bind)
|
||||
return error;
|
||||
iuser.framenr = frame;
|
||||
iuser.ok = true;
|
||||
|
||||
void *lock;
|
||||
ImBuf *ibuf = BKE_image_acquire_ibuf(image, &iuser, &lock);
|
||||
ibuf = BKE_image_acquire_ibuf(image, &iuser, &lock);
|
||||
|
||||
/* clean glError buffer */
|
||||
while (glGetError() != GL_NO_ERROR) {}
|
||||
|
||||
if (ibuf == NULL || ibuf->rect == NULL) {
|
||||
BKE_reportf(reports, RPT_ERROR, "Image '%s' does not have any image data", image->id.name + 2);
|
||||
BKE_image_release_ibuf(image, ibuf, lock);
|
||||
BKE_image_release_ibuf(image, ibuf, NULL);
|
||||
return (int)GL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
int bindcode = 0;
|
||||
GPU_create_gl_tex(&bindcode, ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y, GL_TEXTURE_2D,
|
||||
GPU_create_gl_tex(bind, ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y, GL_TEXTURE_2D,
|
||||
(filter != GL_NEAREST && filter != GL_LINEAR), false, image);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLint)filter);
|
||||
|
@ -255,23 +254,22 @@ static int rna_Image_gl_load(Image *image, ReportList *reports, int frame, int f
|
|||
|
||||
if (error) {
|
||||
glDeleteTextures(1, (GLuint *)bind);
|
||||
}
|
||||
else {
|
||||
image->gputexture[TEXTARGET_TEXTURE_2D] = GPU_texture_from_bindcode(GL_TEXTURE_2D, bindcode);
|
||||
image->bindcode[TEXTARGET_TEXTURE_2D] = 0;
|
||||
}
|
||||
|
||||
BKE_image_release_ibuf(image, ibuf, lock);
|
||||
BKE_image_release_ibuf(image, ibuf, NULL);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int rna_Image_gl_touch(Image *image, ReportList *reports, int frame, int filter, int mag)
|
||||
{
|
||||
unsigned int *bind = &image->bindcode[TEXTARGET_TEXTURE_2D];
|
||||
int error = GL_NO_ERROR;
|
||||
|
||||
BKE_image_tag_time(image);
|
||||
|
||||
if (image->gputexture[TEXTARGET_TEXTURE_2D] == NULL)
|
||||
if (*bind == 0)
|
||||
error = rna_Image_gl_load(image, reports, frame, filter, mag);
|
||||
|
||||
return error;
|
||||
|
|
Loading…
Reference in New Issue