📄 idirectfbgl_mesa.c
字号:
/* RGB332 */#define NAME(PREFIX) PREFIX##_RGB332#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLubyte *P = data->video.end - (Y) * data->video.pitch + (X);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL(P, X, Y, S) \ *P = ( (((S[RCOMP]) & 0xe0)) | (((S[GCOMP]) & 0xe0) >> 3) | ((S[BCOMP]) >> 6) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0xe0) ); \ D[GCOMP] = ((*P & 0x1c) << 3); \ D[BCOMP] = ((*P & 0x03) << 6); \ D[ACOMP] = 0xff#include "swrast/s_spantemp.h"/* ARGB1555 */#define NAME(PREFIX) PREFIX##_ARGB1555#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL(P, X, Y, S) \ *P = ( (((S[RCOMP]) & 0xf8) << 7) | (((S[GCOMP]) & 0xf8) << 2) | ((S[BCOMP]) >> 3) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0x7c00) >> 7); \ D[GCOMP] = ((*P & 0x03e0) >> 2); \ D[BCOMP] = ((*P & 0x001f) << 3); \ D[ACOMP] = ((*P & 0x8000) ? 0xff : 0)#include "swrast/s_spantemp.h"/* RGB16 */#define NAME(PREFIX) PREFIX##_RGB16#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLushort *P = (GLushort *) (data->video.end - (Y) * data->video.pitch + (X) * 2);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL(P, X, Y, S) \ *P = ( (((S[RCOMP]) & 0xf8) << 8) | (((S[GCOMP]) & 0xfc) << 3) | ((S[BCOMP]) >> 3) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0xf800) >> 8); \ D[GCOMP] = ((*P & 0x07e0) >> 3); \ D[BCOMP] = ((*P & 0x001f) << 3); \ D[ACOMP] = 0xff#include "swrast/s_spantemp.h"/* RGB24 */#define NAME(PREFIX) PREFIX##_RGB24#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLubyte *P = data->video.end - (Y) * data->video.pitch + (X) * 3;#define INC_PIXEL_PTR(P) P += 3#define STORE_PIXEL(P, X, Y, S) \ P[0] = S[BCOMP]; P[1] = S[GCOMP]; P[2] = S[BCOMP]#define FETCH_PIXEL(D, P) \ D[RCOMP] = P[2]; D[GCOMP] = P[1]; D[BCOMP] = P[0]; D[ACOMP] = 0xff#include "swrast/s_spantemp.h"/* RGB32 */#define NAME(PREFIX) PREFIX##_RGB32#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL(P, X, Y, S) \ *P = ( ((S[RCOMP]) << 16) | ((S[GCOMP]) << 8) | (S[BCOMP]) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0x00ff0000) >> 16); \ D[GCOMP] = ((*P & 0x0000ff00) >> 8); \ D[BCOMP] = ((*P & 0x000000ff) ); \ D[ACOMP] = 0xff#include "swrast/s_spantemp.h" /* ARGB */#define NAME(PREFIX) PREFIX##_ARGB#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL_RGB(P, X, Y, S) \ *P = ( 0xff000000 | ((S[RCOMP]) << 16) | ((S[GCOMP]) << 8) | (S[BCOMP]) )#define STORE_PIXEL(P, X, Y, S) \ *P = ( ((S[ACOMP]) << 24) | ((S[RCOMP]) << 16) | ((S[GCOMP]) << 8) | (S[BCOMP]) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0x00ff0000) >> 16); \ D[GCOMP] = ((*P & 0x0000ff00) >> 8); \ D[BCOMP] = ((*P & 0x000000ff) ); \ D[ACOMP] = ((*P & 0xff000000) >> 24)#include "swrast/s_spantemp.h"/* AiRGB */#define NAME(PREFIX) PREFIX##_AiRGB#define FORMAT GL_RGBA8#define SPAN_VARS \ IDirectFBGL_data *data = (IDirectFBGL_data*) ctx->DriverCtx;#define INIT_PIXEL_PTR(P, X, Y) \ GLuint *P = (GLuint*) (data->video.end - (Y) * data->video.pitch + (X) * 4);#define INC_PIXEL_PTR(P) P += 1#define STORE_PIXEL_RGB(P, X, Y, S) \ *P = ( ((S[RCOMP]) << 16) | ((S[GCOMP]) << 8) | (S[BCOMP]) )#define STORE_PIXEL(P, X, Y, S) \ *P = ( ((0xff - (S[ACOMP])) << 24) | ((S[RCOMP]) << 16) | ((S[GCOMP]) << 8) | (S[BCOMP]) )#define FETCH_PIXEL(D, P) \ D[RCOMP] = ((*P & 0x00ff0000) >> 16); \ D[GCOMP] = ((*P & 0x0000ff00) >> 8); \ D[BCOMP] = ((*P & 0x000000ff) ); \ D[ACOMP] = (0xff - ((*P & 0xff000000) >> 24))#include "swrast/s_spantemp.h"static booldfb_mesa_setup_visual( GLvisual *visual, DFBSurfacePixelFormat format ){ GLboolean rgbFlag = GL_TRUE; GLboolean dbFlag = GL_FALSE; GLboolean stereoFlag = GL_FALSE; GLint redBits = 0; GLint blueBits = 0; GLint greenBits = 0; GLint alphaBits = 0; GLint indexBits = 0; GLint depthBits = 0; GLint stencilBits = 0; GLint accumRedBits = 0; GLint accumGreenBits = 0; GLint accumBlueBits = 0; GLint accumAlphaBits = 0; GLint numSamples = 0; /* FIXME: LUT8 support. */ switch (format) { case DSPF_RGB332: redBits = 3; greenBits = 3; blueBits = 2; break; case DSPF_ARGB1555: redBits = 5; greenBits = 5; blueBits = 5; alphaBits = 1; break; case DSPF_RGB16: redBits = 5; greenBits = 6; blueBits = 5; break; case DSPF_ARGB: case DSPF_AiRGB: alphaBits = 8; case DSPF_RGB24: case DSPF_RGB32: redBits = 8; greenBits = 8; blueBits = 8; break; default: D_WARN( "unsupported pixelformat" ); return false; } if (rgbFlag) { accumRedBits = redBits; accumGreenBits = greenBits; accumBlueBits = blueBits; accumAlphaBits = alphaBits; depthBits = redBits + greenBits + blueBits; stencilBits = alphaBits; } else depthBits = 8; return _mesa_initialize_visual( visual, rgbFlag, dbFlag, stereoFlag, redBits, greenBits, blueBits, alphaBits, indexBits, depthBits, stencilBits, accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits, numSamples );}static booldfb_mesa_create_context( GLcontext *context, GLframebuffer *framebuffer, GLvisual *visual, DFBSurfacePixelFormat format, IDirectFBGL_data *data ){ struct dd_function_table functions; struct swrast_device_driver *swdd; _mesa_initialize_framebuffer( framebuffer, visual ); _mesa_init_driver_functions( &functions ); functions.GetString = get_string; functions.UpdateState = update_state; functions.GetBufferSize = get_buffer_size; functions.Viewport = set_viewport; if (!_mesa_initialize_context( context, visual, NULL, &functions, (void*) data )) { D_DEBUG( "DirectFBGL/Mesa: _mesa_initialize_context() failed.\n" ); _mesa_free_framebuffer_data( framebuffer ); return false; } _swrast_CreateContext( context ); _ac_CreateContext( context ); _tnl_CreateContext( context ); _swsetup_CreateContext( context ); _swsetup_Wakeup( context ); swdd = _swrast_GetDeviceDriverReference( context ); swdd->SetBuffer = set_buffer; _mesa_init_renderbuffer( &data->render, 0 ); data->render.InternalFormat = GL_RGBA; data->render._BaseFormat = GL_RGBA; data->render.DataType = GL_UNSIGNED_BYTE; data->render.Data = data->video.start; data->render.Delete = delete_renderbuffer; data->render.AllocStorage = renderbuffer_storage; switch (format) { case DSPF_RGB332: data->render.GetRow = get_row_RGB332; data->render.GetValues = get_values_RGB332; data->render.PutRow = put_row_RGB332; data->render.PutMonoRow = put_mono_row_RGB332; data->render.PutValues = put_values_RGB332; data->render.PutMonoValues = put_mono_values_RGB332; break; case DSPF_ARGB1555: data->render.GetRow = get_row_ARGB1555; data->render.GetValues = get_values_ARGB1555; data->render.PutRow = put_row_ARGB1555; data->render.PutMonoRow = put_mono_row_ARGB1555; data->render.PutValues = put_values_ARGB1555; data->render.PutMonoValues = put_mono_values_ARGB1555; break; case DSPF_RGB16: data->render.GetRow = get_row_RGB16; data->render.GetValues = get_values_RGB16; data->render.PutRow = put_row_RGB16; data->render.PutMonoRow = put_mono_row_RGB16; data->render.PutValues = put_values_RGB16; data->render.PutMonoValues = put_mono_values_RGB16; break; case DSPF_RGB24: data->render.GetRow = get_row_RGB24; data->render.GetValues = get_values_RGB24; data->render.PutRow = put_row_RGB24; data->render.PutMonoRow = put_mono_row_RGB24; data->render.PutValues = put_values_RGB24; data->render.PutMonoValues = put_mono_values_RGB24; break; case DSPF_RGB32: data->render.GetRow = get_row_RGB32; data->render.GetValues = get_values_RGB32; data->render.PutRow = put_row_RGB32; data->render.PutMonoRow = put_mono_row_RGB32; data->render.PutValues = put_values_RGB32; data->render.PutMonoValues = put_mono_values_RGB32; break; case DSPF_ARGB: data->render.GetRow = get_row_ARGB; data->render.GetValues = get_values_ARGB; data->render.PutRow = put_row_ARGB; data->render.PutMonoRow = put_mono_row_ARGB; data->render.PutValues = put_values_ARGB; data->render.PutMonoValues = put_mono_values_ARGB; break; case DSPF_AiRGB: data->render.GetRow = get_row_AiRGB; data->render.GetValues = get_values_AiRGB; data->render.PutRow = put_row_AiRGB; data->render.PutMonoRow = put_mono_row_AiRGB; data->render.PutValues = put_values_AiRGB; data->render.PutMonoValues = put_mono_values_AiRGB; break; default: D_BUG( "unexpected pixelformat" ); return false; } _mesa_add_renderbuffer( framebuffer, BUFFER_FRONT_LEFT, &data->render ); _mesa_add_soft_renderbuffers( framebuffer, GL_FALSE, visual->haveDepthBuffer, visual->haveStencilBuffer, visual->haveAccumBuffer, GL_FALSE, GL_FALSE ); TNL_CONTEXT( context )->Driver.RunPipeline = _tnl_run_pipeline; _mesa_enable_sw_extensions( context ); _mesa_make_current( context, framebuffer, framebuffer ); return true;}static voiddfb_mesa_destroy_context( GLcontext *context, GLframebuffer *framebuffer ){ _mesa_make_current( NULL, NULL, NULL ); _mesa_free_framebuffer_data( framebuffer ); _mesa_notifyDestroy( context ); _mesa_free_context_data( context );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -