📄 depthstencil.c
字号:
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 + -