mirror of https://github.com/alibaba/MNN.git
				
				
				
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //
 | |
| //  GLTexture.cpp
 | |
| //  MNN
 | |
| //
 | |
| //  Created by MNN on 2019/01/31.
 | |
| //  Copyright © 2018, Alibaba Group Holding Limited
 | |
| //
 | |
| 
 | |
| #include "backend/opengl/GLTexture.hpp"
 | |
| namespace MNN {
 | |
| namespace OpenGL {
 | |
| #include <MNN/AutoTime.hpp>
 | |
| 
 | |
| GLTexture::~GLTexture() {
 | |
|     glDeleteTextures(1, &mId);
 | |
|     OPENGL_CHECK_ERROR;
 | |
| }
 | |
| 
 | |
| GLTexture::GLTexture(int w, int h, int d, GLenum textrueFormat, GLenum target, bool HWC4) {
 | |
|     mTextrueFormat = textrueFormat;
 | |
|     if(target == GL_TEXTURE_3D){
 | |
|         GLASSERT(w > 0 && h > 0 && d > 0);
 | |
|         mTarget = target;
 | |
|         glGenTextures(1, &mId);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glBindTexture(mTarget, mId);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
| 
 | |
|         int realW = w;
 | |
|         int realH = h;
 | |
|         int realD = d;
 | |
|         if (HWC4) {
 | |
|             realD = UP_DIV(d, 4);
 | |
|             realH = h;
 | |
|             realW = w;
 | |
|         }
 | |
|         glTexStorage3D(mTarget, 1, mTextrueFormat, realW, realH, realD);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|     }else if(target == GL_TEXTURE_2D){
 | |
|         GLASSERT(w > 0 && h > 0);
 | |
|         mTarget = target;
 | |
|         glGenTextures(1, &mId);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glBindTexture(mTarget, mId);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|         glTexParameteri(mTarget, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 | |
|         OPENGL_CHECK_ERROR;
 | |
| 
 | |
|         int realW = w;
 | |
|         int realH = h;
 | |
|         glTexStorage2D(mTarget, 1, mTextrueFormat, realW, realH);
 | |
|         OPENGL_CHECK_ERROR;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| void GLTexture::sample(GLuint unit, GLuint texId) {
 | |
|     glActiveTexture(GL_TEXTURE0 + texId);
 | |
|     glUniform1i(unit, texId);
 | |
|     glBindTexture(mTarget, mId);
 | |
|     OPENGL_CHECK_ERROR;
 | |
| }
 | |
| 
 | |
| void GLTexture::read(GLuint unit) {
 | |
|     glBindImageTexture(unit, mId, 0, GL_TRUE, 0, GL_READ_ONLY, mTextrueFormat);
 | |
|     OPENGL_CHECK_ERROR;
 | |
| }
 | |
| 
 | |
| void GLTexture::write(GLuint unit) {
 | |
|     glBindImageTexture(unit, mId, 0, GL_TRUE, 0, GL_WRITE_ONLY, mTextrueFormat);
 | |
|     OPENGL_CHECK_ERROR;
 | |
| }
 | |
| } // namespace OpenGL
 | |
| } // namespace MNN
 |