⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fbobject.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 4 页
字号:
      }      if (texObj && texObj->Target != GL_TEXTURE_1D) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glFramebufferTexture1DEXT(texture target mismatch)");         return;      }      break;   case 2:      if (textarget != GL_TEXTURE_2D &&          textarget != GL_TEXTURE_RECTANGLE_ARB &&          !IS_CUBE_FACE(textarget)) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glFramebufferTexture2DEXT(textarget)");         return;      }      if (texObj) {         if ((texObj->Target == GL_TEXTURE_2D && textarget != GL_TEXTURE_2D) ||             (texObj->Target == GL_TEXTURE_RECTANGLE_ARB              && textarget != GL_TEXTURE_RECTANGLE_ARB) ||             (texObj->Target == GL_TEXTURE_CUBE_MAP              && !IS_CUBE_FACE(textarget))) {            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glFramebufferTexture1DEXT(texture target mismatch)");            return;         }      }      break;   case 3:      if (textarget != GL_TEXTURE_3D) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glFramebufferTexture3DEXT(textarget)");         return;      }      if (texObj && texObj->Target != GL_TEXTURE_3D) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glFramebufferTexture3DEXT(texture target mismatch)");         return;      }      {         const GLint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);         if (zoffset < 0 || zoffset >= maxSize) {            _mesa_error(ctx, GL_INVALID_VALUE,                        "glFramebufferTexture3DEXT(zoffset)");            return;         }      }      break;   default:      _mesa_problem(ctx, "Unexpected dims in error_check_framebuffer_texture");      return;   }   if ((level < 0) || level >= _mesa_max_texture_levels(ctx, textarget)) {      _mesa_error(ctx, GL_INVALID_VALUE,                  "glFramebufferTexture%dDEXT(level)", dims);      return;   }   att = _mesa_get_attachment(ctx, fb, attachment);   if (att == NULL) {      _mesa_error(ctx, GL_INVALID_ENUM,		  "glFramebufferTexture%dDEXT(attachment)", dims);      return;   }   FLUSH_VERTICES(ctx, _NEW_BUFFERS);   _glthread_LOCK_MUTEX(fb->Mutex);   if (texObj) {      _mesa_set_texture_attachment(ctx, fb, att, texObj, textarget,                                   level, zoffset);   }   else {      _mesa_remove_attachment(ctx, att);   }   _glthread_UNLOCK_MUTEX(fb->Mutex);}void GLAPIENTRY_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,                              GLenum textarget, GLuint texture, GLint level){   const GLint zoffset = 0;   framebuffer_texture(1, target, attachment, textarget, texture,                       level, zoffset);}void GLAPIENTRY_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,                              GLenum textarget, GLuint texture, GLint level){   const GLint zoffset = 0;   framebuffer_texture(2, target, attachment, textarget, texture,                       level, zoffset);}void GLAPIENTRY_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,                              GLenum textarget, GLuint texture,                              GLint level, GLint zoffset){   framebuffer_texture(3, target, attachment, textarget, texture,                       level, zoffset);}void GLAPIENTRY_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,                                 GLenum renderbufferTarget,                                 GLuint renderbuffer){   struct gl_renderbuffer_attachment *att;   struct gl_framebuffer *fb;   struct gl_renderbuffer *rb;   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   switch (target) {#if FEATURE_EXT_framebuffer_blit   case GL_DRAW_FRAMEBUFFER_EXT:      if (!ctx->Extensions.EXT_framebuffer_blit) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glFramebufferRenderbufferEXT(target)");         return;      }      fb = ctx->DrawBuffer;      break;   case GL_READ_FRAMEBUFFER_EXT:      if (!ctx->Extensions.EXT_framebuffer_blit) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glFramebufferRenderbufferEXT(target)");         return;      }      fb = ctx->ReadBuffer;      break;#endif   case GL_FRAMEBUFFER_EXT:      fb = ctx->DrawBuffer;      break;   default:      _mesa_error(ctx, GL_INVALID_ENUM,                  "glFramebufferRenderbufferEXT(target)");      return;   }   if (renderbufferTarget != GL_RENDERBUFFER_EXT) {      _mesa_error(ctx, GL_INVALID_ENUM,                  "glFramebufferRenderbufferEXT(renderbufferTarget)");      return;   }   if (fb->Name == 0) {      /* Can't attach new renderbuffers to a window system framebuffer */      _mesa_error(ctx, GL_INVALID_OPERATION, "glFramebufferRenderbufferEXT");      return;   }   att = _mesa_get_attachment(ctx, fb, attachment);   if (att == NULL) {      _mesa_error(ctx, GL_INVALID_ENUM,                 "glFramebufferRenderbufferEXT(attachment)");      return;   }   if (renderbuffer) {      rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);      if (!rb) {	 _mesa_error(ctx, GL_INVALID_OPERATION,		     "glFramebufferRenderbufferEXT(renderbuffer)");	 return;      }   }   else {      /* remove renderbuffer attachment */      rb = NULL;   }   FLUSH_VERTICES(ctx, _NEW_BUFFERS);   assert(ctx->Driver.FramebufferRenderbuffer);   ctx->Driver.FramebufferRenderbuffer(ctx, fb, attachment, rb);   /* Some subsequent GL commands may depend on the framebuffer's visual    * after the binding is updated.  Update visual info now.    */   _mesa_update_framebuffer_visual(fb);}void GLAPIENTRY_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,                                             GLenum pname, GLint *params){   const struct gl_renderbuffer_attachment *att;   struct gl_framebuffer *buffer;   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   switch (target) {#if FEATURE_EXT_framebuffer_blit   case GL_DRAW_FRAMEBUFFER_EXT:      if (!ctx->Extensions.EXT_framebuffer_blit) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glGetFramebufferAttachmentParameterivEXT(target)");         return;      }      buffer = ctx->DrawBuffer;      break;   case GL_READ_FRAMEBUFFER_EXT:      if (!ctx->Extensions.EXT_framebuffer_blit) {         _mesa_error(ctx, GL_INVALID_ENUM,                     "glGetFramebufferAttachmentParameterivEXT(target)");         return;      }      buffer = ctx->ReadBuffer;      break;#endif   case GL_FRAMEBUFFER_EXT:      buffer = ctx->DrawBuffer;      break;   default:      _mesa_error(ctx, GL_INVALID_ENUM,                  "glGetFramebufferAttachmentParameterivEXT(target)");      return;   }   if (buffer->Name == 0) {      _mesa_error(ctx, GL_INVALID_OPERATION,                  "glGetFramebufferAttachmentParameterivEXT");      return;   }   att = _mesa_get_attachment(ctx, buffer, attachment);   if (att == NULL) {      _mesa_error(ctx, GL_INVALID_ENUM,                  "glGetFramebufferAttachmentParameterivEXT(attachment)");      return;   }   FLUSH_VERTICES(ctx, _NEW_BUFFERS);   switch (pname) {   case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:      *params = att->Type;      return;   case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:      if (att->Type == GL_RENDERBUFFER_EXT) {	 *params = att->Renderbuffer->Name;      }      else if (att->Type == GL_TEXTURE) {	 *params = att->Texture->Name;      }      else {	 _mesa_error(ctx, GL_INVALID_ENUM,		     "glGetFramebufferAttachmentParameterivEXT(pname)");      }      return;   case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:      if (att->Type == GL_TEXTURE) {	 *params = att->TextureLevel;      }      else {	 _mesa_error(ctx, GL_INVALID_ENUM,		     "glGetFramebufferAttachmentParameterivEXT(pname)");      }      return;   case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:      if (att->Type == GL_TEXTURE) {	 *params = GL_TEXTURE_CUBE_MAP_POSITIVE_X + att->CubeMapFace;      }      else {	 _mesa_error(ctx, GL_INVALID_ENUM,		     "glGetFramebufferAttachmentParameterivEXT(pname)");      }      return;   case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:      if (att->Type == GL_TEXTURE) {	 *params = att->Zoffset;      }      else {	 _mesa_error(ctx, GL_INVALID_ENUM,		     "glGetFramebufferAttachmentParameterivEXT(pname)");      }      return;   default:      _mesa_error(ctx, GL_INVALID_ENUM,                  "glGetFramebufferAttachmentParameterivEXT(pname)");      return;   }}void GLAPIENTRY_mesa_GenerateMipmapEXT(GLenum target){   struct gl_texture_unit *texUnit;   struct gl_texture_object *texObj;   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   FLUSH_VERTICES(ctx, _NEW_BUFFERS);   switch (target) {   case GL_TEXTURE_1D:   case GL_TEXTURE_2D:   case GL_TEXTURE_3D:   case GL_TEXTURE_CUBE_MAP:      /* OK, legal value */      break;   default:      _mesa_error(ctx, GL_INVALID_ENUM, "glGenerateMipmapEXT(target)");      return;   }   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];   texObj = _mesa_select_tex_object(ctx, texUnit, target);   /* XXX this might not handle cube maps correctly */   _mesa_generate_mipmap(ctx, target, texUnit, texObj);}#if FEATURE_EXT_framebuffer_blitvoid GLAPIENTRY_mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,                         GLbitfield mask, GLenum filter){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   FLUSH_VERTICES(ctx, _NEW_BUFFERS);   if (ctx->NewState) {      _mesa_update_state(ctx);   }   if (!ctx->ReadBuffer) {      /* XXX */   }   /* check for complete framebuffers */   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||       ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,                  "glBlitFramebufferEXT(incomplete draw/read buffers)");      return;   }   if (filter != GL_NEAREST && filter != GL_LINEAR) {      _mesa_error(ctx, GL_INVALID_ENUM, "glBlitFramebufferEXT(filter)");      return;   }   if (mask & ~(GL_COLOR_BUFFER_BIT |                GL_DEPTH_BUFFER_BIT |                GL_STENCIL_BUFFER_BIT)) {      _mesa_error( ctx, GL_INVALID_VALUE, "glBlitFramebufferEXT(mask)");      return;   }   /* depth/stencil must be blitted with nearest filtering */   if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))        && filter != GL_NEAREST) {      _mesa_error(ctx, GL_INVALID_OPERATION,             "glBlitFramebufferEXT(depth/stencil requires GL_NEAREST filter");      return;   }   if (mask & GL_STENCIL_BUFFER_BIT) {      struct gl_renderbuffer *readRb = ctx->ReadBuffer->_StencilBuffer;      struct gl_renderbuffer *drawRb = ctx->DrawBuffer->_StencilBuffer;      if (readRb->StencilBits != drawRb->StencilBits) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glBlitFramebufferEXT(stencil buffer size mismatch");         return;      }   }   if (mask & GL_DEPTH_BUFFER_BIT) {      struct gl_renderbuffer *readRb = ctx->ReadBuffer->_DepthBuffer;      struct gl_renderbuffer *drawRb = ctx->DrawBuffer->_DepthBuffer;      if (readRb->DepthBits != drawRb->DepthBits) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glBlitFramebufferEXT(depth buffer size mismatch");         return;      }   }   if (!ctx->Extensions.EXT_framebuffer_blit) {      _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebufferEXT");      return;   }   ASSERT(ctx->Driver.BlitFramebuffer);   ctx->Driver.BlitFramebuffer(ctx,                               srcX0, srcY0, srcX1, srcY1,                               dstX0, dstY0, dstX1, dstY1,                               mask, filter);}#endif /* FEATURE_EXT_framebuffer_blit */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -