static void surface_init(glw_video_t *gv, glw_video_surface_t *gvs, const glw_video_config_t *gvc) { int i; int siz[3]; for(i = 0; i < 3; i++) siz[i] = ROUND_UP(gvc->gvc_width[i] * gvc->gvc_height[i], 16); gvs->gvs_size = siz[0] + siz[1] + siz[2]; gvs->gvs_offset = rsx_alloc(gvs->gvs_size, 16); gvs->gvs_data[0] = rsx_to_ppu(gvs->gvs_offset); gvs->gvs_data[1] = rsx_to_ppu(gvs->gvs_offset + siz[0]); gvs->gvs_data[2] = rsx_to_ppu(gvs->gvs_offset + siz[0] + siz[1]); int offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { init_tex(&gvs->gvs_tex[i], offset, gvc->gvc_width[i], gvc->gvc_height[i], gvc->gvc_width[i], NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += siz[i]; } TAILQ_INSERT_TAIL(&gv->gv_avail_queue, gvs, gvs_link); }
static void surface_init(glw_video_t *gv, glw_video_surface_t *gvs) { int i; int siz[3]; surface_reset(gv, gvs); for(i = 0; i < 3; i++) siz[i] = ROUND_UP(gvs->gvs_width[i] * gvs->gvs_height[i], 16); gvs->gvs_size = siz[0] + siz[1] + siz[2]; gvs->gvs_offset = rsx_alloc(gvs->gvs_size, 16); gvs->gvs_data[0] = rsx_to_ppu(gvs->gvs_offset); gvs->gvs_data[1] = rsx_to_ppu(gvs->gvs_offset + siz[0]); gvs->gvs_data[2] = rsx_to_ppu(gvs->gvs_offset + siz[0] + siz[1]); int offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { init_tex(&gvs->gvs_tex[i], offset, gvs->gvs_width[i], gvs->gvs_height[i], gvs->gvs_width[i], NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += siz[i]; } }
static void surface_init(glw_video_t *gv, glw_video_surface_t *gvs, const glw_video_config_t *gvc) { glw_root_t *gr = gv->w.glw_root; int i; for(i = 0; i < 3; i++) { gvs->gvs_size[i] = gvc->gvc_width[i] * gvc->gvc_height[i]; gvs->gvs_offset[i] = rsx_alloc(gr, gvs->gvs_size[i], 16); gvs->gvs_data[i] = rsx_to_ppu(gr, gvs->gvs_offset[i]); init_tex(&gvs->gvs_tex[i], gvs->gvs_offset[i], gvc->gvc_width[i], gvc->gvc_height[i], gvc->gvc_width[i], NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); } TAILQ_INSERT_TAIL(&gv->gv_avail_queue, gvs, gvs_link); }
cube *cube_create(void) { cube *C; if ((C = (cube *) malloc(sizeof (cube)))) { glGenBuffers (1, C->vbo); glGenBuffers (1, C->ebo); glGenTextures(6, C->tex); init_vbo(C); init_tex(C); } return C; }
void init_plugins () { install_status= 0; url old_settings= "$TEXMACS_HOME_PATH/system/TEX_PATHS"; url new_settings= "$TEXMACS_HOME_PATH/system/settings.scm"; string s; if (load_string (new_settings, s, false)) { if (load_string (old_settings, s, false)) { setup_texmacs (); install_status= 1; } else get_old_settings (s); } else texmacs_settings= block_to_scheme_tree (s); if (get_setting ("VERSION") != TEXMACS_VERSION) { init_upgrade (); url ch ("$TEXMACS_HOME_PATH/doc/about/changes/changes-recent.en.tm"); install_status= exists (ch)? 2: 0; } init_tex (); }
static void init( void ) { struct pipe_framebuffer_state fb; struct pipe_resource templat; struct pipe_surface surf_tmpl; int i; /* It's hard to say whether window or screen should be created * first. Different environments would prefer one or the other. * * Also, no easy way of querying supported formats if the screen * cannot be created first. */ for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) { screen = graw_create_window_and_screen(0, 0, 300, 300, formats[i], &window); if (window && screen) break; } if (!screen || !window) { fprintf(stderr, "Unable to create window\n"); exit(1); } ctx = screen->context_create(screen, NULL); if (ctx == NULL) exit(3); templat.target = PIPE_TEXTURE_2D; templat.format = formats[i]; templat.width0 = WIDTH; templat.height0 = HEIGHT; templat.depth0 = 1; templat.array_size = 1; templat.last_level = 0; templat.nr_samples = 1; templat.bind = (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET); rttex = screen->resource_create(screen, &templat); if (rttex == NULL) exit(4); surf_tmpl.format = templat.format; surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; surf_tmpl.u.tex.level = 0; surf_tmpl.u.tex.first_layer = 0; surf_tmpl.u.tex.last_layer = 0; surf = ctx->create_surface(ctx, rttex, &surf_tmpl); if (surf == NULL) exit(5); memset(&fb, 0, sizeof fb); fb.nr_cbufs = 1; fb.width = WIDTH; fb.height = HEIGHT; fb.cbufs[0] = surf; ctx->set_framebuffer_state(ctx, &fb); { struct pipe_blend_state blend; void *handle; memset(&blend, 0, sizeof blend); blend.rt[0].colormask = PIPE_MASK_RGBA; handle = ctx->create_blend_state(ctx, &blend); ctx->bind_blend_state(ctx, handle); } { struct pipe_depth_stencil_alpha_state depthstencil; void *handle; memset(&depthstencil, 0, sizeof depthstencil); handle = ctx->create_depth_stencil_alpha_state(ctx, &depthstencil); ctx->bind_depth_stencil_alpha_state(ctx, handle); } { struct pipe_rasterizer_state rasterizer; void *handle; memset(&rasterizer, 0, sizeof rasterizer); rasterizer.cull_face = PIPE_FACE_NONE; rasterizer.gl_rasterization_rules = 1; handle = ctx->create_rasterizer_state(ctx, &rasterizer); ctx->bind_rasterizer_state(ctx, handle); } set_viewport(0, 0, WIDTH, HEIGHT, 30, 1000); init_tex(); init_fs_constbuf(); set_vertices(); set_vertex_shader(); set_fragment_shader(filename); }
static int rsx_deliver(const frame_info_t *fi, glw_video_t *gv, glw_video_engine_t *gve) { int hvec[3], wvec[3]; int i; int hshift = 1, vshift = 1; glw_video_surface_t *gvs; wvec[0] = fi->fi_width; wvec[1] = fi->fi_width >> hshift; wvec[2] = fi->fi_width >> hshift; hvec[0] = fi->fi_height >> fi->fi_interlaced; hvec[1] = fi->fi_height >> (vshift + fi->fi_interlaced); hvec[2] = fi->fi_height >> (vshift + fi->fi_interlaced); glw_video_configure(gv, gve); gv_color_matrix_set(gv, fi); if((gvs = glw_video_get_surface(gv, NULL, NULL)) == NULL) return -1; surface_reset(gv, gvs); gvs->gvs_offset = fi->fi_pitch[0]; gvs->gvs_size = fi->fi_pitch[1]; gvs->gvs_width[0] = fi->fi_width; gvs->gvs_height[0] = fi->fi_height; int offset = gvs->gvs_offset; if(fi->fi_interlaced) { // Interlaced for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts, fi->fi_epoch, fi->fi_duration/2, 1, !fi->fi_tff); if((gvs = glw_video_get_surface(gv, NULL, NULL)) == NULL) return -1; surface_reset(gv, gvs); gvs->gvs_offset = fi->fi_pitch[0]; gvs->gvs_size = fi->fi_pitch[1]; gvs->gvs_width[0] = fi->fi_width; gvs->gvs_height[0] = fi->fi_height; offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !!fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts + fi->fi_duration, fi->fi_epoch, fi->fi_duration/2, 1, fi->fi_tff); } else { // Progressive for(i = 0; i < 3; i++) {
void OpenGLDisplay::init_context( void ) { int attributes[] = { GLX_RGBA, GLX_DOUBLEBUFFER, True, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, None }; XVisualInfo *visual = glXChooseVisual( state.display, 0, attributes ); if ( visual == NULL ) { fprintf( stderr, "Could not open glX visual.\n" ); throw DisplayError(); } state.context = glXCreateContext( state.display, visual, NULL, True ); if ( state.context == NULL ) { fprintf( stderr, "No glX context.\n" ); throw DisplayError(); } XFree( visual ); if ( !glXMakeCurrent( state.display, state.window, state.context ) ) { fprintf( stderr, "Could not reactivate OpenGL.\n" ); throw DisplayError(); } GLcheck( "glXMakeCurrent" ); /* initialize textures */ init_tex( GL_TEXTURE0, GL_LUMINANCE8, &state.Y_tex, state.framewidth, state.frameheight, GL_LINEAR ); init_tex( GL_TEXTURE1, GL_LUMINANCE8, &state.Cb_tex, state.framewidth/2, state.frameheight/2, GL_LINEAR ); init_tex( GL_TEXTURE2, GL_LUMINANCE8, &state.Cr_tex, state.framewidth/2, state.frameheight/2, GL_LINEAR ); /* load the shader */ GLint errorloc; glEnable( GL_FRAGMENT_PROGRAM_ARB ); glGenProgramsARB( 1, &shader ); glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shader ); glProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen( ahab_fragment_program ), ahab_fragment_program ); glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errorloc ); if ( errorloc != -1 ) { fprintf( stderr, "Error in fragment shader at position %d.\n", errorloc ); fprintf( stderr, "Error string: %s\n", glGetString( GL_PROGRAM_ERROR_STRING_ARB ) ); throw DisplayError(); } GLcheck( "glProgramString" ); /* guess colors */ if ( state.frameheight <= 480 ) { smpte170m.execute( state ); } else { itu709.execute( state ); } }
void glw_video_input_rsx_mem(glw_video_t *gv, void *frame, const frame_info_t *fi) { rsx_video_frame_t *rvf = frame; int hvec[3], wvec[3]; int i; int hshift, vshift; glw_video_surface_t *gvs; avcodec_get_chroma_sub_sample(fi->fi_pix_fmt, &hshift, &vshift); wvec[0] = fi->fi_width; wvec[1] = fi->fi_width >> hshift; wvec[2] = fi->fi_width >> hshift; hvec[0] = fi->fi_height >> fi->fi_interlaced; hvec[1] = fi->fi_height >> (vshift + fi->fi_interlaced); hvec[2] = fi->fi_height >> (vshift + fi->fi_interlaced); if(glw_video_configure(gv, &glw_video_rsxmem, wvec, hvec, 3, fi->fi_interlaced ? (GVC_YHALF | GVC_CUTBORDER) : 0)) return; gv_color_matrix_set(gv, fi); if((gvs = glw_video_get_surface(gv)) == NULL) return; surface_reset(gv, gvs); gvs->gvs_size = rvf->rvf_size; gvs->gvs_offset = rvf->rvf_offset; int offset = gvs->gvs_offset; if(fi->fi_interlaced) { // Interlaced for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts, fi->fi_epoch, fi->fi_duration/2, 0); if((gvs = glw_video_get_surface(gv)) == NULL) return; surface_reset(gv, gvs); gvs->gvs_size = rvf->rvf_size; gvs->gvs_offset = rvf->rvf_offset; offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !!fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts + fi->fi_duration, fi->fi_epoch, fi->fi_duration/2, 0); } else { // Progressive for(i = 0; i < 3; i++) {