Esempio n. 1
0
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) )
{
}
Esempio n. 2
0
	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);
	}
Esempio n. 3
0
		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);
			}
		}
Esempio n. 4
0
		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);
			}
		}