📄 brw_metaops.c
字号:
brw->metaops.attribs.Texture->Unit[ 0 ]._ReallyEnabled = 0; brw->state.dirty.mesa |= _NEW_TEXTURE | _NEW_PROGRAM;}static void meta_texture_blend_replace(struct intel_context *intel){ struct brw_context *brw = brw_context(&intel->ctx); brw->metaops.attribs.Texture->CurrentUnit = 0; brw->metaops.attribs.Texture->_EnabledUnits = 1; brw->metaops.attribs.Texture->_EnabledCoordUnits = 1; brw->metaops.attribs.Texture->Unit[ 0 ].Enabled = TEXTURE_2D_BIT; brw->metaops.attribs.Texture->Unit[ 0 ]._ReallyEnabled = TEXTURE_2D_BIT; brw->metaops.attribs.Texture->Unit[ 0 ].Current2D = intel->frame_buffer_texobj; brw->metaops.attribs.Texture->Unit[ 0 ]._Current = intel->frame_buffer_texobj; brw->state.dirty.mesa |= _NEW_TEXTURE | _NEW_PROGRAM;}static void meta_import_pixel_state(struct intel_context *intel){ struct brw_context *brw = brw_context(&intel->ctx); RESTORE(brw, Color, _NEW_COLOR); RESTORE(brw, Depth, _NEW_DEPTH); RESTORE(brw, Fog, _NEW_FOG); RESTORE(brw, Scissor, _NEW_SCISSOR); RESTORE(brw, Stencil, _NEW_STENCIL); RESTORE(brw, Texture, _NEW_TEXTURE); RESTORE(brw, FragmentProgram, _NEW_PROGRAM);}static void meta_frame_buffer_texture( struct intel_context *intel, GLint xoff, GLint yoff ){ struct brw_context *brw = brw_context(&intel->ctx); struct intel_region *region = intel_drawbuf_region( intel ); INSTALL(brw, FragmentProgram, _NEW_PROGRAM); brw->metaops.attribs.FragmentProgram->_Current = brw->metaops.fp_tex; /* This is unfortunate, but seems to be necessary, since later on we will end up calling _mesa_load_state_parameters to lookup the local params (below), and that will want to look in ctx.FragmentProgram instead of brw->attribs.FragmentProgram. */ intel->ctx.FragmentProgram.Current = brw->metaops.fp_tex; brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 0 ] = xoff; brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 1 ] = yoff; brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 2 ] = 0.0; brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 3 ] = 0.0; brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 0 ] = 1.0 / region->pitch; brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 1 ] = -1.0 / region->height; brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 2 ] = 0.0; brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 3 ] = 1.0; brw->state.dirty.mesa |= _NEW_PROGRAM;}static void meta_draw_region( struct intel_context *intel, struct intel_region *draw_region, struct intel_region *depth_region ){ struct brw_context *brw = brw_context(&intel->ctx); if (!brw->metaops.saved_draw_region) { brw->metaops.saved_draw_region = brw->state.draw_regions[0]; brw->metaops.saved_nr_draw_regions = brw->state.nr_draw_regions; brw->metaops.saved_depth_region = brw->state.depth_region; } brw->state.draw_regions[0] = draw_region; brw->state.nr_draw_regions = 1; brw->state.depth_region = depth_region; if (intel->frame_buffer_texobj != NULL) brw_FrameBufferTexDestroy(brw); if (draw_region) brw_FrameBufferTexInit(brw, draw_region); brw->state.dirty.mesa |= _NEW_BUFFERS;}static void meta_draw_quad(struct intel_context *intel, GLfloat x0, GLfloat x1, GLfloat y0, GLfloat y1, GLfloat z, GLuint color, GLfloat s0, GLfloat s1, GLfloat t0, GLfloat t1){ GLcontext *ctx = &intel->ctx; struct brw_context *brw = brw_context(&intel->ctx); struct gl_client_array pos_array; struct gl_client_array color_array; struct gl_client_array *attribs[VERT_ATTRIB_MAX]; struct _mesa_prim prim[1]; GLfloat pos[4][3]; ctx->Driver.BufferData(ctx, GL_ARRAY_BUFFER_ARB, sizeof(pos) + sizeof(color), NULL, GL_DYNAMIC_DRAW_ARB, brw->metaops.vbo); pos[0][0] = x0; pos[0][1] = y0; pos[0][2] = z; pos[1][0] = x1; pos[1][1] = y0; pos[1][2] = z; pos[2][0] = x1; pos[2][1] = y1; pos[2][2] = z; pos[3][0] = x0; pos[3][1] = y1; pos[3][2] = z; ctx->Driver.BufferSubData(ctx, GL_ARRAY_BUFFER_ARB, 0, sizeof(pos), pos, brw->metaops.vbo); /* Convert incoming ARGB to required RGBA */ /* Note this color is stored as GL_UNSIGNED_BYTE */ color = (color & 0xff00ff00) | (((color >> 16) | (color << 16)) & 0xff00ff); ctx->Driver.BufferSubData(ctx, GL_ARRAY_BUFFER_ARB, sizeof(pos), sizeof(color), &color, brw->metaops.vbo); /* Ignoring texture coords. */ memset(attribs, 0, VERT_ATTRIB_MAX * sizeof(*attribs)); attribs[VERT_ATTRIB_POS] = &pos_array; attribs[VERT_ATTRIB_POS]->Ptr = 0; attribs[VERT_ATTRIB_POS]->Type = GL_FLOAT; attribs[VERT_ATTRIB_POS]->Enabled = 1; attribs[VERT_ATTRIB_POS]->Size = 3; attribs[VERT_ATTRIB_POS]->StrideB = 3 * sizeof(GLfloat); attribs[VERT_ATTRIB_POS]->Stride = 3 * sizeof(GLfloat); attribs[VERT_ATTRIB_POS]->_MaxElement = 4; attribs[VERT_ATTRIB_POS]->Normalized = 0; attribs[VERT_ATTRIB_POS]->BufferObj = brw->metaops.vbo; attribs[VERT_ATTRIB_COLOR0] = &color_array; attribs[VERT_ATTRIB_COLOR0]->Ptr = (const GLubyte *)sizeof(pos); attribs[VERT_ATTRIB_COLOR0]->Type = GL_UNSIGNED_BYTE; attribs[VERT_ATTRIB_COLOR0]->Enabled = 1; attribs[VERT_ATTRIB_COLOR0]->Size = 4; attribs[VERT_ATTRIB_COLOR0]->StrideB = 0; attribs[VERT_ATTRIB_COLOR0]->Stride = 0; attribs[VERT_ATTRIB_COLOR0]->_MaxElement = 1; attribs[VERT_ATTRIB_COLOR0]->Normalized = 1; attribs[VERT_ATTRIB_COLOR0]->BufferObj = brw->metaops.vbo; /* Just ignoring texture coordinates for now. */ memset(prim, 0, sizeof(*prim)); prim[0].mode = GL_TRIANGLE_FAN; prim[0].begin = 1; prim[0].end = 1; prim[0].weak = 0; prim[0].pad = 0; prim[0].start = 0; prim[0].count = 4; brw_draw_prims(&brw->intel.ctx, (const struct gl_client_array **)attribs, prim, 1, NULL, 0, 3 );}static void install_meta_state( struct intel_context *intel ){ GLcontext *ctx = &intel->ctx; struct brw_context *brw = brw_context(ctx); GLuint i; if (!brw->metaops.vbo) { init_metaops_state(brw); } install_attribs(brw); meta_no_texture(&brw->intel); meta_flat_shade(&brw->intel); for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) { brw->metaops.restore_draw_buffers[i] = ctx->DrawBuffer->_ColorDrawBufferIndexes[i]; } brw->metaops.restore_num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers; brw->metaops.restore_fp = ctx->FragmentProgram.Current; /* This works without adjusting refcounts. Fix later? */ brw->metaops.saved_draw_region = brw->state.draw_regions[0]; brw->metaops.saved_nr_draw_regions = brw->state.nr_draw_regions; brw->metaops.saved_depth_region = brw->state.depth_region; brw->metaops.active = 1; brw->state.dirty.brw |= BRW_NEW_METAOPS;}static void leave_meta_state( struct intel_context *intel ){ GLcontext *ctx = &intel->ctx; struct brw_context *brw = brw_context(ctx); GLuint i; restore_attribs(brw); for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) { ctx->DrawBuffer->_ColorDrawBufferIndexes[i] = brw->metaops.restore_draw_buffers[i]; } ctx->DrawBuffer->_NumColorDrawBuffers = brw->metaops.restore_num_draw_buffers; ctx->FragmentProgram.Current = brw->metaops.restore_fp; brw->state.draw_regions[0] = brw->metaops.saved_draw_region; brw->state.nr_draw_regions = brw->metaops.saved_nr_draw_regions; brw->state.depth_region = brw->metaops.saved_depth_region; brw->metaops.saved_draw_region = NULL; brw->metaops.saved_depth_region = NULL; brw->metaops.active = 0; brw->state.dirty.mesa |= _NEW_BUFFERS; brw->state.dirty.brw |= BRW_NEW_METAOPS;}void brw_init_metaops( struct brw_context *brw ){ init_attribs(brw); brw->intel.vtbl.install_meta_state = install_meta_state; brw->intel.vtbl.leave_meta_state = leave_meta_state; brw->intel.vtbl.meta_no_depth_write = meta_no_depth_write; brw->intel.vtbl.meta_no_stencil_write = meta_no_stencil_write; brw->intel.vtbl.meta_stencil_replace = meta_stencil_replace; brw->intel.vtbl.meta_depth_replace = meta_depth_replace; brw->intel.vtbl.meta_color_mask = meta_color_mask; brw->intel.vtbl.meta_no_texture = meta_no_texture; brw->intel.vtbl.meta_import_pixel_state = meta_import_pixel_state; brw->intel.vtbl.meta_frame_buffer_texture = meta_frame_buffer_texture; brw->intel.vtbl.meta_draw_region = meta_draw_region; brw->intel.vtbl.meta_draw_quad = meta_draw_quad; brw->intel.vtbl.meta_texture_blend_replace = meta_texture_blend_replace;/* brw->intel.vtbl.meta_tex_rect_source = meta_tex_rect_source; *//* brw->intel.vtbl.meta_draw_format = set_draw_format; */}void brw_destroy_metaops( struct brw_context *brw ){ GLcontext *ctx = &brw->intel.ctx; if (brw->metaops.vbo) ctx->Driver.DeleteBuffer( ctx, brw->metaops.vbo );/* ctx->Driver.DeleteProgram( ctx, brw->metaops.fp ); *//* ctx->Driver.DeleteProgram( ctx, brw->metaops.fp_tex ); *//* ctx->Driver.DeleteProgram( ctx, brw->metaops.vp ); */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -