19 changed files with 291 additions and 138 deletions
-
2src/video_core/CMakeLists.txt
-
2src/video_core/host_shaders/CMakeLists.txt
-
15src/video_core/host_shaders/full_screen_triangle.vert
-
13src/video_core/host_shaders/vulkan_blit_color_float.frag
-
3src/video_core/rasterizer_interface.h
-
1src/video_core/renderer_null/null_rasterizer.cpp
-
1src/video_core/renderer_null/null_rasterizer.h
-
1src/video_core/renderer_opengl/gl_device.cpp
-
7src/video_core/renderer_opengl/gl_device.h
-
44src/video_core/renderer_opengl/gl_rasterizer.cpp
-
4src/video_core/renderer_opengl/gl_rasterizer.h
-
121src/video_core/renderer_opengl/gl_shader_manager.cpp
-
129src/video_core/renderer_opengl/gl_shader_manager.h
-
41src/video_core/renderer_vulkan/blit_image.cpp
-
6src/video_core/renderer_vulkan/blit_image.h
-
28src/video_core/renderer_vulkan/vk_rasterizer.cpp
-
1src/video_core/renderer_vulkan/vk_rasterizer.h
-
7src/video_core/texture_cache/texture_cache.h
-
3src/video_core/texture_cache/texture_cache_base.h
@ -1,13 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#version 450 |
|
||||
|
|
||||
layout(binding = 0) uniform sampler2D tex; |
|
||||
|
|
||||
layout(location = 0) in vec2 texcoord; |
|
||||
layout(location = 0) out vec4 color; |
|
||||
|
|
||||
void main() { |
|
||||
color = textureLod(tex, texcoord, 0); |
|
||||
} |
|
||||
@ -1,2 +1,123 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include <glad/glad.h>
|
||||
|
|
||||
|
#include "video_core/renderer_opengl/gl_shader_manager.h"
|
||||
|
|
||||
|
namespace OpenGL { |
||||
|
|
||||
|
static constexpr std::array ASSEMBLY_PROGRAM_ENUMS{ |
||||
|
GL_VERTEX_PROGRAM_NV, GL_TESS_CONTROL_PROGRAM_NV, GL_TESS_EVALUATION_PROGRAM_NV, |
||||
|
GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV, |
||||
|
}; |
||||
|
|
||||
|
ProgramManager::ProgramManager(const Device& device) { |
||||
|
glCreateProgramPipelines(1, &pipeline.handle); |
||||
|
if (device.UseAssemblyShaders()) { |
||||
|
glEnable(GL_COMPUTE_PROGRAM_NV); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::BindComputeProgram(GLuint program) { |
||||
|
glUseProgram(program); |
||||
|
is_compute_bound = true; |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::BindComputeAssemblyProgram(GLuint program) { |
||||
|
if (current_assembly_compute_program != program) { |
||||
|
current_assembly_compute_program = program; |
||||
|
glBindProgramARB(GL_COMPUTE_PROGRAM_NV, program); |
||||
|
} |
||||
|
UnbindPipeline(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::BindSourcePrograms(std::span<const OGLProgram, NUM_STAGES> programs) { |
||||
|
static constexpr std::array<GLenum, 5> stage_enums{ |
||||
|
GL_VERTEX_SHADER_BIT, GL_TESS_CONTROL_SHADER_BIT, GL_TESS_EVALUATION_SHADER_BIT, |
||||
|
GL_GEOMETRY_SHADER_BIT, GL_FRAGMENT_SHADER_BIT, |
||||
|
}; |
||||
|
for (size_t stage = 0; stage < NUM_STAGES; ++stage) { |
||||
|
if (current_programs[stage] != programs[stage].handle) { |
||||
|
current_programs[stage] = programs[stage].handle; |
||||
|
glUseProgramStages(pipeline.handle, stage_enums[stage], programs[stage].handle); |
||||
|
} |
||||
|
} |
||||
|
BindPipeline(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::BindPresentPrograms(GLuint vertex, GLuint fragment) { |
||||
|
if (current_programs[0] != vertex) { |
||||
|
current_programs[0] = vertex; |
||||
|
glUseProgramStages(pipeline.handle, GL_VERTEX_SHADER_BIT, vertex); |
||||
|
} |
||||
|
if (current_programs[4] != fragment) { |
||||
|
current_programs[4] = fragment; |
||||
|
glUseProgramStages(pipeline.handle, GL_FRAGMENT_SHADER_BIT, fragment); |
||||
|
} |
||||
|
glUseProgramStages( |
||||
|
pipeline.handle, |
||||
|
GL_TESS_CONTROL_SHADER_BIT | GL_TESS_EVALUATION_SHADER_BIT | GL_GEOMETRY_SHADER_BIT, 0); |
||||
|
current_programs[1] = 0; |
||||
|
current_programs[2] = 0; |
||||
|
current_programs[3] = 0; |
||||
|
|
||||
|
if (current_stage_mask != 0) { |
||||
|
current_stage_mask = 0; |
||||
|
for (const GLenum program_type : ASSEMBLY_PROGRAM_ENUMS) { |
||||
|
glDisable(program_type); |
||||
|
} |
||||
|
} |
||||
|
BindPipeline(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::BindAssemblyPrograms(std::span<const OGLAssemblyProgram, NUM_STAGES> programs, |
||||
|
u32 stage_mask) { |
||||
|
const u32 changed_mask = current_stage_mask ^ stage_mask; |
||||
|
current_stage_mask = stage_mask; |
||||
|
|
||||
|
if (changed_mask != 0) { |
||||
|
for (size_t stage = 0; stage < NUM_STAGES; ++stage) { |
||||
|
if (((changed_mask >> stage) & 1) != 0) { |
||||
|
if (((stage_mask >> stage) & 1) != 0) { |
||||
|
glEnable(ASSEMBLY_PROGRAM_ENUMS[stage]); |
||||
|
} else { |
||||
|
glDisable(ASSEMBLY_PROGRAM_ENUMS[stage]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
for (size_t stage = 0; stage < NUM_STAGES; ++stage) { |
||||
|
if (current_programs[stage] != programs[stage].handle) { |
||||
|
current_programs[stage] = programs[stage].handle; |
||||
|
glBindProgramARB(ASSEMBLY_PROGRAM_ENUMS[stage], programs[stage].handle); |
||||
|
} |
||||
|
} |
||||
|
UnbindPipeline(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::RestoreGuestCompute() {} |
||||
|
|
||||
|
void ProgramManager::BindPipeline() { |
||||
|
if (!is_pipeline_bound) { |
||||
|
is_pipeline_bound = true; |
||||
|
glBindProgramPipeline(pipeline.handle); |
||||
|
} |
||||
|
UnbindCompute(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::UnbindPipeline() { |
||||
|
if (is_pipeline_bound) { |
||||
|
is_pipeline_bound = false; |
||||
|
glBindProgramPipeline(0); |
||||
|
} |
||||
|
UnbindCompute(); |
||||
|
} |
||||
|
|
||||
|
void ProgramManager::UnbindCompute() { |
||||
|
if (is_compute_bound) { |
||||
|
is_compute_bound = false; |
||||
|
glUseProgram(0); |
||||
|
} |
||||
|
} |
||||
|
} // namespace OpenGL
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue