static void menu_display_gl_draw_pipeline(void *data) { #ifdef HAVE_SHADERPIPELINE menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; video_coord_array_t *ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = (struct video_coords*)(&ca->coords); draw->matrix_data = NULL; switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: { static float t = 0; video_shader_ctx_info_t shader_info; struct uniform_info uniform_param; shader_info.data = NULL; shader_info.idx = draw->pipeline.id; shader_info.set_active = true; video_shader_driver_use(shader_info); t += 0.01; uniform_param.type = UNIFORM_1F; uniform_param.enabled = true; uniform_param.location = 0; uniform_param.count = 0; uniform_param.lookup.type = SHADER_PROGRAM_VERTEX; uniform_param.lookup.ident = "time"; uniform_param.lookup.idx = draw->pipeline.id; uniform_param.lookup.add_prefix = true; uniform_param.lookup.enable = true; uniform_param.result.f.v0 = t; video_shader_driver_set_parameter(uniform_param); uniform_param.type = UNIFORM_2F; uniform_param.lookup.ident = "OutputSize"; uniform_param.result.f.v0 = draw->width; uniform_param.result.f.v1 = draw->height; video_shader_driver_set_parameter(uniform_param); } break; } #endif }
static void menu_display_d3d11_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { d3d11_video_t* d3d11 = video_info ? (d3d11_video_t*)video_info->userdata : NULL; if (!d3d11 || !draw) return; switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: { video_coord_array_t* ca = menu_display_get_coords_array(); if (!d3d11->menu_pipeline_vbo) { D3D11_BUFFER_DESC desc = { 0 }; desc.Usage = D3D11_USAGE_IMMUTABLE; desc.ByteWidth = ca->coords.vertices * 2 * sizeof(float); desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; { D3D11_SUBRESOURCE_DATA vertexData = { ca->coords.vertex }; D3D11CreateBuffer(d3d11->device, &desc, &vertexData, &d3d11->menu_pipeline_vbo); } } D3D11SetVertexBuffer(d3d11->context, 0, d3d11->menu_pipeline_vbo, 2 * sizeof(float), 0); draw->coords->vertices = ca->coords.vertices; D3D11SetBlendState(d3d11->context, d3d11->blend_pipeline, NULL, D3D11_DEFAULT_SAMPLE_MASK); break; } case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: case VIDEO_SHADER_MENU_6: D3D11SetVertexBuffer(d3d11->context, 0, d3d11->frame.vbo, sizeof(d3d11_vertex_t), 0); draw->coords->vertices = 4; break; default: return; } D3D11SetPrimitiveTopology(d3d11->context, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); d3d11->ubo_values.time += 0.01f; { D3D11_MAPPED_SUBRESOURCE mapped_ubo; D3D11MapBuffer(d3d11->context, d3d11->ubo, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_ubo); *(d3d11_uniform_t*)mapped_ubo.pData = d3d11->ubo_values; D3D11UnmapBuffer(d3d11->context, d3d11->ubo, 0); } }
static void menu_display_d3d_draw_pipeline(void *data, video_frame_info_t *video_info) { #if defined(HAVE_HLSL) || defined(HAVE_CG) menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; static float t = 0; video_coord_array_t *ca = NULL; if (!draw) return; ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = NULL; draw->matrix_data = NULL; if (ca) draw->coords = (struct video_coords*)&ca->coords; switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: case VIDEO_SHADER_MENU_3: { struct uniform_info uniform_param = {0}; t += 0.01; (void)uniform_param; uniform_param.enabled = true; uniform_param.lookup.enable = true; uniform_param.lookup.add_prefix = true; uniform_param.lookup.idx = draw->pipeline.id; uniform_param.lookup.type = SHADER_PROGRAM_VERTEX; uniform_param.type = UNIFORM_1F; uniform_param.lookup.ident = "time"; uniform_param.result.f.v0 = t; } break; } #endif }
static void menu_display_d3d_draw_pipeline(void *data) { #if defined(HAVE_HLSL) || defined(HAVE_CG) video_shader_ctx_info_t shader_info; menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; struct uniform_info uniform_param = {0}; static float t = 0; video_coord_array_t *ca = NULL; ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = (struct video_coords*)(&ca->coords); draw->matrix_data = NULL; switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: case VIDEO_SHADER_MENU_3: shader_info.data = NULL; shader_info.idx = draw->pipeline.id; shader_info.set_active = true; video_shader_driver_use(shader_info); t += 0.01; uniform_param.enabled = true; uniform_param.lookup.enable = true; uniform_param.lookup.add_prefix = true; uniform_param.lookup.idx = draw->pipeline.id; uniform_param.lookup.type = SHADER_PROGRAM_VERTEX; uniform_param.type = UNIFORM_1F; uniform_param.lookup.ident = "time"; uniform_param.result.f.v0 = t; video_shader_driver_set_parameter(uniform_param); break; } #endif }
static void menu_display_vk_draw_pipeline(void *data) { #ifdef HAVE_SHADERPIPELINE menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; vk_t *vk = (vk_t*)video_driver_get_ptr(false); video_coord_array_t *ca = NULL; static float t = 0.0f; if (!vk || !draw) return; ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = (struct video_coords*)&ca->coords; draw->matrix_data = NULL; draw->pipeline.backend_data = &t; t += 0.01; #endif }
void menu_display_push_quad( unsigned width, unsigned height, const float *colors, int x1, int y1, int x2, int y2) { menu_display_ctx_coord_draw_t coord_draw; float vertex[8]; video_coords_t coords; video_coord_array_t *ca = NULL; ca = menu_display_get_coords_array(); vertex[0] = x1 / (float)width; vertex[1] = y1 / (float)height; vertex[2] = x2 / (float)width; vertex[3] = y1 / (float)height; vertex[4] = x1 / (float)width; vertex[5] = y2 / (float)height; vertex[6] = x2 / (float)width; vertex[7] = y2 / (float)height; coord_draw.ptr = NULL; menu_display_get_tex_coords(&coord_draw); coords.color = colors; coords.vertex = vertex; coords.tex_coord = coord_draw.ptr; coords.lut_tex_coord = coord_draw.ptr; coords.vertices = 3; video_coord_array_append(ca, &coords, 3); coords.color += 4; coords.vertex += 2; coords.tex_coord += 2; coords.lut_tex_coord += 2; video_coord_array_append(ca, &coords, 3); }
static void zarch_frame(void *data) { unsigned i; float coord_color[16]; float coord_color2[16]; menu_display_ctx_draw_t draw; menu_display_ctx_coord_draw_t coord_draw; settings_t *settings = config_get_ptr(); zui_t *zui = (zui_t*)data; video_coord_array_t *ca = menu_display_get_coords_array(); if (!zui) return; video_driver_get_size(&zui->width, &zui->height); menu_display_set_viewport(); for (i = 0; i < 16; i++) { coord_color[i] = 0; coord_color2[i] = 2.0f; if (i == 3 || i == 7 || i == 11 || i == 15) { coord_color[i] = 0.10f; coord_color2[i] = 0.10f; } } zui->rendering = true; zui->hash = 0; zui->item.hot = 0; /* why do i need this? */ zui->mouse.wheel = menu_input_mouse_state(MENU_MOUSE_WHEEL_DOWN) - menu_input_mouse_state(MENU_MOUSE_WHEEL_UP); menu_display_coords_array_reset(); zui->tmp_block.carr.coords.vertices = 0; menu_display_font_bind_block((font_data_t*)zui->font, &zui->tmp_block); menu_display_push_quad(zui->width, zui->height, zui_bg_screen, 0, 0, zui->width, zui->height); menu_display_snow(zui->width, zui->height); switch (zarch_layout) { case LAY_HOME: if (zarch_zui_render_sidebar(zui)) return; if (zarch_zui_render_lay_root(zui)) return; break; case LAY_SETTINGS: zarch_zui_render_lay_settings(zui); break; case LAY_PICK_CORE: if (zarch_zui_render_sidebar(zui)) return; if (zarch_zui_render_pick_core(zui)) return; break; } if (settings->menu.mouse.enable) zarch_zui_draw_cursor( zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_X), zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_Y)); if (!zarch_zui_input_state(zui, MENU_ZARCH_PRESSED)) zui->item.active = 0; else if (zui->item.active == 0) zui->item.active = -1; menu_display_blend_begin(); draw.x = 0; draw.y = 0; draw.width = zui->width; draw.height = zui->height; draw.coords = (struct video_coords*)ca; draw.matrix_data = &zui->mvp; draw.texture = menu_display_white_texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLES; draw.pipeline.id = 0; menu_display_draw(&draw); menu_display_blend_end(); memset(&draw, 0, sizeof(menu_display_ctx_draw_t)); coord_draw.ptr = NULL; menu_display_get_tex_coords(&coord_draw); draw.width = zui->width; draw.height = zui->height; draw.texture = zui->textures.bg; draw.color = &coord_color[0]; draw.vertex = NULL; draw.tex_coord = coord_draw.ptr; draw.vertex_count = 4; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; if (!menu_display_libretro_running() && draw.texture) draw.color = &coord_color2[0]; menu_display_blend_begin(); draw.x = 0; draw.y = 0; menu_display_draw_bg(&draw); menu_display_draw(&draw); menu_display_blend_end(); zui->rendering = false; menu_display_font_flush_block((font_data_t*)zui->font); menu_display_unset_viewport(); }
static void menu_display_gl_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { #ifdef HAVE_SHADERPIPELINE struct uniform_info uniform_param; gl_t *gl = (gl_t*)video_info->userdata; static float t = 0; video_coord_array_t *ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = (struct video_coords*)(&ca->coords); draw->matrix_data = NULL; switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: glBlendFunc(GL_ONE, GL_ONE); break; default: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; } switch (draw->pipeline.id) { case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: case VIDEO_SHADER_MENU_6: gl->shader->use(gl, gl->shader_data, draw->pipeline.id, true); t += 0.01; uniform_param.type = UNIFORM_1F; uniform_param.enabled = true; uniform_param.location = 0; uniform_param.count = 0; uniform_param.lookup.type = SHADER_PROGRAM_VERTEX; uniform_param.lookup.ident = "time"; uniform_param.lookup.idx = draw->pipeline.id; uniform_param.lookup.add_prefix = true; uniform_param.lookup.enable = true; uniform_param.result.f.v0 = t; gl->shader->set_uniform_parameter(gl->shader_data, &uniform_param, NULL); break; } switch (draw->pipeline.id) { case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: case VIDEO_SHADER_MENU_6: #ifndef HAVE_PSGL uniform_param.type = UNIFORM_2F; uniform_param.lookup.ident = "OutputSize"; uniform_param.result.f.v0 = draw->width; uniform_param.result.f.v1 = draw->height; gl->shader->set_uniform_parameter(gl->shader_data, &uniform_param, NULL); #endif break; } #endif }
static void menu_display_vk_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { #ifdef HAVE_SHADERPIPELINE static uint8_t ubo_scratch_data[768]; static float t = 0.0f; static struct video_coords blank_coords; float output_size[2]; video_coord_array_t *ca = NULL; vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; if (!vk || !draw) return; draw->x = 0; draw->y = 0; draw->matrix_data = NULL; output_size[0] = (float)vk->context->swapchain_width; output_size[1] = (float)vk->context->swapchain_height; switch (draw->pipeline.id) { /* Ribbon */ default: case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: ca = menu_display_get_coords_array(); draw->coords = (struct video_coords*)&ca->coords; draw->pipeline.backend_data = ubo_scratch_data; draw->pipeline.backend_data_size = sizeof(float); /* Match UBO layout in shader. */ memcpy(ubo_scratch_data, &t, sizeof(t)); break; /* Snow simple */ case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: draw->pipeline.backend_data = ubo_scratch_data; draw->pipeline.backend_data_size = sizeof(math_matrix_4x4) + 3 * sizeof(float); /* Match UBO layout in shader. */ memcpy(ubo_scratch_data, menu_display_vk_get_default_mvp(video_info), sizeof(math_matrix_4x4)); memcpy(ubo_scratch_data + sizeof(math_matrix_4x4), output_size, sizeof(output_size)); memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + 2 * sizeof(float), &t, sizeof(t)); draw->coords = &blank_coords; blank_coords.vertices = 4; draw->prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; break; } t += 0.01; #endif }