diff options
Diffstat (limited to 'source/blender/gpu/opengl/gl_texture.cc')
-rw-r--r-- | source/blender/gpu/opengl/gl_texture.cc | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index db1fda63c28..d84d21d3021 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -62,7 +62,6 @@ GLTexture::~GLTexture() GLContext::tex_free(tex_id_); } -/* Return true on success. */ bool GLTexture::init_internal() { if ((format_ == GPU_DEPTH24_STENCIL8) && GPU_depth_blitting_workaround()) { @@ -100,7 +99,6 @@ bool GLTexture::init_internal() return true; } -/* Return true on success. */ bool GLTexture::init_internal(GPUVertBuf *vbo) { GLVertBuf *gl_vbo = static_cast<GLVertBuf *>(unwrap(vbo)); @@ -123,7 +121,6 @@ bool GLTexture::init_internal(GPUVertBuf *vbo) return true; } -/* Will create enough mipmaps up to get to the given level. */ void GLTexture::ensure_mipmaps(int miplvl) { int effective_h = (type_ == GPU_TEXTURE_1D_ARRAY) ? 0 : h_; @@ -225,6 +222,8 @@ void GLTexture::update_sub_direct_state_access( break; } } + + has_pixels_ = true; } void GLTexture::update_sub( @@ -288,6 +287,8 @@ void GLTexture::update_sub( break; } } + + has_pixels_ = true; } /** @@ -307,6 +308,16 @@ void GLTexture::generate_mipmap() return; } + if (GLContext::generate_mipmap_workaround) { + /* Broken glGenerateMipmap, don't call it and render without mipmaps. + * If no top level pixels have been filled in, the levels will get filled by + * other means and there is no need to disable mipmapping. */ + if (has_pixels_) { + this->mip_range_set(0, 0); + } + return; + } + /* Down-sample from mip 0 using implementation. */ if (GLContext::direct_state_access_support) { glGenerateTextureMipmap(tex_id_); @@ -337,6 +348,8 @@ void GLTexture::clear(eGPUDataFormat data_format, const void *data) GPU_framebuffer_bind(prev_fb); } + + has_pixels_ = true; } void GLTexture::copy_to(Texture *dst_) @@ -363,6 +376,8 @@ void GLTexture::copy_to(Texture *dst_) GPU_framebuffer_blit( src->framebuffer_get(), 0, dst->framebuffer_get(), 0, to_framebuffer_bits(format_)); } + + has_pixels_ = true; } void *GLTexture::read(int mip, eGPUDataFormat type) @@ -452,6 +467,7 @@ struct GPUFrameBuffer *GLTexture::framebuffer_get() GPUTexture *gputex = reinterpret_cast<GPUTexture *>(static_cast<Texture *>(this)); framebuffer_ = GPU_framebuffer_create(name_); GPU_framebuffer_texture_attach(framebuffer_, gputex, 0, 0); + has_pixels_ = true; return framebuffer_; } |