static bool xdk_renderchain_render(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { unsigned i; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; renderchain_blit_to_texture(chain, frame, width, height, pitch); renderchain_set_vertices(d3d, 1, width, height); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewport(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, global->video_data.width, global->video_data.height, d3d->dev_rotation); return true; }
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 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; }
static void renderchain_set_vertices( cg_renderchain_t *chain, Pass *pass, unsigned width, unsigned height, unsigned out_width, unsigned out_height, unsigned vp_width, unsigned vp_height, unsigned rotation) { const LinkInfo *info = (const LinkInfo*)&pass->info; if (pass->last_width != width || pass->last_height != height) { Vertex vert[4]; unsigned i; void *verts = NULL; float _u = float(width) / info->tex_w; float _v = float(height) / info->tex_h; pass->last_width = width; pass->last_height = height; for (i = 0; i < 4; i++) { vert[i].z = 0.5f; vert[i].r = vert[i].g = vert[i].b = vert[i].a = 1.0f; } vert[0].x = 0.0f; vert[1].x = out_width; vert[2].x = 0.0f; vert[3].x = out_width; vert[0].y = out_height; vert[1].y = out_height; vert[2].y = 0.0f; vert[3].y = 0.0f; vert[0].u = 0.0f; vert[1].u = _u; vert[2].u = 0.0f; vert[3].u = _u; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = _v; vert[3].v = _v; vert[0].lut_u = 0.0f; vert[1].lut_u = 1.0f; vert[2].lut_u = 0.0f; vert[3].lut_u = 1.0f; vert[0].lut_v = 0.0f; vert[1].lut_v = 0.0f; vert[2].lut_v = 1.0f; vert[3].lut_v = 1.0f; /* Align texels and vertices. */ for (i = 0; i < 4; i++) { vert[i].x -= 0.5f; vert[i].y += 0.5f; } verts = d3d_vertex_buffer_lock(pass->vertex_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(pass->vertex_buf); } renderchain_set_mvp(chain, pass->vPrg, vp_width, vp_height, rotation); renderchain_set_shader_params(chain, pass, width, height, info->tex_w, info->tex_h, vp_width, vp_height); }
static void renderchain_set_vertices(void *data, unsigned pass, unsigned width, unsigned height) { d3d_video_t *d3d = (d3d_video_t*)data; runloop_t *runloop = rarch_main_get_ptr(); global_t *global = global_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; if (chain->last_width != width || chain->last_height != height) { unsigned i; Vertex vert[4]; void *verts = NULL; chain->last_width = width; chain->last_height = height; float tex_w = width; float tex_h = height; #ifdef _XBOX360 tex_w /= ((float)chain->tex_w); tex_h /= ((float)chain->tex_h); #endif vert[0].x = -1.0f; vert[1].x = 1.0f; vert[2].x = -1.0f; vert[3].x = 1.0f; vert[0].y = -1.0f; vert[1].y = -1.0f; vert[2].y = 1.0f; vert[3].y = 1.0f; #if defined(_XBOX1) vert[0].z = 1.0f; vert[1].z = 1.0f; vert[2].z = 1.0f; vert[3].z = 1.0f; vert[0].rhw = 0.0f; vert[1].rhw = tex_w; vert[2].rhw = 0.0f; vert[3].rhw = tex_w; vert[0].u = tex_h; vert[1].u = tex_h; vert[2].u = 0.0f; vert[3].u = 0.0f; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = 0.0f; vert[3].v = 0.0f; #elif defined(_XBOX360) vert[0].u = 0.0f; vert[1].u = tex_w; vert[2].u = 0.0f; vert[3].u = tex_w; vert[0].v = tex_h; vert[1].v = tex_h; vert[2].v = 0.0f; vert[3].v = 0.0f; #endif /* Align texels and vertices. */ for (i = 0; i < 4; i++) { vert[i].x -= 0.5f / ((float)chain->tex_w); vert[i].y += 0.5f / ((float)chain->tex_h); } verts = d3d_vertex_buffer_lock(chain->vertex_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(chain->vertex_buf); } #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #ifdef _XBOX if (d3d->shader) { renderchain_set_mvp(d3d, global->video_data.width, global->video_data.height, d3d->dev_rotation); if (d3d->shader->use) d3d->shader->use(d3d, pass); if (d3d->shader->set_params) d3d->shader->set_params(d3d, width, height, chain->tex_w, chain->tex_h, global->video_data.width, global->video_data.height, runloop->frames.video.count, NULL, NULL, NULL, 0); } #endif #endif }
static void renderchain_set_vertices(void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; xdk_renderchain_t *chain = d3d ? (xdk_renderchain_t*)d3d->renderchain_data : NULL; video_driver_get_size(&width, &height); if (!chain) return; if (chain->last_width != vert_width || chain->last_height != vert_height) { unsigned i; Vertex vert[4]; void *verts = NULL; chain->last_width = vert_width; chain->last_height = vert_height; float tex_w = vert_width; float tex_h = vert_height; #ifdef _XBOX360 tex_w /= ((float)chain->tex_w); tex_h /= ((float)chain->tex_h); #endif vert[0].x = -1.0f; vert[1].x = 1.0f; vert[2].x = -1.0f; vert[3].x = 1.0f; vert[0].y = -1.0f; vert[1].y = -1.0f; vert[2].y = 1.0f; vert[3].y = 1.0f; #if defined(_XBOX1) vert[0].z = 1.0f; vert[1].z = 1.0f; vert[2].z = 1.0f; vert[3].z = 1.0f; vert[0].rhw = 0.0f; vert[1].rhw = tex_w; vert[2].rhw = 0.0f; vert[3].rhw = tex_w; vert[0].u = tex_h; vert[1].u = tex_h; vert[2].u = 0.0f; vert[3].u = 0.0f; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = 0.0f; vert[3].v = 0.0f; #elif defined(_XBOX360) vert[0].u = 0.0f; vert[1].u = tex_w; vert[2].u = 0.0f; vert[3].u = tex_w; vert[0].v = tex_h; vert[1].v = tex_h; vert[2].v = 0.0f; vert[3].v = 0.0f; #endif /* Align texels and vertices. */ for (i = 0; i < 4; i++) { vert[i].x -= 0.5f / ((float)chain->tex_w); vert[i].y += 0.5f / ((float)chain->tex_h); } verts = d3d_vertex_buffer_lock(chain->vertex_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(chain->vertex_buf); } #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #ifdef _XBOX renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); video_shader_driver_use(d3d, pass); video_shader_driver_set_params( d3d, vert_width, vert_height, chain->tex_w, chain->tex_h, width, height, frame_count, NULL, NULL, NULL, NULL, 0); #endif #endif }
void renderchain_set_vertices(void *data, Pass &pass, unsigned width, unsigned height, unsigned out_width, unsigned out_height, unsigned vp_width, unsigned vp_height, unsigned rotation) { renderchain_t *chain = (renderchain_t*)data; const LinkInfo &info = pass.info; if (pass.last_width != width || pass.last_height != height) { pass.last_width = width; pass.last_height = height; float _u = static_cast<float>(width) / info.tex_w; float _v = static_cast<float>(height) / info.tex_h; Vertex vert[4]; for (unsigned i = 0; i < 4; i++) { vert[i].z = 0.5f; vert[i].r = vert[i].g = vert[i].b = vert[i].a = 1.0f; } vert[0].x = 0.0f; vert[1].x = out_width; vert[2].x = 0.0f; vert[3].x = out_width; vert[0].y = out_height; vert[1].y = out_height; vert[2].y = 0.0f; vert[3].y = 0.0f; vert[0].u = 0.0f; vert[1].u = _u; vert[2].u = 0.0f; vert[3].u = _u; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = _v; vert[3].v = _v; vert[0].lut_u = 0.0f; vert[1].lut_u = 1.0f; vert[2].lut_u = 0.0f; vert[3].lut_u = 1.0f; vert[0].lut_v = 0.0f; vert[1].lut_v = 0.0f; vert[2].lut_v = 1.0f; vert[3].lut_v = 1.0f; // Align texels and vertices. for (unsigned i = 0; i < 4; i++) { vert[i].x -= 0.5f; vert[i].y += 0.5f; } void *verts; pass.vertex_buf->Lock(0, sizeof(vert), &verts, 0); memcpy(verts, vert, sizeof(vert)); pass.vertex_buf->Unlock(); } renderchain_set_mvp(chain, pass.vPrg, vp_width, vp_height, rotation); renderchain_set_shader_params(chain, pass, width, height, info.tex_w, info.tex_h, vp_width, vp_height); }
bool renderchain_render(void *chain_data, const void *data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { renderchain_t *chain = (renderchain_t*)chain_data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)chain->dev; renderchain_start_render(chain); unsigned current_width = width; unsigned current_height = height; unsigned out_width = 0; unsigned out_height = 0; renderchain_convert_geometry(chain, &chain->passes[0].info, out_width, out_height, current_width, current_height, chain->final_viewport); #ifdef _XBOX1 d3dr->SetFlickerFilter(g_extern.console.screen.flicker_filter_index); d3dr->SetSoftDisplayFilter(g_extern.lifecycle_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE)); #endif renderchain_blit_to_texture(chain, data, width, height, pitch); // Grab back buffer. LPDIRECT3DSURFACE back_buffer; d3dr->GetRenderTarget(0, &back_buffer); // In-between render target passes. for (unsigned i = 0; i < chain->passes.size() - 1; i++) { Pass &from_pass = chain->passes[i]; Pass &to_pass = chain->passes[i + 1]; LPDIRECT3DSURFACE target; to_pass.tex->GetSurfaceLevel(0, &target); d3dr->SetRenderTarget(0, target); renderchain_convert_geometry(chain, &from_pass.info, out_width, out_height, current_width, current_height, chain->final_viewport); // Clear out whole FBO. D3DVIEWPORT viewport = {0}; viewport.Width = to_pass.info.tex_w; viewport.Height = to_pass.info.tex_h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; d3dr->SetViewport(&viewport); d3dr->Clear(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); Pass &last_pass = chain->passes.back(); 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, chain->fStock, chain->vStock); renderchain_set_mvp(chain, chain->vStock, chain->final_viewport->Width, chain->final_viewport->Height, 0); return true; }
static void renderchain_set_vertices( cg_renderchain_t *chain, Pass *pass, unsigned width, unsigned height, unsigned out_width, unsigned out_height, unsigned vp_width, unsigned vp_height, unsigned rotation) { const LinkInfo *info = (const LinkInfo*)&pass->info; if (pass->last_width != width || pass->last_height != height) { Vertex vert[4]; unsigned i; void *verts = NULL; float _u = float(width) / info->tex_w; float _v = float(height) / info->tex_h; pass->last_width = width; pass->last_height = height; vert[0].x = 0.0f; vert[0].y = out_height; vert[0].z = 0.5f; vert[0].u = 0.0f; vert[0].v = 0.0f; vert[0].lut_u = 0.0f; vert[0].lut_v = 0.0f; vert[0].r = 1.0f; vert[0].g = 1.0f; vert[0].b = 1.0f; vert[0].a = 1.0f; vert[1].x = out_width; vert[1].y = out_height; vert[1].z = 0.5f; vert[1].u = _u; vert[1].v = 0.0f; vert[1].lut_u = 1.0f; vert[1].lut_v = 0.0f; vert[1].r = 1.0f; vert[1].g = 1.0f; vert[1].b = 1.0f; vert[1].a = 1.0f; vert[2].x = 0.0f; vert[2].y = 0.0f; vert[2].z = 0.5f; vert[2].u = 0.0f; vert[2].v = _v; vert[2].lut_u = 0.0f; vert[2].lut_v = 1.0f; vert[2].r = 1.0f; vert[2].g = 1.0f; vert[2].b = 1.0f; vert[2].a = 1.0f; vert[3].x = out_width; vert[3].y = 0.0f; vert[3].z = 0.5f; vert[3].u = _u; vert[3].v = _v; vert[3].lut_u = 1.0f; vert[3].lut_v = 1.0f; vert[3].r = 1.0f; vert[3].g = 1.0f; vert[3].b = 1.0f; vert[3].a = 1.0f; /* Align texels and vertices. * * Fixes infamous 'half-texel offset' issue of D3D9 * http://msdn.microsoft.com/en-us/library/bb219690%28VS.85%29.aspx. */ for (i = 0; i < 4; i++) { vert[i].x -= 0.5f; vert[i].y += 0.5f; } verts = d3d_vertex_buffer_lock(pass->vertex_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(pass->vertex_buf); } renderchain_set_mvp(chain, pass->vPrg, vp_width, vp_height, rotation); renderchain_set_shader_params(chain, pass, width, height, info->tex_w, info->tex_h, vp_width, vp_height); }
static void renderchain_set_vertices(void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #ifdef _XBOX video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; #endif #endif unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; xdk_renderchain_t *chain = d3d ? (xdk_renderchain_t*)d3d->renderchain_data : NULL; video_driver_get_size(&width, &height); if (!chain) return; if (chain->last_width != vert_width || chain->last_height != vert_height) { unsigned i; Vertex vert[4]; void *verts = NULL; chain->last_width = vert_width; chain->last_height = vert_height; float tex_w = vert_width; float tex_h = vert_height; #ifdef _XBOX360 tex_w /= ((float)chain->tex_w); tex_h /= ((float)chain->tex_h); #endif vert[0].x = -1.0f; vert[1].x = 1.0f; vert[2].x = -1.0f; vert[3].x = 1.0f; vert[0].y = -1.0f; vert[1].y = -1.0f; vert[2].y = 1.0f; vert[3].y = 1.0f; #if defined(_XBOX1) vert[0].z = 1.0f; vert[1].z = 1.0f; vert[2].z = 1.0f; vert[3].z = 1.0f; vert[0].rhw = 0.0f; vert[1].rhw = tex_w; vert[2].rhw = 0.0f; vert[3].rhw = tex_w; vert[0].u = tex_h; vert[1].u = tex_h; vert[2].u = 0.0f; vert[3].u = 0.0f; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = 0.0f; vert[3].v = 0.0f; #elif defined(_XBOX360) vert[0].u = 0.0f; vert[1].u = tex_w; vert[2].u = 0.0f; vert[3].u = tex_w; vert[0].v = tex_h; vert[1].v = tex_h; vert[2].v = 0.0f; vert[3].v = 0.0f; #endif /* Align texels and vertices. */ for (i = 0; i < 4; i++) { vert[i].x -= 0.5f / ((float)chain->tex_w); vert[i].y += 0.5f / ((float)chain->tex_h); } verts = d3d_vertex_buffer_lock(chain->vertex_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(chain->vertex_buf); } #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #ifdef _XBOX renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); shader_info.data = d3d; shader_info.idx = pass; shader_info.set_active = true; video_shader_driver_use(shader_info); params.data = d3d; params.width = vert_width; params.height = vert_height; params.tex_width = chain->tex_w; params.tex_height = chain->tex_h; params.out_width = width; params.out_height = height; params.frame_counter = (unsigned int)frame_count; params.info = NULL; params.prev_info = NULL; params.feedback_info = NULL; params.fbo_info = NULL; params.fbo_info_cnt = 0; video_shader_driver_set_parameters(params); #endif #endif }