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

📄 depthstencil.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
              const GLint x[], const GLint y[], void *values){   struct gl_renderbuffer *dsrb = s8rb->Wrapped;   GLuint temp[MAX_WIDTH], i;   GLubyte *dst = (GLubyte *) values;   ASSERT(s8rb->DataType == GL_UNSIGNED_BYTE);   ASSERT(dsrb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT);   ASSERT(count <= MAX_WIDTH);   /* don't bother trying direct access */   dsrb->GetValues(ctx, dsrb, count, x, y, temp);   for (i = 0; i < count; i++) {      dst[i] = temp[i] & 0xff;   }}static voidput_row_s8(GLcontext *ctx, struct gl_renderbuffer *s8rb, GLuint count,           GLint x, GLint y, const void *values, const GLubyte *mask){   struct gl_renderbuffer *dsrb = s8rb->Wrapped;   const GLubyte *src = (const GLubyte *) values;   GLuint *dst = (GLuint *) dsrb->GetPointer(ctx, dsrb, x, y);   ASSERT(s8rb->DataType == GL_UNSIGNED_BYTE);   ASSERT(dsrb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT);   if (dst) {      /* direct access */      GLuint i;      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            dst[i] = (dst[i] & 0xffffff00) | src[i];         }      }   }   else {      /* get, modify, put */      GLuint temp[MAX_WIDTH], i;      dsrb->GetRow(ctx, dsrb, count, x, y, temp);      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            temp[i] = (temp[i] & 0xffffff00) | src[i];         }      }      dsrb->PutRow(ctx, dsrb, count, x, y, temp, mask);   }}static voidput_mono_row_s8(GLcontext *ctx, struct gl_renderbuffer *s8rb, GLuint count,                GLint x, GLint y, const void *value, const GLubyte *mask){   struct gl_renderbuffer *dsrb = s8rb->Wrapped;   const GLubyte val = *((GLubyte *) value);   GLuint *dst = (GLuint *) dsrb->GetPointer(ctx, dsrb, x, y);   ASSERT(s8rb->DataType == GL_UNSIGNED_BYTE);   ASSERT(dsrb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT);   if (dst) {      /* direct access */      GLuint i;      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            dst[i] = (dst[i] & 0xffffff00) | val;         }      }   }   else {      /* get, modify, put */      GLuint temp[MAX_WIDTH], i;      dsrb->GetRow(ctx, dsrb, count, x, y, temp);      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            temp[i] = (temp[i] & 0xffffff00) | val;         }      }      dsrb->PutRow(ctx, dsrb, count, x, y, temp, mask);   }}static voidput_values_s8(GLcontext *ctx, struct gl_renderbuffer *s8rb, GLuint count,              const GLint x[], const GLint y[],              const void *values, const GLubyte *mask){   struct gl_renderbuffer *dsrb = s8rb->Wrapped;   const GLubyte *src = (const GLubyte *) values;   ASSERT(s8rb->DataType == GL_UNSIGNED_BYTE);   ASSERT(dsrb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT);   if (dsrb->GetPointer(ctx, dsrb, 0, 0)) {      /* direct access */      GLuint i;      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            GLuint *dst = (GLuint *) dsrb->GetPointer(ctx, dsrb, x[i], y[i]);            *dst = (*dst & 0xffffff00) | src[i];         }      }   }   else {      /* get, modify, put */      GLuint temp[MAX_WIDTH], i;      dsrb->GetValues(ctx, dsrb, count, x, y, temp);      for (i = 0; i < count; i++) {         if (!mask || mask[i]) {            temp[i] = (temp[i] & 0xffffff00) | src[i];         }      }      dsrb->PutValues(ctx, dsrb, count, x, y, temp, mask);   }}static voidput_mono_values_s8(GLcontext *ctx, struct gl_renderbuffer *s8rb, GLuint count,                   const GLint x[], const GLint y[],                   const void *value, const GLubyte *mask){   struct gl_renderbuffer *dsrb = s8rb->Wrapped;   GLuint temp[MAX_WIDTH], i;   const GLubyte val = *((GLubyte *) value);   /* get, modify, put */   dsrb->GetValues(ctx, dsrb, count, x, y, temp);   for (i = 0; i < count; i++) {      if (!mask || mask[i]) {         temp[i] = (temp[i] & 0xffffff) | val;      }   }   dsrb->PutValues(ctx, dsrb, count, x, y, temp, mask);}/** * Wrap the given GL_DEPTH_STENCIL renderbuffer so that it acts like * a stencil renderbuffer. * \return new stencil renderbuffer */struct gl_renderbuffer *_mesa_new_s8_renderbuffer_wrapper(GLcontext *ctx, struct gl_renderbuffer *dsrb){   struct gl_renderbuffer *s8rb;   ASSERT(dsrb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT);   s8rb = _mesa_new_renderbuffer(ctx, 0);   if (!s8rb)      return NULL;   s8rb->Wrapped = dsrb;   s8rb->Name = dsrb->Name;   s8rb->RefCount = 1;   s8rb->Width = dsrb->Width;   s8rb->Height = dsrb->Height;   s8rb->InternalFormat = GL_STENCIL_INDEX8_EXT;   s8rb->_ActualFormat = GL_STENCIL_INDEX8_EXT;   s8rb->_BaseFormat = GL_STENCIL_INDEX;   s8rb->DataType = GL_UNSIGNED_BYTE;   s8rb->StencilBits = 8;   s8rb->Data = NULL;   s8rb->Delete = delete_wrapper;   s8rb->AllocStorage = alloc_wrapper_storage;   s8rb->GetPointer = nop_get_pointer;   s8rb->GetRow = get_row_s8;   s8rb->GetValues = get_values_s8;   s8rb->PutRow = put_row_s8;   s8rb->PutRowRGB = NULL;   s8rb->PutMonoRow = put_mono_row_s8;   s8rb->PutValues = put_values_s8;   s8rb->PutMonoValues = put_mono_values_s8;   return s8rb;}/** ** The following functions are useful for hardware drivers that only ** implement combined depth/stencil buffers. ** The GL_EXT_framebuffer_object extension allows indepedent depth and ** stencil buffers to be used in any combination. ** Therefore, we sometimes have to merge separate depth and stencil ** renderbuffers into a single depth+stencil renderbuffer.  And sometimes ** we have to split combined depth+stencil renderbuffers into separate ** renderbuffers. **//** * Extract stencil values from the combined depth/stencil renderbuffer, storing * the values into a separate stencil renderbuffer. * \param dsRb  the source depth/stencil renderbuffer * \param stencilRb  the destination stencil renderbuffer *                   (either 8-bit or 32-bit) */void_mesa_extract_stencil(GLcontext *ctx,                      struct gl_renderbuffer *dsRb,                      struct gl_renderbuffer *stencilRb){   GLuint row, width, height;   ASSERT(dsRb);   ASSERT(stencilRb);   ASSERT(dsRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsRb->DataType == GL_UNSIGNED_INT_24_8_EXT);   ASSERT(stencilRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT ||          stencilRb->_ActualFormat == GL_STENCIL_INDEX8_EXT);   ASSERT(dsRb->Width == stencilRb->Width);   ASSERT(dsRb->Height == stencilRb->Height);   width = dsRb->Width;   height = dsRb->Height;   for (row = 0; row < height; row++) {      GLuint depthStencil[MAX_WIDTH];      dsRb->GetRow(ctx, dsRb, width, 0, row, depthStencil);      if (stencilRb->_ActualFormat == GL_STENCIL_INDEX8_EXT) {         /* 8bpp stencil */         GLubyte stencil[MAX_WIDTH];         GLuint i;         for (i = 0; i < width; i++) {            stencil[i] = depthStencil[i] & 0xff;         }         stencilRb->PutRow(ctx, stencilRb, width, 0, row, stencil, NULL);      }      else {         /* 32bpp stencil */         /* the 24 depth bits will be ignored */         ASSERT(stencilRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);         ASSERT(stencilRb->DataType == GL_UNSIGNED_INT_24_8_EXT);         stencilRb->PutRow(ctx, stencilRb, width, 0, row, depthStencil, NULL);      }   }}/** * Copy stencil values from a stencil renderbuffer into a combined * depth/stencil renderbuffer. * \param dsRb  the destination depth/stencil renderbuffer * \param stencilRb  the source stencil buffer (either 8-bit or 32-bit) */void_mesa_insert_stencil(GLcontext *ctx,                     struct gl_renderbuffer *dsRb,                     struct gl_renderbuffer *stencilRb){   GLuint row, width, height;   ASSERT(dsRb);   ASSERT(stencilRb);   ASSERT(dsRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);   ASSERT(dsRb->DataType == GL_UNSIGNED_INT_24_8_EXT);   ASSERT(stencilRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT ||          stencilRb->_ActualFormat == GL_STENCIL_INDEX8_EXT);   ASSERT(dsRb->Width == stencilRb->Width);   ASSERT(dsRb->Height == stencilRb->Height);   width = dsRb->Width;   height = dsRb->Height;   for (row = 0; row < height; row++) {      GLuint depthStencil[MAX_WIDTH];      dsRb->GetRow(ctx, dsRb, width, 0, row, depthStencil);      if (stencilRb->_ActualFormat == GL_STENCIL_INDEX8_EXT) {         /* 8bpp stencil */         GLubyte stencil[MAX_WIDTH];         GLuint i;         stencilRb->GetRow(ctx, stencilRb, width, 0, row, stencil);         for (i = 0; i < width; i++) {            depthStencil[i] = (depthStencil[i] & 0xffffff00) | stencil[i];         }      }      else {         /* 32bpp stencil buffer */         GLuint stencil[MAX_WIDTH], i;         ASSERT(stencilRb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);         ASSERT(stencilRb->DataType == GL_UNSIGNED_INT_24_8_EXT);         stencilRb->GetRow(ctx, stencilRb, width, 0, row, stencil);         for (i = 0; i < width; i++) {            depthStencil[i]               = (depthStencil[i] & 0xffffff00) | (stencil[i] & 0xff);         }      }      dsRb->PutRow(ctx, dsRb, width, 0, row, depthStencil, NULL);   }}/** * Convert the stencil buffer from 8bpp to 32bpp depth/stencil. * \param stencilRb  the stencil renderbuffer to promote */void_mesa_promote_stencil(GLcontext *ctx, struct gl_renderbuffer *stencilRb){   const GLsizei width = stencilRb->Width;   const GLsizei height = stencilRb->Height;   GLubyte *data;   GLint i, j, k;   ASSERT(stencilRb->_ActualFormat == GL_STENCIL_INDEX8_EXT);   ASSERT(stencilRb->Data);   data = (GLubyte *) stencilRb->Data;   stencilRb->Data = NULL;   stencilRb->AllocStorage(ctx, stencilRb, GL_DEPTH24_STENCIL8_EXT,                           width, height);   ASSERT(stencilRb->DataType == GL_UNSIGNED_INT_24_8_EXT);   k = 0;   for (i = 0; i < height; i++) {      GLuint depthStencil[MAX_WIDTH];      for (j = 0; j < width; j++) {         depthStencil[j] = data[k++];      }      stencilRb->PutRow(ctx, stencilRb, width, 0, i, depthStencil, NULL);   }   _mesa_free(data);   stencilRb->_BaseFormat = GL_DEPTH_STENCIL_EXT;}

⌨️ 快捷键说明

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