Internal change
PiperOrigin-RevId: 519674123
This commit is contained in:
		
							parent
							
								
									5ccf986513
								
							
						
					
					
						commit
						9f888435b7
					
				|  | @ -858,7 +858,7 @@ cc_library( | |||
|         ":scale_mode_cc_proto", | ||||
|         ":shader_util", | ||||
|         "//mediapipe/framework/port:ret_check", | ||||
|         "//mediapipe/framework/port:status", | ||||
|         "@com_google_absl//absl/status", | ||||
|     ], | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -87,6 +87,17 @@ absl::Status QuadRenderer::GlSetup( | |||
|   glGenVertexArrays(1, &vao_); | ||||
|   glGenBuffers(2, vbo_); | ||||
| 
 | ||||
|   glBindVertexArray(vao_); | ||||
|   glEnableVertexAttribArray(ATTRIB_VERTEX); | ||||
|   glEnableVertexAttribArray(ATTRIB_TEXTURE_POSITION); | ||||
| 
 | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|   glBufferData(GL_ARRAY_BUFFER, sizeof(mediapipe::kBasicTextureVertices), | ||||
|                kBasicTextureVertices, GL_STATIC_DRAW); | ||||
|   glVertexAttribPointer(ATTRIB_TEXTURE_POSITION, 2, GL_FLOAT, 0, 0, nullptr); | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|   glBindVertexArray(0); | ||||
| 
 | ||||
|   return absl::OkStatus(); | ||||
| } | ||||
| 
 | ||||
|  | @ -104,6 +115,7 @@ void QuadRenderer::GlTeardown() { | |||
|     vbo_[0] = 0; | ||||
|     vbo_[1] = 0; | ||||
|   } | ||||
|   rotation_ = std::nullopt; | ||||
| } | ||||
| 
 | ||||
| absl::Status QuadRenderer::GlRender(float frame_width, float frame_height, | ||||
|  | @ -145,12 +157,42 @@ absl::Status QuadRenderer::GlRender(float frame_width, float frame_height, | |||
|       break; | ||||
|   } | ||||
| 
 | ||||
|   if (flip_texture) { | ||||
|     switch (rotation) { | ||||
|       case FrameRotation::kNone:  // Fall-through intended.
 | ||||
|       case FrameRotation::k180: | ||||
|         flip_vertical = !flip_vertical; | ||||
|         break; | ||||
|       case FrameRotation::k90: | ||||
|         flip_horizontal = !flip_horizontal; | ||||
|         break; | ||||
|       case FrameRotation::k270: | ||||
|         flip_horizontal = !flip_horizontal; | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   const int h_flip_factor = flip_horizontal ? -1 : 1; | ||||
|   const int v_flip_factor = flip_vertical ? -1 : 1; | ||||
| 
 | ||||
|   GLfloat scale[] = {scale_width * h_flip_factor, scale_height * v_flip_factor, | ||||
|                      1.0, 1.0}; | ||||
|   glUniform4fv(scale_unif_, 1, scale); | ||||
| 
 | ||||
|   // Draw.
 | ||||
| 
 | ||||
|   glBindVertexArray(vao_); | ||||
|   if (rotation != rotation_) { | ||||
|     rotation_ = rotation; | ||||
|     UpdateVertices(rotation); | ||||
|   } | ||||
| 
 | ||||
|   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||||
|   glBindVertexArray(0); | ||||
| 
 | ||||
|   return absl::OkStatus(); | ||||
| } | ||||
| 
 | ||||
| void QuadRenderer::UpdateVertices(FrameRotation rotation) const { | ||||
|   // Choose vertices for rotation.
 | ||||
|   const GLfloat* vertices;  // quad used to render the texture.
 | ||||
|   switch (rotation) { | ||||
|  | @ -168,36 +210,11 @@ absl::Status QuadRenderer::GlRender(float frame_width, float frame_height, | |||
|       break; | ||||
|   } | ||||
| 
 | ||||
|   // Draw.
 | ||||
| 
 | ||||
|   // TODO: In practice, our vertex attributes almost never change, so
 | ||||
|   // convert this to being actually static, with initialization done in the
 | ||||
|   // GLSetup.
 | ||||
|   glBindVertexArray(vao_); | ||||
|   glEnableVertexAttribArray(ATTRIB_VERTEX); | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, vbo_[0]); | ||||
|   glBufferData(GL_ARRAY_BUFFER, sizeof(mediapipe::kBasicSquareVertices), | ||||
|                vertices, GL_STATIC_DRAW); | ||||
|   glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, nullptr); | ||||
| 
 | ||||
|   glEnableVertexAttribArray(ATTRIB_TEXTURE_POSITION); | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||
|   glBufferData( | ||||
|       GL_ARRAY_BUFFER, | ||||
|       flip_texture ? sizeof(mediapipe::kBasicTextureVerticesFlipY) | ||||
|                    : sizeof(mediapipe::kBasicTextureVertices), | ||||
|       flip_texture ? kBasicTextureVerticesFlipY : kBasicTextureVertices, | ||||
|       GL_STATIC_DRAW); | ||||
| 
 | ||||
|   glVertexAttribPointer(ATTRIB_TEXTURE_POSITION, 2, GL_FLOAT, 0, 0, nullptr); | ||||
| 
 | ||||
|   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||||
|   glDisableVertexAttribArray(ATTRIB_VERTEX); | ||||
|   glDisableVertexAttribArray(ATTRIB_TEXTURE_POSITION); | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|   glBindVertexArray(0); | ||||
| 
 | ||||
|   return absl::OkStatus(); | ||||
| } | ||||
| 
 | ||||
| absl::Status FrameRotationFromInt(FrameRotation* rotation, int degrees_ccw) { | ||||
|  |  | |||
|  | @ -15,7 +15,9 @@ | |||
| #ifndef MEDIAPIPE_GPU_GL_QUAD_RENDERER_H_ | ||||
| #define MEDIAPIPE_GPU_GL_QUAD_RENDERER_H_ | ||||
| 
 | ||||
| #include "mediapipe/framework/port/status.h" | ||||
| #include <optional> | ||||
| 
 | ||||
| #include "absl/status/status.h" | ||||
| #include "mediapipe/gpu/gl_base.h" | ||||
| #include "mediapipe/gpu/scale_mode.pb.h" | ||||
| 
 | ||||
|  | @ -78,11 +80,14 @@ class QuadRenderer { | |||
|   void GlTeardown(); | ||||
| 
 | ||||
|  private: | ||||
|   void UpdateVertices(FrameRotation rotation) const; | ||||
| 
 | ||||
|   GLuint program_ = 0; | ||||
|   GLint scale_unif_ = -1; | ||||
|   std::vector<GLint> frame_unifs_; | ||||
|   GLuint vao_ = 0;          // vertex array object
 | ||||
|   GLuint vbo_[2] = {0, 0};  // for vertex buffer storage
 | ||||
|   mutable std::optional<FrameRotation> rotation_; | ||||
| }; | ||||
| 
 | ||||
| absl::Status FrameRotationFromInt(FrameRotation* rotation, int degrees_ccw); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user