📄 swrast.c
字号:
/* * Copyright (C) 2008 George Sapountzis <gsap7@yahoo.gr> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *//* * DRI software rasterizer * * This is the mesa swrast module packaged into a DRI driver structure. * * The front-buffer is allocated by the loader. The loader provides read/write * callbacks for access to the front-buffer. The driver uses a scratch row for * front-buffer rendering to avoid repeated calls to the loader. * * The back-buffer is allocated by the driver and is private. */#include "context.h"#include "extensions.h"#include "framebuffer.h"#include "imports.h"#include "renderbuffer.h"#include "swrast/swrast.h"#include "swrast_setup/swrast_setup.h"#include "tnl/tnl.h"#include "tnl/t_context.h"#include "tnl/t_pipeline.h"#include "vbo/vbo.h"#include "drivers/common/driverfuncs.h"#include "utils.h"#include "swrast_priv.h"#define need_GL_VERSION_1_3#define need_GL_VERSION_1_4#define need_GL_VERSION_1_5#define need_GL_VERSION_2_0#define need_GL_VERSION_2_1/* sw extensions for imaging */#define need_GL_EXT_blend_color#define need_GL_EXT_blend_minmax#define need_GL_EXT_convolution#define need_GL_EXT_histogram#define need_GL_SGI_color_table/* sw extensions not associated with some GL version */#define need_GL_ARB_shader_objects#define need_GL_ARB_vertex_program#define need_GL_APPLE_vertex_array_object#define need_GL_ATI_fragment_shader#define need_GL_EXT_depth_bounds_test#define need_GL_EXT_framebuffer_object#define need_GL_EXT_framebuffer_blit#define need_GL_EXT_gpu_program_parameters#define need_GL_EXT_paletted_texture#define need_GL_IBM_multimode_draw_arrays#define need_GL_MESA_resize_buffers#define need_GL_NV_vertex_program#define need_GL_NV_fragment_program#include "extension_helper.h"const struct dri_extension card_extensions[] ={ { "GL_VERSION_1_3", GL_VERSION_1_3_functions }, { "GL_VERSION_1_4", GL_VERSION_1_4_functions }, { "GL_VERSION_1_5", GL_VERSION_1_5_functions }, { "GL_VERSION_2_0", GL_VERSION_2_0_functions }, { "GL_VERSION_2_1", GL_VERSION_2_1_functions }, { "GL_EXT_blend_color", GL_EXT_blend_color_functions }, { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions }, { "GL_EXT_convolution", GL_EXT_convolution_functions }, { "GL_EXT_histogram", GL_EXT_histogram_functions }, { "GL_SGI_color_table", GL_SGI_color_table_functions }, { "GL_ARB_shader_objects", GL_ARB_shader_objects_functions }, { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions }, { "GL_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions }, { "GL_ATI_fragment_shader", GL_ATI_fragment_shader_functions }, { "GL_EXT_depth_bounds_test", GL_EXT_depth_bounds_test_functions }, { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, { "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions }, { "GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions }, { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions }, { "GL_IBM_multimode_draw_arrays", GL_IBM_multimode_draw_arrays_functions }, { "GL_MESA_resize_buffers", GL_MESA_resize_buffers_functions }, { "GL_NV_vertex_program", GL_NV_vertex_program_functions }, { "GL_NV_fragment_program", GL_NV_fragment_program_functions }, { NULL, NULL }};/** * Screen and config-related functions */static voidsetupLoaderExtensions(__DRIscreen *psp, const __DRIextension **extensions){ int i; for (i = 0; extensions[i]; i++) { if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0) psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i]; }}static __DRIconfig **swrastFillInModes(__DRIscreen *psp, unsigned pixel_bits, unsigned depth_bits, unsigned stencil_bits, GLboolean have_back_buffer){ __DRIconfig **configs; unsigned depth_buffer_factor; unsigned back_buffer_factor; GLenum fb_format; GLenum fb_type; /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't * support pageflipping at all. */ static const GLenum back_buffer_modes[] = { GLX_NONE, GLX_SWAP_UNDEFINED_OML }; u_int8_t depth_bits_array[4]; u_int8_t stencil_bits_array[4]; depth_bits_array[0] = 0; depth_bits_array[1] = 0; depth_bits_array[2] = depth_bits; depth_bits_array[3] = depth_bits; /* Just like with the accumulation buffer, always provide some modes * with a stencil buffer. */ stencil_bits_array[0] = 0; stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; stencil_bits_array[2] = 0; stencil_bits_array[3] = (stencil_bits == 0) ? 8 : stencil_bits; depth_buffer_factor = 4; back_buffer_factor = 2; if (pixel_bits == 8) { fb_format = GL_RGB; fb_type = GL_UNSIGNED_BYTE_2_3_3_REV; } else if (pixel_bits == 16) { fb_format = GL_RGB; fb_type = GL_UNSIGNED_SHORT_5_6_5; } else { fb_format = GL_BGRA; fb_type = GL_UNSIGNED_INT_8_8_8_8_REV; } configs = driCreateConfigs(fb_format, fb_type, depth_bits_array, stencil_bits_array, depth_buffer_factor, back_buffer_modes, back_buffer_factor); if (configs == NULL) { fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__); return NULL; } return configs;}static __DRIscreen *driCreateNewScreen(int scrn, const __DRIextension **extensions, const __DRIconfig ***driver_configs, void *data){ static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; __DRIconfig **configs8, **configs16, **configs32; (void) data; TRACE; psp = _mesa_calloc(sizeof(*psp)); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); psp->num = scrn; psp->extensions = emptyExtensionList; configs8 = swrastFillInModes(psp, 8, 8, 0, 1); configs16 = swrastFillInModes(psp, 16, 16, 0, 1); configs32 = swrastFillInModes(psp, 32, 24, 8, 1); configs16 = (__DRIconfig **)driConcatConfigs(configs8, configs16); *driver_configs = driConcatConfigs(configs16, configs32); driInitExtensions( NULL, card_extensions, GL_FALSE ); return psp;}static void driDestroyScreen(__DRIscreen *psp){ TRACE; if (psp) { _mesa_free(psp); }}static const __DRIextension **driGetExtensions(__DRIscreen *psp){ TRACE; return psp->extensions;}/** * Framebuffer and renderbuffer-related functions. */static GLuintchoose_pixel_format(const GLvisual *v){ if (v->rgbMode) { int bpp = v->rgbBits; if (bpp == 32 && v->redMask == 0xff0000 && v->greenMask == 0x00ff00 && v->blueMask == 0x0000ff) return PF_A8R8G8B8; else if (bpp == 16 && v->redMask == 0xf800 && v->greenMask == 0x07e0 && v->blueMask == 0x001f) return PF_R5G6B5; else if (bpp == 8 && v->redMask == 0x07 && v->greenMask == 0x38 && v->blueMask == 0xc0) return PF_R3G3B2; } else { if (v->indexBits == 8) return PF_CI8; } _mesa_problem( NULL, "unexpected format in %s", __FUNCTION__ ); return 0;}static voidswrast_delete_renderbuffer(struct gl_renderbuffer *rb){ TRACE; _mesa_free(rb->Data); _mesa_free(rb);}static GLbooleanswrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height){ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); int bpp; unsigned mask = PITCH_ALIGN_BITS - 1; TRACE; rb->Data = NULL; rb->Width = width; rb->Height = height; switch (internalFormat) { case GL_RGB: bpp = rb->RedBits + rb->GreenBits + rb->BlueBits; break; case GL_RGBA: bpp = rb->RedBits + rb->GreenBits + rb->BlueBits + rb->AlphaBits; break; case GL_COLOR_INDEX8_EXT: bpp = rb->IndexBits; break; default: _mesa_problem( NULL, "unexpected format in %s", __FUNCTION__ ); return GL_FALSE; } /* always pad to PITCH_ALIGN_BITS */ xrb->pitch = ((width * bpp + mask) & ~mask) / 8; return GL_TRUE;}static GLbooleanswrast_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height){ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); TRACE; _mesa_free(rb->Data); swrast_alloc_front_storage(ctx, rb, internalFormat, width, height); rb->Data = _mesa_malloc(height * xrb->pitch); return GL_TRUE;}static struct swrast_renderbuffer *swrast_new_renderbuffer(const GLvisual *visual, GLboolean front){ struct swrast_renderbuffer *xrb = _mesa_calloc(sizeof *xrb); GLuint pixel_format; TRACE; if (!xrb) return NULL; _mesa_init_renderbuffer(&xrb->Base, 0); pixel_format = choose_pixel_format(visual); xrb->Base.Delete = swrast_delete_renderbuffer; if (front) { xrb->Base.AllocStorage = swrast_alloc_front_storage; swrast_set_span_funcs_front(xrb, pixel_format); } else { xrb->Base.AllocStorage = swrast_alloc_back_storage; swrast_set_span_funcs_back(xrb, pixel_format); } switch (pixel_format) { case PF_A8R8G8B8: xrb->Base.InternalFormat = GL_RGBA; xrb->Base._BaseFormat = GL_RGBA;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -