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

📄 renderbuffer.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
static voidget_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,               GLint x, GLint y, void *values){   /* NOTE: 'values' is RGBA format! */   const GLubyte *src = (const GLubyte *) arb->Data + y * arb->Width + x;   GLubyte *dst = (GLubyte *) values;   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->GetRow(ctx, arb->Wrapped, count, x, y, values);   /* second, fill in alpha values from this buffer! */   for (i = 0; i < count; i++) {      dst[i * 4 + 3] = src[i];   }}static voidget_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,                  const GLint x[], const GLint y[], void *values){   GLubyte *dst = (GLubyte *) values;   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->GetValues(ctx, arb->Wrapped, count, x, y, values);   /* second, fill in alpha values from this buffer! */   for (i = 0; i < count; i++) {      const GLubyte *src = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];      dst[i * 4 + 3] = *src;   }}static voidput_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,               GLint x, GLint y, const void *values, const GLubyte *mask){   const GLubyte *src = (const GLubyte *) values;   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->PutRow(ctx, arb->Wrapped, count, x, y, values, mask);   /* second, store alpha in our buffer */   for (i = 0; i < count; i++) {      if (!mask || mask[i]) {         dst[i] = src[i * 4 + 3];      }   }}static voidput_row_rgb_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,                   GLint x, GLint y, const void *values, const GLubyte *mask){   const GLubyte *src = (const GLubyte *) values;   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->PutRowRGB(ctx, arb->Wrapped, count, x, y, values, mask);   /* second, store alpha in our buffer */   for (i = 0; i < count; i++) {      if (!mask || mask[i]) {         dst[i] = src[i * 4 + 3];      }   }}static voidput_mono_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,                    GLint x, GLint y, const void *value, const GLubyte *mask){   const GLubyte val = ((const GLubyte *) value)[3];   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->PutMonoRow(ctx, arb->Wrapped, count, x, y, value, mask);   /* second, store alpha in our buffer */   if (mask) {      GLuint i;      for (i = 0; i < count; i++) {         if (mask[i]) {            dst[i] = val;         }      }   }   else {      _mesa_memset(dst, val, count);   }}static voidput_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,                  const GLint x[], const GLint y[],                  const void *values, const GLubyte *mask){   const GLubyte *src = (const GLubyte *) values;   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->PutValues(ctx, arb->Wrapped, count, x, y, values, mask);   /* second, store alpha in our buffer */   for (i = 0; i < count; i++) {      if (!mask || mask[i]) {         GLubyte *dst = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];         *dst = src[i * 4 + 3];      }   }}static voidput_mono_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb,                       GLuint count, const GLint x[], const GLint y[],                       const void *value, const GLubyte *mask){   const GLubyte val = ((const GLubyte *) value)[3];   GLuint i;   ASSERT(arb != arb->Wrapped);   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);   /* first, pass the call to the wrapped RGB buffer */   arb->Wrapped->PutValues(ctx, arb->Wrapped, count, x, y, value, mask);   /* second, store alpha in our buffer */   for (i = 0; i < count; i++) {      if (!mask || mask[i]) {         GLubyte *dst = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];         *dst = val;      }   }}static voidcopy_buffer_alpha8(struct gl_renderbuffer* dst, struct gl_renderbuffer* src){   ASSERT(dst->_ActualFormat == GL_ALPHA8);   ASSERT(src->_ActualFormat == GL_ALPHA8);   ASSERT(dst->Width == src->Width);   ASSERT(dst->Height == src->Height);   _mesa_memcpy(dst->Data, src->Data, dst->Width * dst->Height * sizeof(GLubyte));}/**********************************************************************//**********************************************************************//**********************************************************************//** * Default GetPointer routine.  Always return NULL to indicate that * direct buffer access is not supported. */static void *nop_get_pointer(GLcontext *ctx, struct gl_renderbuffer *rb, GLint x, GLint y){   return NULL;}/** * Initialize the fields of a gl_renderbuffer to default values. */void_mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name){   _glthread_INIT_MUTEX(rb->Mutex);   rb->Magic = RB_MAGIC;   rb->ClassID = 0;   rb->Name = name;   rb->RefCount = 0;   rb->Delete = _mesa_delete_renderbuffer;   /* The rest of these should be set later by the caller of this function or    * the AllocStorage method:    */   rb->AllocStorage = NULL;   rb->Width = 0;   rb->Height = 0;   rb->InternalFormat = GL_NONE;   rb->_ActualFormat = GL_NONE;   rb->_BaseFormat = GL_NONE;   rb->DataType = GL_NONE;   rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = 0;   rb->IndexBits = 0;   rb->DepthBits = 0;   rb->StencilBits = 0;   rb->Data = NULL;   /* Point back to ourself so that we don't have to check for Wrapped==NULL    * all over the drivers.    */   rb->Wrapped = rb;   rb->GetPointer = nop_get_pointer;   rb->GetRow = NULL;   rb->GetValues = NULL;   rb->PutRow = NULL;   rb->PutRowRGB = NULL;   rb->PutMonoRow = NULL;   rb->PutValues = NULL;   rb->PutMonoValues = NULL;}/** * Allocate a new gl_renderbuffer object.  This can be used for user-created * renderbuffers or window-system renderbuffers. */struct gl_renderbuffer *_mesa_new_renderbuffer(GLcontext *ctx, GLuint name){   struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);   if (rb) {      _mesa_init_renderbuffer(rb, name);   }   return rb;}/** * Delete a gl_framebuffer. * This is the default function for renderbuffer->Delete(). */void_mesa_delete_renderbuffer(struct gl_renderbuffer *rb){   if (rb->Data) {      _mesa_free(rb->Data);   }   _mesa_free(rb);}/** * Allocate a software-based renderbuffer.  This is called via the * ctx->Driver.NewRenderbuffer() function when the user creates a new * renderbuffer. * This would not be used for hardware-based renderbuffers. */struct gl_renderbuffer *_mesa_new_soft_renderbuffer(GLcontext *ctx, GLuint name){   struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name);   if (rb) {      rb->AllocStorage = _mesa_soft_renderbuffer_storage;      /* Normally, one would setup the PutRow, GetRow, etc functions here.       * But we're doing that in the _mesa_soft_renderbuffer_storage() function       * instead.       */   }   return rb;}/** * Add software-based color renderbuffers to the given framebuffer. * This is a helper routine for device drivers when creating a * window system framebuffer (not a user-created render/framebuffer). * Once this function is called, you can basically forget about this * renderbuffer; core Mesa will handle all the buffer management and * rendering! */GLboolean_mesa_add_color_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,                              GLuint rgbBits, GLuint alphaBits,                              GLboolean frontLeft, GLboolean backLeft,                              GLboolean frontRight, GLboolean backRight){   GLuint b;   if (rgbBits > 16 || alphaBits > 16) {      _mesa_problem(ctx,                    "Unsupported bit depth in _mesa_add_color_renderbuffers");      return GL_FALSE;   }   assert(MAX_COLOR_ATTACHMENTS >= 4);   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {      struct gl_renderbuffer *rb;      if (b == BUFFER_FRONT_LEFT && !frontLeft)         continue;      else if (b == BUFFER_BACK_LEFT && !backLeft)         continue;      else if (b == BUFFER_FRONT_RIGHT && !frontRight)         continue;      else if (b == BUFFER_BACK_RIGHT && !backRight)         continue;      assert(fb->Attachment[b].Renderbuffer == NULL);      rb = _mesa_new_renderbuffer(ctx, 0);      if (!rb) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");         return GL_FALSE;      }      if (rgbBits <= 8) {         if (alphaBits)            rb->_ActualFormat = GL_RGBA8;         else            rb->_ActualFormat = GL_RGB8;      }      else {         assert(rgbBits <= 16);         if (alphaBits)            rb->_ActualFormat = GL_RGBA16;         else            rb->_ActualFormat = GL_RGBA16; /* don't really have RGB16 yet */      }      rb->InternalFormat = rb->_ActualFormat;      rb->AllocStorage = _mesa_soft_renderbuffer_storage;      _mesa_add_renderbuffer(fb, b, rb);   }   return GL_TRUE;}/** * Add software-based color index renderbuffers to the given framebuffer. * This is a helper routine for device drivers when creating a * window system framebuffer (not a user-created render/framebuffer). * Once this function is called, you can basically forget about this * renderbuffer; core Mesa will handle all the buffer management and * rendering! */GLboolean_mesa_add_color_index_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,                                    GLuint indexBits,                                    GLboolean frontLeft, GLboolean backLeft,                                    GLboolean frontRight, GLboolean backRight){   GLuint b;   if (indexBits > 8) {      _mesa_problem(ctx,                "Unsupported bit depth in _mesa_add_color_index_renderbuffers");      return GL_FALSE;   }   assert(MAX_COLOR_ATTACHMENTS >= 4);   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {      struct gl_renderbuffer *rb;      if (b == BUFFER_FRONT_LEFT && !frontLeft)         continue;      else if (b == BUFFER_BACK_LEFT && !backLeft)         continue;      else if (b == BUFFER_FRONT_RIGHT && !frontRight)         continue;      else if (b == BUFFER_BACK_RIGHT && !backRight)         continue;      assert(fb->Attachment[b].Renderbuffer == NULL);      rb = _mesa_new_renderbuffer(ctx, 0);      if (!rb) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");         return GL_FALSE;      }      if (indexBits <= 8) {         /* only support GLuint for now */         /*rb->InternalFormat = GL_COLOR_INDEX8_EXT;*/         rb->_ActualFormat = COLOR_INDEX32;      }      else {         rb->_ActualFormat = COLOR_INDEX32;      }      rb->InternalFormat = rb->_ActualFormat;      rb->AllocStorage = _mesa_soft_renderbuffer_storage;      _mesa_add_renderbuffer(fb, b, rb);   }   return GL_TRUE;}/** * Add software-based alpha renderbuffers to the given framebuffer. * This is a helper routine for device drivers when creating a * window system framebuffer (not a user-created render/framebuffer). * Once this function is called, you can basically forget about this * renderbuffer; core Mesa will handle all the buffer management and * rendering! */GLboolean_mesa_add_alpha_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,                              GLuint alphaBits,                              GLboolean frontLeft, GLboolean backLeft,                              GLboolean frontRight, GLboolean backRight){   GLuint b;   /* for window system framebuffers only! */   assert(fb->Name == 0);   if (alphaBits > 8) {      _mesa_problem(ctx,                    "Unsupported bit depth in _mesa_add_alpha_renderbuffers");      return GL_FALSE;   }   assert(MAX_COLOR_ATTACHMENTS >= 4);   /* Wrap each of the RGB color buffers with an alpha renderbuffer.    */   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {      struct gl_renderbuffer *arb;      if (b == BUFFER_FRONT_LEFT && !frontLeft)

⌨️ 快捷键说明

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