static bool xdk_renderchain_render(void *data, const void *frame, unsigned frame_width, unsigned frame_height, unsigned pitch, unsigned rotation) { unsigned i; unsigned width, height; uint64_t *frame_count = NULL; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; settings_t *settings = config_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); video_driver_get_size(&width, &height); renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); renderchain_set_vertices(d3d, 1, frame_width, frame_height, *frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); d3d_set_sampler_minfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_sampler_magfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_vertex_declaration(d3dr, chain->vertex_decl); for (i = 0; i < 4; i++) d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); return true; }
static void renderchain_set_viewport(void *data, void *viewport_data) { D3DVIEWPORT *vp = (D3DVIEWPORT*)viewport_data; cg_renderchain_t *chain = (cg_renderchain_t*)data; if (!chain) return; d3d_set_viewports(chain->dev, vp); }
static void menu_display_d3d_draw(void *data) { D3DVIEWPORT vp = {0}; math_matrix_4x4 *mat = NULL; d3d_video_t *d3d = d3d_get_ptr(); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; if (!d3d || !draw) return; mat = (math_matrix_4x4*)draw->matrix_data; /* TODO - edge case */ if (draw->height <= 0) draw->height = 1; if (!mat) mat = (math_matrix_4x4*) menu_display_d3d_get_default_mvp(); if (!draw->coords->vertex) draw->coords->vertex = &d3d_vertexes[0]; if (!draw->coords->tex_coord) draw->coords->tex_coord = &d3d_tex_coords[0]; if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = &d3d_tex_coords[0]; vp.X = draw->x; vp.Y = draw->y; vp.Width = draw->width; vp.Height = draw->height; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; d3d_set_viewports(d3d->dev, &vp); d3d_set_texture(d3d->dev, 0, (LPDIRECT3DTEXTURE)draw->texture); #if 0 video_shader_driver_set_coords(d3d, draw->coords); video_shader_driver_set_mvp(d3d, mat); #endif d3d_draw_primitive(d3d->dev, (D3DPRIMITIVETYPE) menu_display_prim_to_d3d_enum(draw->prim_type), 0, draw->coords->vertices); #if 0 gl->coords.color = gl->white_color_ptr; #endif }
static void menu_display_d3d_draw( float x, float y, unsigned width, unsigned height, struct gfx_coords *coords, void *matrix_data, uintptr_t texture, enum menu_display_prim_type prim_type ) { D3DVIEWPORT vp = {0}; d3d_video_t *d3d = d3d_get_ptr(); math_matrix_4x4 *mat = (math_matrix_4x4*)matrix_data; if (!d3d) return; /* TODO - edge case */ if (height <= 0) height = 1; if (!mat) mat = (math_matrix_4x4*)menu_display_d3d_get_default_mvp(); if (!coords->vertex) coords->vertex = &d3d_vertexes[0]; if (!coords->tex_coord) coords->tex_coord = &d3d_tex_coords[0]; if (!coords->lut_tex_coord) coords->lut_tex_coord = &d3d_tex_coords[0]; vp.X = x; vp.Y = y; vp.Width = width; vp.Height = height; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; d3d_set_viewports(d3d->dev, &vp); d3d_set_texture(d3d->dev, 0, (LPDIRECT3DTEXTURE)texture); d3d_draw_primitive(d3d->dev, (D3DPRIMITIVETYPE)menu_display_prim_to_d3d_enum(prim_type), 0, coords->vertices); #if 0 gl->coords.color = gl->white_color_ptr; #endif }
static void menu_display_d3d_viewport(void *data) { D3DVIEWPORT vp = {0}; d3d_video_t *d3d = (d3d_video_t*)video_driver_get_ptr(false); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; if (!d3d || !draw) return; vp.X = draw->x; vp.Y = draw->y; vp.Width = draw->width; vp.Height = draw->height; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; d3d_set_viewports(d3d->dev, &vp); }
static void d3d_overlay_render(d3d_video_t *d3d, overlay_t *overlay) { struct video_viewport vp; unsigned width, height; void *verts; unsigned i; float vert[4][9]; float overlay_width, overlay_height; #ifndef _XBOX1 LPDIRECT3DVERTEXDECLARATION vertex_decl; /* set vertex declaration for overlay. */ D3DVERTEXELEMENT vElems[4] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, {0, 20, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, D3DDECL_END() }; #endif if (!d3d) return; if (!overlay || !overlay->tex) return; if (!overlay->vert_buf) { overlay->vert_buf = d3d_vertex_buffer_new( d3d->dev, sizeof(vert), 0, 0, D3DPOOL_MANAGED, NULL); if (!overlay->vert_buf) return; } for (i = 0; i < 4; i++) { vert[i][2] = 0.5f; vert[i][5] = 1.0f; vert[i][6] = 1.0f; vert[i][7] = 1.0f; vert[i][8] = overlay->alpha_mod; } d3d_viewport_info(d3d, &vp); overlay_width = vp.width; overlay_height = vp.height; vert[0][0] = overlay->vert_coords[0] * overlay_width; vert[1][0] = (overlay->vert_coords[0] + overlay->vert_coords[2]) * overlay_width; vert[2][0] = overlay->vert_coords[0] * overlay_width; vert[3][0] = (overlay->vert_coords[0] + overlay->vert_coords[2]) * overlay_width; vert[0][1] = overlay->vert_coords[1] * overlay_height; vert[1][1] = overlay->vert_coords[1] * overlay_height; vert[2][1] = (overlay->vert_coords[1] + overlay->vert_coords[3]) * overlay_height; vert[3][1] = (overlay->vert_coords[1] + overlay->vert_coords[3]) * overlay_height; vert[0][3] = overlay->tex_coords[0]; vert[1][3] = overlay->tex_coords[0] + overlay->tex_coords[2]; vert[2][3] = overlay->tex_coords[0]; vert[3][3] = overlay->tex_coords[0] + overlay->tex_coords[2]; vert[0][4] = overlay->tex_coords[1]; vert[1][4] = overlay->tex_coords[1]; vert[2][4] = overlay->tex_coords[1] + overlay->tex_coords[3]; vert[3][4] = overlay->tex_coords[1] + overlay->tex_coords[3]; /* Align texels and vertices. */ for (i = 0; i < 4; i++) { vert[i][0] -= 0.5f; vert[i][1] += 0.5f; } overlay->vert_buf->Lock(0, sizeof(vert), &verts, 0); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(overlay->vert_buf); d3d_enable_blend_func(d3d->dev); #ifndef _XBOX1 d3d->dev->CreateVertexDeclaration(vElems, &vertex_decl); d3d_set_vertex_declaration(d3d->dev, vertex_decl); vertex_decl->Release(); #endif d3d_set_stream_source(d3d->dev, 0, overlay->vert_buf, 0, sizeof(*vert)); video_driver_get_size(&width, &height); if (overlay->fullscreen) { D3DVIEWPORT vp_full; vp_full.X = 0; vp_full.Y = 0; vp_full.Width = width; vp_full.Height = height; vp_full.MinZ = 0.0f; vp_full.MaxZ = 1.0f; d3d_set_viewports(d3d->dev, &vp_full); } /* Render overlay. */ d3d_set_texture(d3d->dev, 0, overlay->tex); d3d_set_sampler_address_u(d3d->dev, 0, D3DTADDRESS_BORDER); d3d_set_sampler_address_v(d3d->dev, 0, D3DTADDRESS_BORDER); d3d_set_sampler_minfilter(d3d->dev, 0, D3DTEXF_LINEAR); d3d_set_sampler_magfilter(d3d->dev, 0, D3DTEXF_LINEAR); d3d_draw_primitive(d3d->dev, D3DPT_TRIANGLESTRIP, 0, 2); /* Restore previous state. */ d3d_disable_blend_func(d3d->dev); d3d_set_viewports(d3d->dev, &d3d->final_viewport); }
static bool cg_d3d9_renderchain_render( void *data, const void *frame_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { Pass *last_pass; LPDIRECT3DDEVICE d3dr; LPDIRECT3DSURFACE back_buffer, target; unsigned i, current_width, current_height, out_width = 0, out_height = 0; d3d_video_t *d3d = (d3d_video_t*)data; cg_renderchain_t *chain = d3d ? (cg_renderchain_t*)d3d->renderchain_data : NULL; if (chain) d3dr = (LPDIRECT3DDEVICE)chain->dev; renderchain_start_render(chain); current_width = width; current_height = height; cg_d3d9_renderchain_convert_geometry(chain, &chain->passes[0].info, &out_width, &out_height, current_width, current_height, chain->final_viewport); renderchain_blit_to_texture(chain, frame_data, width, height, pitch); /* Grab back buffer. */ d3dr->GetRenderTarget(0, &back_buffer); /* In-between render target passes. */ for (i = 0; i < chain->passes.size() - 1; i++) { D3DVIEWPORT viewport = {0}; Pass *from_pass = (Pass*)&chain->passes[i]; Pass *to_pass = (Pass*)&chain->passes[i + 1]; to_pass->tex->GetSurfaceLevel(0, &target); d3dr->SetRenderTarget(0, target); cg_d3d9_renderchain_convert_geometry(chain, &from_pass->info, &out_width, &out_height, current_width, current_height, chain->final_viewport); /* Clear out whole FBO. */ viewport.Width = to_pass->info.tex_w; viewport.Height = to_pass->info.tex_h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; d3d_set_viewports(d3dr, &viewport); d3d_clear(d3dr, 0, 0, D3DCLEAR_TARGET, 0, 1, 0); viewport.Width = out_width; viewport.Height = out_height; renderchain_set_viewport(chain, &viewport); renderchain_set_vertices(chain, from_pass, current_width, current_height, out_width, out_height, out_width, out_height, 0); renderchain_render_pass(chain, from_pass, i + 1); current_width = out_width; current_height = out_height; target->Release(); } /* Final pass */ d3dr->SetRenderTarget(0, back_buffer); last_pass = (Pass*)&chain->passes.back(); cg_d3d9_renderchain_convert_geometry(chain, &last_pass->info, &out_width, &out_height, current_width, current_height, chain->final_viewport); renderchain_set_viewport(chain, chain->final_viewport); renderchain_set_vertices(chain, last_pass, current_width, current_height, out_width, out_height, chain->final_viewport->Width, chain->final_viewport->Height, rotation); renderchain_render_pass(chain, last_pass, chain->passes.size()); chain->frame_count++; back_buffer->Release(); renderchain_end_render(chain); renderchain_set_shaders(chain->fStock, chain->vStock); renderchain_set_mvp(chain, chain->vStock, chain->final_viewport->Width, chain->final_viewport->Height, 0); return true; }