static void menu_display_d3d_draw(void *data) { #if 0 math_matrix_4x4 *mat = NULL; #endif 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; if (!draw->coords->vertex) draw->coords->vertex = menu_display_d3d_get_default_vertices(); if (!draw->coords->tex_coord) draw->coords->tex_coord = menu_display_d3d_get_default_tex_coords(); if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = menu_display_d3d_get_default_tex_coords(); menu_display_d3d_viewport(draw); menu_display_d3d_bind_texture(draw); #if 0 mat = (math_matrix_4x4*)draw->matrix_data; if (!mat) mat = (math_matrix_4x4*) menu_display_d3d_get_default_mvp(); 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); }
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_gl_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 ) { gl_t *gl = gl_get_ptr(); math_matrix_4x4 *mat = (math_matrix_4x4*)matrix_data; if (!gl) return; /* TODO - edge case */ if (height <= 0) height = 1; if (!mat) mat = (math_matrix_4x4*)menu_display_gl_get_default_mvp(); if (!coords->vertex) coords->vertex = &gl_vertexes[0]; if (!coords->tex_coord) coords->tex_coord = &gl_tex_coords[0]; if (!coords->lut_tex_coord) coords->lut_tex_coord = &gl_tex_coords[0]; glViewport(x, y, width, height); glBindTexture(GL_TEXTURE_2D, (GLuint)texture); video_shader_driver_set_coords(gl, coords); video_shader_driver_set_mvp(gl, mat); glDrawArrays(menu_display_prim_to_gl_enum(prim_type), 0, coords->vertices); gl->coords.color = gl->white_color_ptr; }
static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t *coords) { video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords_data; if (font->atlas->dirty) { gl_raster_font_upload_atlas(font); font->atlas->dirty = false; } coords_data.handle_data = NULL; coords_data.data = coords; video_shader_driver_set_coords(coords_data); mvp.data = font->gl; mvp.matrix = &font->gl->mvp_no_rot; video_shader_driver_set_mvp(mvp); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); }
static void menu_display_gl_draw(void *data) { video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; gl_t *gl = (gl_t*)video_driver_get_ptr(false); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; if (!gl || !draw) return; if (!draw->coords->vertex) draw->coords->vertex = menu_display_gl_get_default_vertices(); if (!draw->coords->tex_coord) draw->coords->tex_coord = menu_display_gl_get_default_tex_coords(); if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = menu_display_gl_get_default_tex_coords(); menu_display_gl_viewport(draw); menu_display_gl_bind_texture(draw); coords.handle_data = gl; coords.data = draw->coords; video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data : (math_matrix_4x4*)menu_display_gl_get_default_mvp(); video_shader_driver_set_mvp(&mvp); glDrawArrays(menu_display_prim_to_gl_enum( draw->prim_type), 0, draw->coords->vertices); gl->coords.color = gl->white_color_ptr; }
void gl_renderchain_render(gl_t *gl, uint64_t frame_count, const struct video_tex_info *tex_info, const struct video_tex_info *feedback_info) { unsigned mip_level; video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; unsigned width, height; const struct video_fbo_rect *prev_rect; struct video_tex_info *fbo_info; struct video_tex_info fbo_tex_info[GFX_MAX_SHADERS]; int i; GLfloat xamt, yamt; unsigned fbo_tex_info_cnt = 0; GLfloat fbo_tex_coords[8] = {0.0f}; video_driver_get_size(&width, &height); /* Render the rest of our passes. */ gl->coords.tex_coord = fbo_tex_coords; /* Calculate viewports, texture coordinates etc, * and render all passes from FBOs, to another FBO. */ for (i = 1; i < gl->fbo_pass; i++) { video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; const struct video_fbo_rect *rect = &gl->fbo_rect[i]; prev_rect = &gl->fbo_rect[i - 1]; fbo_info = &fbo_tex_info[i - 1]; xamt = (GLfloat)prev_rect->img_width / prev_rect->width; yamt = (GLfloat)prev_rect->img_height / prev_rect->height; set_texture_coords(fbo_tex_coords, xamt, yamt); fbo_info->tex = gl->fbo_texture[i - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; fbo_info->tex_size[1] = prev_rect->height; memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords)); fbo_tex_info_cnt++; glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]); shader_info.data = gl; shader_info.idx = i + 1; shader_info.set_active = true; video_shader_driver_use(&shader_info); glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]); mip_level = i + 1; if (video_shader_driver_mipmap_input(&mip_level) && gl_check_capability(GL_CAPS_MIPMAP)) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); /* Render to FBO with certain size. */ gl_set_viewport(gl, rect->img_width, rect->img_height, true, false); params.data = gl; params.width = prev_rect->img_width; params.height = prev_rect->img_height; params.tex_width = prev_rect->width; params.tex_height = prev_rect->height; params.out_width = gl->vp.width; params.out_height = gl->vp.height; params.frame_counter = (unsigned int)frame_count; params.info = tex_info; params.prev_info = gl->prev_info; params.feedback_info = feedback_info; params.fbo_info = fbo_tex_info; params.fbo_info_cnt = fbo_tex_info_cnt; video_shader_driver_set_parameters(¶ms); gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp; video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) if (gl->has_srgb_fbo) glDisable(GL_FRAMEBUFFER_SRGB); #endif /* Render our last FBO texture directly to screen. */ prev_rect = &gl->fbo_rect[gl->fbo_pass - 1]; xamt = (GLfloat)prev_rect->img_width / prev_rect->width; yamt = (GLfloat)prev_rect->img_height / prev_rect->height; set_texture_coords(fbo_tex_coords, xamt, yamt); /* Push final FBO to list. */ fbo_info = &fbo_tex_info[gl->fbo_pass - 1]; fbo_info->tex = gl->fbo_texture[gl->fbo_pass - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; fbo_info->tex_size[1] = prev_rect->height; memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords)); fbo_tex_info_cnt++; /* Render our FBO texture to back buffer. */ gl_bind_backbuffer(); shader_info.data = gl; shader_info.idx = gl->fbo_pass + 1; shader_info.set_active = true; video_shader_driver_use(&shader_info); glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[gl->fbo_pass - 1]); mip_level = gl->fbo_pass + 1; if (video_shader_driver_mipmap_input(&mip_level) && gl_check_capability(GL_CAPS_MIPMAP)) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); gl_set_viewport(gl, width, height, false, true); params.data = gl; params.width = prev_rect->img_width; params.height = prev_rect->img_height; params.tex_width = prev_rect->width; params.tex_height = prev_rect->height; params.out_width = gl->vp.width; params.out_height = gl->vp.height; params.frame_counter = (unsigned int)frame_count; params.info = tex_info; params.prev_info = gl->prev_info; params.feedback_info = feedback_info; params.fbo_info = fbo_tex_info; params.fbo_info_cnt = fbo_tex_info_cnt; video_shader_driver_set_parameters(¶ms); gl->coords.vertex = gl->vertex_ptr; gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp; video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); gl->coords.tex_coord = gl->tex_info.coord; }