mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
(GLSLANG) Move more common code out of shader_gl_core and shader_vulkan
and into glslang_util.h
This commit is contained in:
parent
b69ceaea1b
commit
bb58b0d6e3
@ -957,8 +957,9 @@ static bool gl_core_init_default_filter_chain(gl_core_t *gl)
|
||||
return false;
|
||||
|
||||
gl->filter_chain = gl_core_filter_chain_create_default(
|
||||
gl->video_info.smooth ?
|
||||
GL_CORE_FILTER_CHAIN_LINEAR : GL_CORE_FILTER_CHAIN_NEAREST);
|
||||
gl->video_info.smooth
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST);
|
||||
|
||||
if (!gl->filter_chain)
|
||||
{
|
||||
@ -973,8 +974,9 @@ static bool gl_core_init_filter_chain_preset(gl_core_t *gl, const char *shader_p
|
||||
{
|
||||
gl->filter_chain = gl_core_filter_chain_create_from_preset(
|
||||
shader_path,
|
||||
gl->video_info.smooth ?
|
||||
GL_CORE_FILTER_CHAIN_LINEAR : GL_CORE_FILTER_CHAIN_NEAREST);
|
||||
gl->video_info.smooth
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST);
|
||||
|
||||
if (!gl->filter_chain)
|
||||
{
|
||||
|
@ -781,8 +781,9 @@ static bool vulkan_init_default_filter_chain(vk_t *vk)
|
||||
|
||||
vk->filter_chain = vulkan_filter_chain_create_default(
|
||||
&info,
|
||||
vk->video.smooth ?
|
||||
VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST);
|
||||
vk->video.smooth
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST);
|
||||
|
||||
if (!vk->filter_chain)
|
||||
{
|
||||
@ -814,8 +815,9 @@ static bool vulkan_init_filter_chain_preset(vk_t *vk, const char *shader_path)
|
||||
|
||||
vk->filter_chain = vulkan_filter_chain_create_from_preset(
|
||||
&info, shader_path,
|
||||
vk->video.smooth ?
|
||||
VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST);
|
||||
vk->video.smooth
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST);
|
||||
|
||||
if (!vk->filter_chain)
|
||||
{
|
||||
|
@ -18,10 +18,12 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <retro_common_api.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#include <lists/string_list.h>
|
||||
|
||||
#include "slang_reflection.h"
|
||||
#include "../video_shader_parse.h"
|
||||
|
||||
typedef enum glslang_format
|
||||
{
|
||||
@ -66,10 +68,54 @@ typedef enum glslang_format
|
||||
SLANG_FORMAT_R32G32B32A32_SFLOAT,
|
||||
|
||||
SLANG_FORMAT_MAX
|
||||
}glslang_format;
|
||||
} glslang_format;
|
||||
|
||||
typedef enum glslang_filter_chain_filter
|
||||
{
|
||||
GLSLANG_FILTER_CHAIN_LINEAR = 0,
|
||||
GLSLANG_FILTER_CHAIN_NEAREST = 1,
|
||||
GLSLANG_FILTER_CHAIN_COUNT
|
||||
} glslang_filter_chain_filter;
|
||||
|
||||
typedef enum glslang_filter_chain_address
|
||||
{
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT = 0,
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT = 1,
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE = 2,
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER = 3,
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE = 4,
|
||||
GLSLANG_FILTER_CHAIN_ADDRESS_COUNT
|
||||
} glslang_filter_chain_address;
|
||||
|
||||
typedef enum glslang_filter_chain_scale
|
||||
{
|
||||
GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL,
|
||||
GLSLANG_FILTER_CHAIN_SCALE_SOURCE,
|
||||
GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT,
|
||||
GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE
|
||||
} glslang_filter_chain_scale;
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
static INLINE enum glslang_filter_chain_address rarch_wrap_to_address(
|
||||
enum gfx_wrap_type type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case RARCH_WRAP_BORDER:
|
||||
return GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER;
|
||||
case RARCH_WRAP_REPEAT:
|
||||
return GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
case RARCH_WRAP_MIRRORED_REPEAT:
|
||||
return GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT;
|
||||
case RARCH_WRAP_EDGE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
}
|
||||
|
||||
const char *glslang_format_to_string(glslang_format fmt);
|
||||
|
||||
enum glslang_format glslang_find_format(const char *fmt);
|
||||
|
@ -267,48 +267,30 @@ static const uint32_t opaque_frag[] =
|
||||
struct Texture
|
||||
{
|
||||
gl_core_filter_chain_texture texture;
|
||||
gl_core_filter_chain_filter filter;
|
||||
gl_core_filter_chain_filter mip_filter;
|
||||
gl_core_filter_chain_address address;
|
||||
glslang_filter_chain_filter filter;
|
||||
glslang_filter_chain_filter mip_filter;
|
||||
glslang_filter_chain_address address;
|
||||
};
|
||||
|
||||
static gl_core_filter_chain_address wrap_to_address(gfx_wrap_type type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case RARCH_WRAP_BORDER:
|
||||
return GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER;
|
||||
case RARCH_WRAP_REPEAT:
|
||||
return GL_CORE_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
case RARCH_WRAP_MIRRORED_REPEAT:
|
||||
return GL_CORE_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT;
|
||||
case RARCH_WRAP_EDGE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
}
|
||||
|
||||
static GLenum address_to_gl(gl_core_filter_chain_address type)
|
||||
static GLenum address_to_gl(glslang_filter_chain_address type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
#ifdef HAVE_OPENGLES3
|
||||
case GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
#if 0
|
||||
RARCH_WARN("[GLCore]: No CLAMP_TO_BORDER in GLES3. Falling back to edge clamp.\n");
|
||||
#endif
|
||||
return GL_CLAMP_TO_EDGE;
|
||||
#else
|
||||
case GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
return GL_CLAMP_TO_BORDER;
|
||||
#endif
|
||||
case GL_CORE_FILTER_CHAIN_ADDRESS_REPEAT:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT:
|
||||
return GL_REPEAT;
|
||||
case GL_CORE_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT:
|
||||
return GL_MIRRORED_REPEAT;
|
||||
case GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -316,13 +298,13 @@ static GLenum address_to_gl(gl_core_filter_chain_address type)
|
||||
return GL_CLAMP_TO_EDGE;
|
||||
}
|
||||
|
||||
static GLenum convert_filter_to_mag_gl(gl_core_filter_chain_filter filter)
|
||||
static GLenum convert_filter_to_mag_gl(glslang_filter_chain_filter filter)
|
||||
{
|
||||
switch (filter)
|
||||
{
|
||||
case GL_CORE_FILTER_CHAIN_LINEAR:
|
||||
case GLSLANG_FILTER_CHAIN_LINEAR:
|
||||
return GL_LINEAR;
|
||||
case GL_CORE_FILTER_CHAIN_NEAREST:
|
||||
case GLSLANG_FILTER_CHAIN_NEAREST:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -330,13 +312,15 @@ static GLenum convert_filter_to_mag_gl(gl_core_filter_chain_filter filter)
|
||||
return GL_NEAREST;
|
||||
}
|
||||
|
||||
static GLenum convert_filter_to_min_gl(gl_core_filter_chain_filter filter, gl_core_filter_chain_filter mipfilter)
|
||||
static GLenum convert_filter_to_min_gl(glslang_filter_chain_filter filter, glslang_filter_chain_filter mipfilter)
|
||||
{
|
||||
if (filter == GL_CORE_FILTER_CHAIN_LINEAR && mipfilter == GL_CORE_FILTER_CHAIN_LINEAR)
|
||||
if ( (filter == GLSLANG_FILTER_CHAIN_LINEAR)
|
||||
&& (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR)
|
||||
)
|
||||
return GL_LINEAR_MIPMAP_LINEAR;
|
||||
else if (filter == GL_CORE_FILTER_CHAIN_LINEAR)
|
||||
else if (filter == GLSLANG_FILTER_CHAIN_LINEAR)
|
||||
return GL_LINEAR_MIPMAP_NEAREST;
|
||||
else if (mipfilter == GL_CORE_FILTER_CHAIN_LINEAR)
|
||||
else if (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR)
|
||||
return GL_NEAREST_MIPMAP_LINEAR;
|
||||
return GL_NEAREST_MIPMAP_NEAREST;
|
||||
}
|
||||
@ -394,7 +378,7 @@ public:
|
||||
unsigned width, unsigned height,
|
||||
bool linear,
|
||||
bool mipmap,
|
||||
gl_core_filter_chain_address address);
|
||||
glslang_filter_chain_address address);
|
||||
~StaticTexture();
|
||||
|
||||
StaticTexture(StaticTexture&&) = delete;
|
||||
@ -412,13 +396,13 @@ private:
|
||||
|
||||
StaticTexture::StaticTexture(string id_, GLuint image_,
|
||||
unsigned width, unsigned height, bool linear, bool mipmap,
|
||||
gl_core_filter_chain_address address)
|
||||
glslang_filter_chain_address address)
|
||||
: id(std::move(id_)), image(image_)
|
||||
{
|
||||
GLenum gl_address = address_to_gl(address);
|
||||
|
||||
texture.filter = GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
texture.mip_filter = GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
texture.filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
texture.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
texture.address = address;
|
||||
texture.texture.width = width;
|
||||
texture.texture.height = height;
|
||||
@ -426,9 +410,9 @@ StaticTexture::StaticTexture(string id_, GLuint image_,
|
||||
texture.texture.image = image;
|
||||
|
||||
if (linear)
|
||||
texture.filter = GL_CORE_FILTER_CHAIN_LINEAR;
|
||||
texture.filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
if (mipmap && linear)
|
||||
texture.mip_filter = GL_CORE_FILTER_CHAIN_LINEAR;
|
||||
texture.mip_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, image);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gl_address);
|
||||
@ -713,17 +697,17 @@ public:
|
||||
return pass_name;
|
||||
}
|
||||
|
||||
gl_core_filter_chain_filter get_source_filter() const
|
||||
glslang_filter_chain_filter get_source_filter() const
|
||||
{
|
||||
return pass_info.source_filter;
|
||||
}
|
||||
|
||||
gl_core_filter_chain_filter get_mip_filter() const
|
||||
glslang_filter_chain_filter get_mip_filter() const
|
||||
{
|
||||
return pass_info.mip_filter;
|
||||
}
|
||||
|
||||
gl_core_filter_chain_address get_address_mode() const
|
||||
glslang_filter_chain_address get_address_mode() const
|
||||
{
|
||||
return pass_info.address;
|
||||
}
|
||||
@ -1021,19 +1005,19 @@ Size2D Pass::get_output_size(const Size2D &original, const Size2D &source) const
|
||||
float width, height;
|
||||
switch (pass_info.scale_type_x)
|
||||
{
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
width = float(original.width) * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_SOURCE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_SOURCE:
|
||||
width = float(source.width) * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
width = current_viewport.width * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
width = pass_info.scale_x;
|
||||
break;
|
||||
|
||||
@ -1043,19 +1027,19 @@ Size2D Pass::get_output_size(const Size2D &original, const Size2D &source) const
|
||||
|
||||
switch (pass_info.scale_type_y)
|
||||
{
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
height = float(original.height) * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_SOURCE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_SOURCE:
|
||||
height = float(source.height) * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
height = current_viewport.height * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case GL_CORE_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
height = pass_info.scale_y;
|
||||
break;
|
||||
|
||||
@ -2099,7 +2083,7 @@ static unique_ptr<gl_core_shader::StaticTexture> gl_core_filter_chain_load_lut(
|
||||
tex, image.width, image.height,
|
||||
shader->filter != RARCH_FILTER_NEAREST,
|
||||
levels > 1,
|
||||
gl_core_shader::wrap_to_address(shader->wrap)));
|
||||
rarch_wrap_to_address(shader->wrap)));
|
||||
}
|
||||
|
||||
static bool gl_core_filter_chain_load_luts(
|
||||
@ -2123,7 +2107,7 @@ static bool gl_core_filter_chain_load_luts(
|
||||
}
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_default(
|
||||
gl_core_filter_chain_filter filter)
|
||||
glslang_filter_chain_filter filter)
|
||||
{
|
||||
struct gl_core_filter_chain_pass_info pass_info;
|
||||
|
||||
@ -2131,14 +2115,14 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_default(
|
||||
if (!chain)
|
||||
return nullptr;
|
||||
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
pass_info.rt_format = 0;
|
||||
pass_info.source_filter = filter;
|
||||
pass_info.mip_filter = GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
chain->set_pass_info(0, pass_info);
|
||||
@ -2157,7 +2141,7 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_default(
|
||||
}
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
const char *path, gl_core_filter_chain_filter filter)
|
||||
const char *path, glslang_filter_chain_filter filter)
|
||||
{
|
||||
unsigned i;
|
||||
config_file_t *conf = NULL;
|
||||
@ -2193,14 +2177,14 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
const video_shader_pass *next_pass =
|
||||
i + 1 < shader->passes ? &shader->pass[i + 1] : nullptr;
|
||||
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_x = 0.0f;
|
||||
pass_info.scale_y = 0.0f;
|
||||
pass_info.rt_format = 0;
|
||||
pass_info.source_filter = GL_CORE_FILTER_CHAIN_LINEAR;
|
||||
pass_info.mip_filter = GL_CORE_FILTER_CHAIN_LINEAR;
|
||||
pass_info.address = GL_CORE_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
pass_info.source_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
if (!glslang_compile_shader(pass->source.path, &output))
|
||||
@ -2279,10 +2263,11 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
else
|
||||
{
|
||||
pass_info.source_filter =
|
||||
pass->filter == RARCH_FILTER_LINEAR ? GL_CORE_FILTER_CHAIN_LINEAR :
|
||||
GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
pass->filter == RARCH_FILTER_LINEAR
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
}
|
||||
pass_info.address = gl_core_shader::wrap_to_address(pass->wrap);
|
||||
pass_info.address = rarch_wrap_to_address(pass->wrap);
|
||||
pass_info.max_levels = 1;
|
||||
|
||||
/* TODO: Expose max_levels in slangp.
|
||||
@ -2293,7 +2278,8 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
pass_info.max_levels = ~0u;
|
||||
|
||||
pass_info.mip_filter = pass->filter != RARCH_FILTER_NEAREST && pass_info.max_levels > 1
|
||||
? GL_CORE_FILTER_CHAIN_LINEAR : GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
|
||||
bool explicit_format = output.meta.rt_format != SLANG_FORMAT_UNKNOWN;
|
||||
|
||||
@ -2304,11 +2290,11 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
if (!pass->fbo.valid)
|
||||
{
|
||||
pass_info.scale_type_x = i + 1 == shader->passes
|
||||
? GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT
|
||||
: GL_CORE_FILTER_CHAIN_SCALE_SOURCE;
|
||||
? GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT
|
||||
: GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_y = i + 1 == shader->passes
|
||||
? GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT
|
||||
: GL_CORE_FILTER_CHAIN_SCALE_SOURCE;
|
||||
? GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT
|
||||
: GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
|
||||
@ -2344,17 +2330,17 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
{
|
||||
case RARCH_SCALE_INPUT:
|
||||
pass_info.scale_x = pass->fbo.scale_x;
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_ABSOLUTE:
|
||||
pass_info.scale_x = float(pass->fbo.abs_x);
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_VIEWPORT:
|
||||
pass_info.scale_x = pass->fbo.scale_x;
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2362,17 +2348,17 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
{
|
||||
case RARCH_SCALE_INPUT:
|
||||
pass_info.scale_y = pass->fbo.scale_y;
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_ABSOLUTE:
|
||||
pass_info.scale_y = float(pass->fbo.abs_y);
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_VIEWPORT:
|
||||
pass_info.scale_y = pass->fbo.scale_y;
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2384,16 +2370,16 @@ gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
{
|
||||
struct gl_core_filter_chain_pass_info pass_info;
|
||||
|
||||
pass_info.scale_type_x = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
|
||||
pass_info.rt_format = 0;
|
||||
|
||||
pass_info.source_filter = filter;
|
||||
pass_info.mip_filter = GL_CORE_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
|
@ -23,27 +23,12 @@
|
||||
#include <retro_common_api.h>
|
||||
#include <glsym/glsym.h>
|
||||
|
||||
#include "glslang_util.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
typedef struct gl_core_filter_chain gl_core_filter_chain_t;
|
||||
|
||||
enum gl_core_filter_chain_filter
|
||||
{
|
||||
GL_CORE_FILTER_CHAIN_LINEAR = 0,
|
||||
GL_CORE_FILTER_CHAIN_NEAREST = 1,
|
||||
GL_CORE_FILTER_CHAIN_COUNT
|
||||
};
|
||||
|
||||
enum gl_core_filter_chain_address
|
||||
{
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_REPEAT = 0,
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT = 1,
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE = 2,
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER = 3,
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE = 4,
|
||||
GL_CORE_FILTER_CHAIN_ADDRESS_COUNT
|
||||
};
|
||||
|
||||
struct gl_core_filter_chain_texture
|
||||
{
|
||||
GLuint image;
|
||||
@ -62,85 +47,28 @@ struct gl_core_viewport
|
||||
GLsizei height;
|
||||
};
|
||||
|
||||
enum gl_core_filter_chain_scale
|
||||
{
|
||||
GL_CORE_FILTER_CHAIN_SCALE_ORIGINAL,
|
||||
GL_CORE_FILTER_CHAIN_SCALE_SOURCE,
|
||||
GL_CORE_FILTER_CHAIN_SCALE_VIEWPORT,
|
||||
GL_CORE_FILTER_CHAIN_SCALE_ABSOLUTE
|
||||
};
|
||||
|
||||
struct gl_core_filter_chain_pass_info
|
||||
{
|
||||
/* For the last pass, make sure VIEWPORT scale
|
||||
* with scale factors of 1 are used. */
|
||||
enum gl_core_filter_chain_scale scale_type_x;
|
||||
enum gl_core_filter_chain_scale scale_type_y;
|
||||
enum glslang_filter_chain_scale scale_type_x;
|
||||
enum glslang_filter_chain_scale scale_type_y;
|
||||
float scale_x;
|
||||
float scale_y;
|
||||
|
||||
/* Ignored for the last pass, swapchain info will be used instead. */
|
||||
/* Ignored for the last pass, swapchain info
|
||||
* will be used instead. */
|
||||
GLenum rt_format;
|
||||
|
||||
/* The filter to use for source in this pass. */
|
||||
enum gl_core_filter_chain_filter source_filter;
|
||||
enum gl_core_filter_chain_filter mip_filter;
|
||||
enum gl_core_filter_chain_address address;
|
||||
enum glslang_filter_chain_filter source_filter;
|
||||
enum glslang_filter_chain_filter mip_filter;
|
||||
enum glslang_filter_chain_address address;
|
||||
|
||||
/* Maximum number of mip-levels to use. */
|
||||
unsigned max_levels;
|
||||
};
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_new(void);
|
||||
void gl_core_filter_chain_free(gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_set_shader(gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
GLenum shader_type,
|
||||
const uint32_t *spirv,
|
||||
size_t spirv_words);
|
||||
|
||||
void gl_core_filter_chain_set_pass_info(gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
const struct gl_core_filter_chain_pass_info *info);
|
||||
|
||||
bool gl_core_filter_chain_init(gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_set_input_texture(
|
||||
gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_filter_chain_texture *texture);
|
||||
|
||||
void gl_core_filter_chain_set_frame_count(gl_core_filter_chain_t *chain,
|
||||
uint64_t count);
|
||||
|
||||
void gl_core_filter_chain_set_frame_count_period(gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
unsigned period);
|
||||
|
||||
void gl_core_filter_chain_set_frame_direction(gl_core_filter_chain_t *chain,
|
||||
int32_t direction);
|
||||
|
||||
void gl_core_filter_chain_set_pass_name(gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
const char *name);
|
||||
|
||||
void gl_core_filter_chain_build_offscreen_passes(gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_viewport *vp);
|
||||
void gl_core_filter_chain_build_viewport_pass(gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_viewport *vp,
|
||||
const float *mvp);
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_default(
|
||||
enum gl_core_filter_chain_filter filter);
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
const char *path, enum gl_core_filter_chain_filter filter);
|
||||
|
||||
struct video_shader *gl_core_filter_chain_get_preset(
|
||||
gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_end_frame(gl_core_filter_chain_t *chain);
|
||||
|
||||
struct gl_core_buffer_locations
|
||||
{
|
||||
GLint flat_ubo_vertex;
|
||||
@ -151,9 +79,75 @@ struct gl_core_buffer_locations
|
||||
GLuint buffer_index_ubo_fragment;
|
||||
};
|
||||
|
||||
GLuint gl_core_cross_compile_program(const uint32_t *vertex, size_t vertex_size,
|
||||
const uint32_t *fragment, size_t fragment_size,
|
||||
struct gl_core_buffer_locations *loc, bool flatten);
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_new(void);
|
||||
|
||||
void gl_core_filter_chain_free(
|
||||
gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_set_shader(
|
||||
gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
GLenum shader_type,
|
||||
const uint32_t *spirv,
|
||||
size_t spirv_words);
|
||||
|
||||
void gl_core_filter_chain_set_pass_info(
|
||||
gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
const struct gl_core_filter_chain_pass_info *info);
|
||||
|
||||
bool gl_core_filter_chain_init(gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_set_input_texture(
|
||||
gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_filter_chain_texture *texture);
|
||||
|
||||
void gl_core_filter_chain_set_frame_count(
|
||||
gl_core_filter_chain_t *chain,
|
||||
uint64_t count);
|
||||
|
||||
void gl_core_filter_chain_set_frame_count_period(
|
||||
gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
unsigned period);
|
||||
|
||||
void gl_core_filter_chain_set_frame_direction(
|
||||
gl_core_filter_chain_t *chain,
|
||||
int32_t direction);
|
||||
|
||||
void gl_core_filter_chain_set_pass_name(
|
||||
gl_core_filter_chain_t *chain,
|
||||
unsigned pass,
|
||||
const char *name);
|
||||
|
||||
void gl_core_filter_chain_build_offscreen_passes(
|
||||
gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_viewport *vp);
|
||||
|
||||
void gl_core_filter_chain_build_viewport_pass(
|
||||
gl_core_filter_chain_t *chain,
|
||||
const struct gl_core_viewport *vp,
|
||||
const float *mvp);
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_default(
|
||||
enum glslang_filter_chain_filter filter);
|
||||
|
||||
gl_core_filter_chain_t *gl_core_filter_chain_create_from_preset(
|
||||
const char *path,
|
||||
enum glslang_filter_chain_filter filter);
|
||||
|
||||
struct video_shader *gl_core_filter_chain_get_preset(
|
||||
gl_core_filter_chain_t *chain);
|
||||
|
||||
void gl_core_filter_chain_end_frame(gl_core_filter_chain_t *chain);
|
||||
|
||||
GLuint gl_core_cross_compile_program(
|
||||
const uint32_t *vertex,
|
||||
size_t vertex_size,
|
||||
const uint32_t *fragment,
|
||||
size_t fragment_size,
|
||||
struct gl_core_buffer_locations *loc,
|
||||
bool flatten);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
|
@ -48,9 +48,9 @@ static const uint32_t opaque_frag[] =
|
||||
struct Texture
|
||||
{
|
||||
vulkan_filter_chain_texture texture;
|
||||
vulkan_filter_chain_filter filter;
|
||||
vulkan_filter_chain_filter mip_filter;
|
||||
vulkan_filter_chain_address address;
|
||||
glslang_filter_chain_filter filter;
|
||||
glslang_filter_chain_filter mip_filter;
|
||||
glslang_filter_chain_address address;
|
||||
};
|
||||
|
||||
class DeferredDisposer
|
||||
@ -104,7 +104,7 @@ class StaticTexture
|
||||
unsigned width, unsigned height,
|
||||
bool linear,
|
||||
bool mipmap,
|
||||
vulkan_filter_chain_address address);
|
||||
glslang_filter_chain_address address);
|
||||
~StaticTexture();
|
||||
|
||||
StaticTexture(StaticTexture&&) = delete;
|
||||
@ -184,7 +184,7 @@ struct CommonResources
|
||||
size_t ubo_offset = 0;
|
||||
size_t ubo_alignment = 1;
|
||||
|
||||
VkSampler samplers[VULKAN_FILTER_CHAIN_COUNT][VULKAN_FILTER_CHAIN_COUNT][VULKAN_FILTER_CHAIN_ADDRESS_COUNT];
|
||||
VkSampler samplers[GLSLANG_FILTER_CHAIN_COUNT][GLSLANG_FILTER_CHAIN_COUNT][GLSLANG_FILTER_CHAIN_ADDRESS_COUNT];
|
||||
|
||||
vector<Texture> original_history;
|
||||
vector<Texture> fb_feedback;
|
||||
@ -246,15 +246,15 @@ class Pass
|
||||
void set_frame_direction(int32_t dir) { frame_direction = dir; }
|
||||
void set_name(const char *name) { pass_name = name; }
|
||||
const string &get_name() const { return pass_name; }
|
||||
vulkan_filter_chain_filter get_source_filter() const {
|
||||
glslang_filter_chain_filter get_source_filter() const {
|
||||
return pass_info.source_filter; }
|
||||
|
||||
vulkan_filter_chain_filter get_mip_filter() const
|
||||
glslang_filter_chain_filter get_mip_filter() const
|
||||
{
|
||||
return pass_info.mip_filter;
|
||||
}
|
||||
|
||||
vulkan_filter_chain_address get_address_mode() const
|
||||
glslang_filter_chain_address get_address_mode() const
|
||||
{
|
||||
return pass_info.address;
|
||||
}
|
||||
@ -685,7 +685,7 @@ static unique_ptr<StaticTexture> vulkan_filter_chain_load_lut(
|
||||
tex, view, memory, move(buffer), image.width, image.height,
|
||||
shader->filter != RARCH_FILTER_NEAREST,
|
||||
image_info.mipLevels > 1,
|
||||
vk_wrap_to_address(shader->wrap)));
|
||||
rarch_wrap_to_address(shader->wrap)));
|
||||
|
||||
error:
|
||||
if (image.pixels)
|
||||
@ -1344,7 +1344,7 @@ StaticTexture::StaticTexture(string id,
|
||||
unsigned width, unsigned height,
|
||||
bool linear,
|
||||
bool mipmap,
|
||||
vulkan_filter_chain_address address)
|
||||
glslang_filter_chain_address address)
|
||||
: device(device),
|
||||
image(image),
|
||||
view(view),
|
||||
@ -1352,8 +1352,8 @@ StaticTexture::StaticTexture(string id,
|
||||
buffer(move(buffer)),
|
||||
id(move(id))
|
||||
{
|
||||
texture.filter = VULKAN_FILTER_CHAIN_NEAREST;
|
||||
texture.mip_filter = VULKAN_FILTER_CHAIN_NEAREST;
|
||||
texture.filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
texture.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
texture.address = address;
|
||||
texture.texture.image = image;
|
||||
texture.texture.view = view;
|
||||
@ -1362,9 +1362,9 @@ StaticTexture::StaticTexture(string id,
|
||||
texture.texture.height = height;
|
||||
|
||||
if (linear)
|
||||
texture.filter = VULKAN_FILTER_CHAIN_LINEAR;
|
||||
texture.filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
if (mipmap && linear)
|
||||
texture.mip_filter = VULKAN_FILTER_CHAIN_LINEAR;
|
||||
texture.mip_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
}
|
||||
|
||||
StaticTexture::~StaticTexture()
|
||||
@ -1467,19 +1467,19 @@ Size2D Pass::get_output_size(const Size2D &original,
|
||||
float width, height;
|
||||
switch (pass_info.scale_type_x)
|
||||
{
|
||||
case VULKAN_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
width = float(original.width) * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_SOURCE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_SOURCE:
|
||||
width = float(source.width) * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
width = current_viewport.width * pass_info.scale_x;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
width = pass_info.scale_x;
|
||||
break;
|
||||
|
||||
@ -1489,19 +1489,19 @@ Size2D Pass::get_output_size(const Size2D &original,
|
||||
|
||||
switch (pass_info.scale_type_y)
|
||||
{
|
||||
case VULKAN_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL:
|
||||
height = float(original.height) * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_SOURCE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_SOURCE:
|
||||
height = float(source.height) * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT:
|
||||
height = current_viewport.height * pass_info.scale_y;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
case GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE:
|
||||
height = pass_info.scale_y;
|
||||
break;
|
||||
|
||||
@ -1824,18 +1824,18 @@ CommonResources::CommonResources(VkDevice device,
|
||||
info.unnormalizedCoordinates = false;
|
||||
info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
|
||||
for (i = 0; i < VULKAN_FILTER_CHAIN_COUNT; i++)
|
||||
for (i = 0; i < GLSLANG_FILTER_CHAIN_COUNT; i++)
|
||||
{
|
||||
unsigned j;
|
||||
|
||||
switch (static_cast<vulkan_filter_chain_filter>(i))
|
||||
switch (static_cast<glslang_filter_chain_filter>(i))
|
||||
{
|
||||
case VULKAN_FILTER_CHAIN_LINEAR:
|
||||
case GLSLANG_FILTER_CHAIN_LINEAR:
|
||||
info.magFilter = VK_FILTER_LINEAR;
|
||||
info.minFilter = VK_FILTER_LINEAR;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_NEAREST:
|
||||
case GLSLANG_FILTER_CHAIN_NEAREST:
|
||||
info.magFilter = VK_FILTER_NEAREST;
|
||||
info.minFilter = VK_FILTER_NEAREST;
|
||||
break;
|
||||
@ -1844,17 +1844,17 @@ CommonResources::CommonResources(VkDevice device,
|
||||
break;
|
||||
}
|
||||
|
||||
for (j = 0; j < VULKAN_FILTER_CHAIN_COUNT; j++)
|
||||
for (j = 0; j < GLSLANG_FILTER_CHAIN_COUNT; j++)
|
||||
{
|
||||
unsigned k;
|
||||
|
||||
switch (static_cast<vulkan_filter_chain_filter>(j))
|
||||
switch (static_cast<glslang_filter_chain_filter>(j))
|
||||
{
|
||||
case VULKAN_FILTER_CHAIN_LINEAR:
|
||||
case GLSLANG_FILTER_CHAIN_LINEAR:
|
||||
info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_NEAREST:
|
||||
case GLSLANG_FILTER_CHAIN_NEAREST:
|
||||
info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
||||
break;
|
||||
|
||||
@ -1862,29 +1862,29 @@ CommonResources::CommonResources(VkDevice device,
|
||||
break;
|
||||
}
|
||||
|
||||
for (k = 0; k < VULKAN_FILTER_CHAIN_ADDRESS_COUNT; k++)
|
||||
for (k = 0; k < GLSLANG_FILTER_CHAIN_ADDRESS_COUNT; k++)
|
||||
{
|
||||
VkSamplerAddressMode mode = VK_SAMPLER_ADDRESS_MODE_MAX_ENUM;
|
||||
|
||||
switch (static_cast<vulkan_filter_chain_address>(k))
|
||||
switch (static_cast<glslang_filter_chain_address>(k))
|
||||
{
|
||||
case VULKAN_FILTER_CHAIN_ADDRESS_REPEAT:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT:
|
||||
mode = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT:
|
||||
mode = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE:
|
||||
mode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER:
|
||||
mode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
|
||||
break;
|
||||
|
||||
case VULKAN_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE:
|
||||
case GLSLANG_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE:
|
||||
mode = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
|
||||
break;
|
||||
|
||||
@ -2512,7 +2512,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_new(
|
||||
|
||||
vulkan_filter_chain_t *vulkan_filter_chain_create_default(
|
||||
const struct vulkan_filter_chain_create_info *info,
|
||||
vulkan_filter_chain_filter filter)
|
||||
glslang_filter_chain_filter filter)
|
||||
{
|
||||
struct vulkan_filter_chain_pass_info pass_info;
|
||||
auto tmpinfo = *info;
|
||||
@ -2523,14 +2523,14 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_default(
|
||||
if (!chain)
|
||||
return nullptr;
|
||||
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
pass_info.rt_format = tmpinfo.swapchain.format;
|
||||
pass_info.source_filter = filter;
|
||||
pass_info.mip_filter = VULKAN_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
chain->set_pass_info(0, pass_info);
|
||||
@ -2550,7 +2550,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_default(
|
||||
|
||||
vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
const struct vulkan_filter_chain_create_info *info,
|
||||
const char *path, vulkan_filter_chain_filter filter)
|
||||
const char *path, glslang_filter_chain_filter filter)
|
||||
{
|
||||
unsigned i;
|
||||
config_file_t *conf = NULL;
|
||||
@ -2588,14 +2588,14 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
const video_shader_pass *next_pass =
|
||||
i + 1 < shader->passes ? &shader->pass[i + 1] : nullptr;
|
||||
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_ORIGINAL;
|
||||
pass_info.scale_x = 0.0f;
|
||||
pass_info.scale_y = 0.0f;
|
||||
pass_info.rt_format = VK_FORMAT_UNDEFINED;
|
||||
pass_info.source_filter = VULKAN_FILTER_CHAIN_LINEAR;
|
||||
pass_info.mip_filter = VULKAN_FILTER_CHAIN_LINEAR;
|
||||
pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
pass_info.source_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_LINEAR;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
if (!glslang_compile_shader(pass->source.path, &output))
|
||||
@ -2674,10 +2674,11 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
else
|
||||
{
|
||||
pass_info.source_filter =
|
||||
pass->filter == RARCH_FILTER_LINEAR ? VULKAN_FILTER_CHAIN_LINEAR :
|
||||
VULKAN_FILTER_CHAIN_NEAREST;
|
||||
pass->filter == RARCH_FILTER_LINEAR
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
}
|
||||
pass_info.address = vk_wrap_to_address(pass->wrap);
|
||||
pass_info.address = rarch_wrap_to_address(pass->wrap);
|
||||
pass_info.max_levels = 1;
|
||||
|
||||
/* TODO: Expose max_levels in slangp.
|
||||
@ -2688,7 +2689,8 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
pass_info.max_levels = ~0u;
|
||||
|
||||
pass_info.mip_filter = pass->filter != RARCH_FILTER_NEAREST && pass_info.max_levels > 1
|
||||
? VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST;
|
||||
? GLSLANG_FILTER_CHAIN_LINEAR
|
||||
: GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
|
||||
bool explicit_format = output.meta.rt_format != SLANG_FORMAT_UNKNOWN;
|
||||
|
||||
@ -2698,15 +2700,15 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
|
||||
if (!pass->fbo.valid)
|
||||
{
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
|
||||
if (i + 1 == shader->passes)
|
||||
{
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.rt_format = tmpinfo.swapchain.format;
|
||||
|
||||
if (explicit_format)
|
||||
@ -2739,17 +2741,17 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
{
|
||||
case RARCH_SCALE_INPUT:
|
||||
pass_info.scale_x = pass->fbo.scale_x;
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_ABSOLUTE:
|
||||
pass_info.scale_x = float(pass->fbo.abs_x);
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_VIEWPORT:
|
||||
pass_info.scale_x = pass->fbo.scale_x;
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2757,17 +2759,17 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
{
|
||||
case RARCH_SCALE_INPUT:
|
||||
pass_info.scale_y = pass->fbo.scale_y;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_SOURCE;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_ABSOLUTE:
|
||||
pass_info.scale_y = float(pass->fbo.abs_y);
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_ABSOLUTE;
|
||||
break;
|
||||
|
||||
case RARCH_SCALE_VIEWPORT:
|
||||
pass_info.scale_y = pass->fbo.scale_y;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2779,16 +2781,16 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
{
|
||||
struct vulkan_filter_chain_pass_info pass_info;
|
||||
|
||||
pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_VIEWPORT;
|
||||
pass_info.scale_x = 1.0f;
|
||||
pass_info.scale_y = 1.0f;
|
||||
|
||||
pass_info.rt_format = tmpinfo.swapchain.format;
|
||||
|
||||
pass_info.source_filter = filter;
|
||||
pass_info.mip_filter = VULKAN_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
pass_info.mip_filter = GLSLANG_FILTER_CHAIN_NEAREST;
|
||||
pass_info.address = GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
|
||||
pass_info.max_levels = 0;
|
||||
|
||||
|
@ -23,29 +23,14 @@
|
||||
#include <boolean.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include "glslang_util.h"
|
||||
|
||||
#include "../common/vulkan_common.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
typedef struct vulkan_filter_chain vulkan_filter_chain_t;
|
||||
|
||||
enum vulkan_filter_chain_filter
|
||||
{
|
||||
VULKAN_FILTER_CHAIN_LINEAR = 0,
|
||||
VULKAN_FILTER_CHAIN_NEAREST = 1,
|
||||
VULKAN_FILTER_CHAIN_COUNT
|
||||
};
|
||||
|
||||
enum vulkan_filter_chain_address
|
||||
{
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_REPEAT = 0,
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT = 1,
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE = 2,
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER = 3,
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE = 4,
|
||||
VULKAN_FILTER_CHAIN_ADDRESS_COUNT
|
||||
};
|
||||
|
||||
struct vulkan_filter_chain_texture
|
||||
{
|
||||
VkImage image;
|
||||
@ -56,20 +41,12 @@ struct vulkan_filter_chain_texture
|
||||
VkFormat format;
|
||||
};
|
||||
|
||||
enum vulkan_filter_chain_scale
|
||||
{
|
||||
VULKAN_FILTER_CHAIN_SCALE_ORIGINAL,
|
||||
VULKAN_FILTER_CHAIN_SCALE_SOURCE,
|
||||
VULKAN_FILTER_CHAIN_SCALE_VIEWPORT,
|
||||
VULKAN_FILTER_CHAIN_SCALE_ABSOLUTE
|
||||
};
|
||||
|
||||
struct vulkan_filter_chain_pass_info
|
||||
{
|
||||
/* For the last pass, make sure VIEWPORT scale
|
||||
* with scale factors of 1 are used. */
|
||||
enum vulkan_filter_chain_scale scale_type_x;
|
||||
enum vulkan_filter_chain_scale scale_type_y;
|
||||
enum glslang_filter_chain_scale scale_type_x;
|
||||
enum glslang_filter_chain_scale scale_type_y;
|
||||
float scale_x;
|
||||
float scale_y;
|
||||
|
||||
@ -77,9 +54,9 @@ struct vulkan_filter_chain_pass_info
|
||||
VkFormat rt_format;
|
||||
|
||||
/* The filter to use for source in this pass. */
|
||||
enum vulkan_filter_chain_filter source_filter;
|
||||
enum vulkan_filter_chain_filter mip_filter;
|
||||
enum vulkan_filter_chain_address address;
|
||||
enum glslang_filter_chain_filter source_filter;
|
||||
enum glslang_filter_chain_filter mip_filter;
|
||||
enum glslang_filter_chain_address address;
|
||||
|
||||
/* Maximum number of mip-levels to use. */
|
||||
unsigned max_levels;
|
||||
@ -111,25 +88,6 @@ struct vulkan_filter_chain_create_info
|
||||
struct vulkan_filter_chain_swapchain_info swapchain;
|
||||
};
|
||||
|
||||
static INLINE enum vulkan_filter_chain_address vk_wrap_to_address(enum gfx_wrap_type type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case RARCH_WRAP_BORDER:
|
||||
return VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER;
|
||||
case RARCH_WRAP_REPEAT:
|
||||
return VULKAN_FILTER_CHAIN_ADDRESS_REPEAT;
|
||||
case RARCH_WRAP_MIRRORED_REPEAT:
|
||||
return VULKAN_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT;
|
||||
case RARCH_WRAP_EDGE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE;
|
||||
}
|
||||
|
||||
|
||||
vulkan_filter_chain_t *vulkan_filter_chain_new(
|
||||
const struct vulkan_filter_chain_create_info *info);
|
||||
void vulkan_filter_chain_free(vulkan_filter_chain_t *chain);
|
||||
@ -178,11 +136,11 @@ void vulkan_filter_chain_end_frame(vulkan_filter_chain_t *chain,
|
||||
|
||||
vulkan_filter_chain_t *vulkan_filter_chain_create_default(
|
||||
const struct vulkan_filter_chain_create_info *info,
|
||||
enum vulkan_filter_chain_filter filter);
|
||||
enum glslang_filter_chain_filter filter);
|
||||
|
||||
vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
|
||||
const struct vulkan_filter_chain_create_info *info,
|
||||
const char *path, enum vulkan_filter_chain_filter filter);
|
||||
const char *path, enum glslang_filter_chain_filter filter);
|
||||
|
||||
struct video_shader *vulkan_filter_chain_get_preset(
|
||||
vulkan_filter_chain_t *chain);
|
||||
|
Loading…
x
Reference in New Issue
Block a user