TextureBaseGL::TextureBaseGL(IReferenceCounters *pRefCounters, FixedBlockMemoryAllocator& TexViewObjAllocator, RenderDeviceGLImpl *pDeviceGL, DeviceContextGLImpl *pDeviceContext, const TextureDesc& TexDesc, GLuint GLTextureHandle, GLenum BindTarget, bool bIsDeviceInternal/* = false*/) : TTextureBase( pRefCounters, TexViewObjAllocator, pDeviceGL, GetTextureDescFromGLHandle(pDeviceContext, TexDesc, GLTextureHandle, BindTarget), bIsDeviceInternal ), // Create texture object wrapper, but use external texture handle m_GlTexture(true, GLObjectWrappers::GLTextureCreateReleaseHelper(GLTextureHandle)), m_BindTarget(BindTarget), m_GLTexFormat( GetTextureInternalFormat(pDeviceContext, BindTarget, m_GlTexture) ) { }
GLTexture2D * GLTexture2D::Create(GLContext & ctx, uint32_t sizeX, uint32_t sizeY, uint32_t numMips, uint32_t numSamples, EPixelFormat format, uint32_t flags) { GLuint textureName = 0; FOpenGL::GenTextures(1, &textureName); const bool needSRGB = IsSetFlags(flags, ETextureCreateFlags::sRGB); const OpenGLPixelDataFormat & glFormat = GetGLPixelDataFormat(format); GLenum textureInternalFormat = GetTextureInternalFormat(glFormat, needSRGB); const GLenum textureTarget = (numSamples > 1) ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; static const GLuint bindIndex = FOpenGL::GetCapability().MaxCombinedTextureImageUnits - 1; ctx.BindTexture(bindIndex, textureName, textureTarget); ctx.BindPixelUnpackBuffer(0); if (numSamples > 1) { FOpenGL::TexImage2DMultisample(textureTarget, numSamples, textureInternalFormat, sizeX, sizeY, true); } else { FOpenGL::TexParameter(textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); FOpenGL::TexParameter(textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); FOpenGL::TexParameter(textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); FOpenGL::TexParameter(textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); if (FOpenGL::GetCapability().SupportTextureBaseLevel) FOpenGL::TexParameter(textureTarget, GL_TEXTURE_BASE_LEVEL, 0); if (FOpenGL::GetCapability().SupportTextureMaxLevel) FOpenGL::TexParameter(textureTarget, GL_TEXTURE_MAX_LEVEL, numMips - 1); FOpenGL::TexStorage2D(textureTarget, numMips, textureInternalFormat, sizeX, sizeY, glFormat.Format, glFormat.Type, 0); } return new GLTexture2D(textureName, textureTarget, sizeX, sizeY, numMips, numSamples, format, flags); }
void teTexture::Init(ETextureType setTextureType, u32 setFlags, image::teImage * image, ERenderBufferType renderBufferType, const teVector2duh & renderBufferSize) { textureType = setTextureType; flags = setFlags; #ifdef TE_RENDER_FORCE_TEX_FILTERED flags |= TF_FILTERED; #endif switch(textureType) { case TT_2D: glGenTextures(1, &textureId); break; case TT_RENDERBUFFER: tglGenRenderbuffers(1, &textureId); break; default: TE_ASSERT(0); break; } Bind(); if(flags & TF_FILTERED) { if(flags & TF_MIPMAP) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } else { if(flags & TF_MIPMAP) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } if(flags & TF_REPEAT) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } if((textureType == TT_2D) && image) { if(image->levelsCount > 0) size.SetXY(image->levels[0].width, image->levels[0].height); for(u32 i = 0; i < image->levelsCount; ++i) { GLuint format = GetTextureInternalFormat((image::EImagePixelFormat)image->pixelFormat); #ifdef TE_RENDER_PVRTC if(image->pixelFormat >= image::IPF_COMPRESSED) glCompressedTexImage2D(GL_TEXTURE_2D, i, format, image->levels[i].width, image->levels[i].height, 0, image->levels[i].bytes, image->GetPixels(i)); else #endif glTexImage2D(GL_TEXTURE_2D, i, format, image->levels[i].width, image->levels[i].height, 0, format, GL_UNSIGNED_BYTE, image->GetPixels(i)); } if(flags & TF_MIPMAP) tglGenerateMipmap(GL_TEXTURE_2D); } else if((renderBufferType != RBT_NONE) && (renderBufferSize.GetMaxComponent() > 0)) { size.SetXY(renderBufferSize.x, renderBufferSize.y); GLenum t0 = GetRenderBufferInternalType(renderBufferType); GLenum t1 = GL_NONE; GLenum t2 = GL_NONE; #if defined(TE_PLATFORM_WIN) || defined(TE_PLATFORM_MAC) switch(t0) { case GL_RGBA8: //t0 = GL_RGBA32F; t1 = GL_RGBA; t2 = GL_UNSIGNED_BYTE; break; case GL_DEPTH_COMPONENT24: //t0 = GL_DEPTH_COMPONENT24; t1 = GL_DEPTH_COMPONENT; t2 = GL_UNSIGNED_INT; break; } #elif defined(TE_PLATFORM_IPHONE) switch(t0) { case GL_RGBA8_OES: t0 = GL_RGBA; t1 = GL_RGBA; t2 = GL_UNSIGNED_BYTE; break; case GL_DEPTH_COMPONENT24_OES: t0 = GL_DEPTH_COMPONENT; t1 = GL_DEPTH_COMPONENT; t2 = GL_UNSIGNED_INT; break; } #endif glTexImage2D(GL_TEXTURE_2D, 0, t0, renderBufferSize.x, renderBufferSize.y, 0, t1, t2, 0); //printf("-%x-\n", glGetError()); } else if((textureType == TT_RENDERBUFFER) && (renderBufferType != RBT_NONE) && (renderBufferSize.GetMaxComponent() > 0)) { size.SetXY(renderBufferSize.x, renderBufferSize.y); tglRenderbufferStorage(GetRenderBufferInternalType(renderBufferType), renderBufferSize.x, renderBufferSize.y); } }
void teTexture::Init(ETextureType setTextureType, u32 setFlags, image::teImage * image, ERenderBufferType renderBufferType, const teVector2duh & renderBufferSize) { textureType = setTextureType; flags = setFlags; GetRender()->GetDevice()->CreateTexture(image->levels[0].width, image->levels[0].height, image->levelsCount, 0, GetTextureInternalFormat((image::EImagePixelFormat)image->pixelFormat), D3DPOOL_MANAGED, &texture, 0); for(u8 i = 0; i < image->levelsCount; ++i) { D3DLOCKED_RECT rect; texture->LockRect(i, &rect, NULL, 0); memcpy(rect.pBits, image->GetPixels(0), image->levels[i].bytes); texture->UnlockRect(i); } }