mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-26 17:50:56 +00:00
Add OriginalAspect and OriginalAspectRot uniforms (#17123)
Some checks are pending
CI 3DS / build (push) Waiting to run
CI Android / build (push) Waiting to run
CI DOS/DJGPP / build (push) Waiting to run
CI Emscripten / build (push) Waiting to run
CI GameCube / build (push) Waiting to run
CI Linux (i686) / build (push) Waiting to run
CI Windows (MSVC) / msvc (Debug, x64, 2019) (push) Waiting to run
CI Windows (MSVC) / msvc (Debug, x64, 2022) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, 2019) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, 2022) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, UWP) (push) Waiting to run
CI Windows (MSVC) / msvc (ReleaseAngle, x64, UWP) (push) Waiting to run
CI macOS / build (push) Waiting to run
CI Miyoo ARM32 / build (push) Waiting to run
CI PS2 / build (push) Waiting to run
CI PS4/ORBIS / build (push) Waiting to run
CI PSP / build (push) Waiting to run
CI PSVita / build (push) Waiting to run
CI RS90 Odbeta MIPS32 / build (push) Waiting to run
CI RetroFW MIPS32 / build (push) Waiting to run
CI Switch/libnx / build (push) Waiting to run
CI Wii / build (push) Waiting to run
CI WiiU / build (push) Waiting to run
CI Windows i686 (MXE) / build (push) Waiting to run
CI Windows x64 (MXE) / build (push) Waiting to run
RetroArch CI / linux-c89 (push) Waiting to run
CI webOS / build (push) Waiting to run
Some checks are pending
CI 3DS / build (push) Waiting to run
CI Android / build (push) Waiting to run
CI DOS/DJGPP / build (push) Waiting to run
CI Emscripten / build (push) Waiting to run
CI GameCube / build (push) Waiting to run
CI Linux (i686) / build (push) Waiting to run
CI Windows (MSVC) / msvc (Debug, x64, 2019) (push) Waiting to run
CI Windows (MSVC) / msvc (Debug, x64, 2022) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, 2019) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, 2022) (push) Waiting to run
CI Windows (MSVC) / msvc (Release, x64, UWP) (push) Waiting to run
CI Windows (MSVC) / msvc (ReleaseAngle, x64, UWP) (push) Waiting to run
CI macOS / build (push) Waiting to run
CI Miyoo ARM32 / build (push) Waiting to run
CI PS2 / build (push) Waiting to run
CI PS4/ORBIS / build (push) Waiting to run
CI PSP / build (push) Waiting to run
CI PSVita / build (push) Waiting to run
CI RS90 Odbeta MIPS32 / build (push) Waiting to run
CI RetroFW MIPS32 / build (push) Waiting to run
CI Switch/libnx / build (push) Waiting to run
CI Wii / build (push) Waiting to run
CI WiiU / build (push) Waiting to run
CI Windows i686 (MXE) / build (push) Waiting to run
CI Windows x64 (MXE) / build (push) Waiting to run
RetroArch CI / linux-c89 (push) Waiting to run
CI webOS / build (push) Waiting to run
* Initial implementation of CoreAspect uniform * float -> float_t * Possibly fix wii_u building * vulkan: use float instead of float_t; * slangp: Advertise support of CoreAspect uniform by defining _RARCH_HAS_COREASPECT_UNIFORM early in the shader source, just after "#extension GL_GOOGLE_cpp_style_line_directive : require" * CoreAspect + glsl fix: use glUniform1f() * Add CoreAspectRot uniform. It reports CoreAspect value or 1/CoreAspect when the content is rotated by 90 or 270 deg. * Fixed stupid typo * Just use _HAS_COREASPECT_UNIFORMS to check for CoreAspect uniforms support (was _RARCH_HAS_COREASPECT_UNIFORMS) * Rename CoreAspect, CoreAspectRot, _HAS_COREASPECT_UNIFORMS to OriginalAspect, OriginlAspectRot, _HAS_ORIGINALASPECT_UNIFORMS * GLCore: void Pass::build_semantic_float needs glUniform1f. ...how on earth did it worked for UBO !? * d3d10,11,12, wrong function called by overlook. * Add test shader, will remove that before PR * Fix metal rotated aspect reporting * remove test shader * Fix C89 Build * Use OriginalAspectRotated instead of OriginalAspectRot
This commit is contained in:
parent
99610f0de6
commit
da5ecaa45a
@ -218,6 +218,9 @@ typedef struct
|
|||||||
uint32_t rotation;
|
uint32_t rotation;
|
||||||
uint32_t total_subframes;
|
uint32_t total_subframes;
|
||||||
uint32_t current_subframe;
|
uint32_t current_subframe;
|
||||||
|
float core_aspect;
|
||||||
|
float core_aspect_rot;
|
||||||
|
|
||||||
} pass[GFX_MAX_SHADERS];
|
} pass[GFX_MAX_SHADERS];
|
||||||
|
|
||||||
struct video_shader* shader_preset;
|
struct video_shader* shader_preset;
|
||||||
|
@ -294,6 +294,8 @@ typedef struct
|
|||||||
uint32_t rotation;
|
uint32_t rotation;
|
||||||
uint32_t total_subframes;
|
uint32_t total_subframes;
|
||||||
uint32_t current_subframe;
|
uint32_t current_subframe;
|
||||||
|
float core_aspect;
|
||||||
|
float core_aspect_rot;
|
||||||
} pass[GFX_MAX_SHADERS];
|
} pass[GFX_MAX_SHADERS];
|
||||||
|
|
||||||
struct video_shader* shader_preset;
|
struct video_shader* shader_preset;
|
||||||
|
@ -331,6 +331,8 @@ typedef struct
|
|||||||
uint32_t rotation;
|
uint32_t rotation;
|
||||||
uint32_t total_subframes;
|
uint32_t total_subframes;
|
||||||
uint32_t current_subframe;
|
uint32_t current_subframe;
|
||||||
|
float core_aspect;
|
||||||
|
float core_aspect_rot;
|
||||||
D3D12_GPU_DESCRIPTOR_HANDLE textures;
|
D3D12_GPU_DESCRIPTOR_HANDLE textures;
|
||||||
D3D12_GPU_DESCRIPTOR_HANDLE samplers;
|
D3D12_GPU_DESCRIPTOR_HANDLE samplers;
|
||||||
} pass[GFX_MAX_SHADERS];
|
} pass[GFX_MAX_SHADERS];
|
||||||
|
@ -1336,6 +1336,8 @@ static bool d3d10_gfx_set_shader(void* data,
|
|||||||
&d3d10->pass[i].frame_count, /* FrameCount */
|
&d3d10->pass[i].frame_count, /* FrameCount */
|
||||||
&d3d10->pass[i].frame_direction, /* FrameDirection */
|
&d3d10->pass[i].frame_direction, /* FrameDirection */
|
||||||
&d3d10->pass[i].rotation, /* Rotation */
|
&d3d10->pass[i].rotation, /* Rotation */
|
||||||
|
&d3d10->pass[i].core_aspect, /* OriginalAspect */
|
||||||
|
&d3d10->pass[i].core_aspect_rot, /* OriginalAspectRotated */
|
||||||
&d3d10->pass[i].total_subframes, /* TotalSubFrames */
|
&d3d10->pass[i].total_subframes, /* TotalSubFrames */
|
||||||
&d3d10->pass[i].current_subframe,/* CurrentSubFrame */
|
&d3d10->pass[i].current_subframe,/* CurrentSubFrame */
|
||||||
}
|
}
|
||||||
@ -2331,6 +2333,14 @@ static bool d3d10_gfx_frame(
|
|||||||
|
|
||||||
d3d10->pass[i].rotation = retroarch_get_rotation();
|
d3d10->pass[i].rotation = retroarch_get_rotation();
|
||||||
|
|
||||||
|
d3d10->pass[i].core_aspect = video_driver_get_core_aspect();
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
d3d10->pass[i].core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
d3d10->pass[i].core_aspect_rot = 1/d3d10->pass[i].core_aspect_rot;
|
||||||
|
|
||||||
/* Sub-frame info for multiframe shaders (per real content frame).
|
/* Sub-frame info for multiframe shaders (per real content frame).
|
||||||
Should always be 1 for non-use of subframes */
|
Should always be 1 for non-use of subframes */
|
||||||
if (!(d3d10->flags & D3D10_ST_FLAG_FRAME_DUPE_LOCK))
|
if (!(d3d10->flags & D3D10_ST_FLAG_FRAME_DUPE_LOCK))
|
||||||
|
@ -1538,6 +1538,8 @@ static bool d3d11_gfx_set_shader(void* data, enum rarch_shader_type type, const
|
|||||||
&d3d11->pass[i].frame_count, /* FrameCount */
|
&d3d11->pass[i].frame_count, /* FrameCount */
|
||||||
&d3d11->pass[i].frame_direction, /* FrameDirection */
|
&d3d11->pass[i].frame_direction, /* FrameDirection */
|
||||||
&d3d11->pass[i].rotation, /* Rotation */
|
&d3d11->pass[i].rotation, /* Rotation */
|
||||||
|
&d3d11->pass[i].core_aspect, /* OriginalAspect */
|
||||||
|
&d3d11->pass[i].core_aspect_rot, /* OriginalAspectRotated */
|
||||||
&d3d11->pass[i].total_subframes, /* TotalSubFrames */
|
&d3d11->pass[i].total_subframes, /* TotalSubFrames */
|
||||||
&d3d11->pass[i].current_subframe,/* CurrentSubFrame */
|
&d3d11->pass[i].current_subframe,/* CurrentSubFrame */
|
||||||
}
|
}
|
||||||
@ -3094,6 +3096,14 @@ static bool d3d11_gfx_frame(
|
|||||||
|
|
||||||
d3d11->pass[i].rotation = retroarch_get_rotation();
|
d3d11->pass[i].rotation = retroarch_get_rotation();
|
||||||
|
|
||||||
|
d3d11->pass[i].core_aspect = video_driver_get_core_aspect();
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
d3d11->pass[i].core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
d3d11->pass[i].core_aspect_rot = 1/d3d11->pass[i].core_aspect_rot;
|
||||||
|
|
||||||
/* Sub-frame info for multiframe shaders (per real content frame).
|
/* Sub-frame info for multiframe shaders (per real content frame).
|
||||||
Should always be 1 for non-use of subframes */
|
Should always be 1 for non-use of subframes */
|
||||||
if (!(d3d11->flags & D3D11_ST_FLAG_FRAME_DUPE_LOCK))
|
if (!(d3d11->flags & D3D11_ST_FLAG_FRAME_DUPE_LOCK))
|
||||||
|
@ -1725,6 +1725,8 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
|
|||||||
&d3d12->pass[i].frame_count, /* FrameCount */
|
&d3d12->pass[i].frame_count, /* FrameCount */
|
||||||
&d3d12->pass[i].frame_direction, /* FrameDirection */
|
&d3d12->pass[i].frame_direction, /* FrameDirection */
|
||||||
&d3d12->pass[i].rotation, /* Rotation */
|
&d3d12->pass[i].rotation, /* Rotation */
|
||||||
|
&d3d12->pass[i].core_aspect, /* OriginalAspect */
|
||||||
|
&d3d12->pass[i].core_aspect_rot, /* OriginalAspectRotated */
|
||||||
&d3d12->pass[i].total_subframes, /* TotalSubFrames */
|
&d3d12->pass[i].total_subframes, /* TotalSubFrames */
|
||||||
&d3d12->pass[i].current_subframe,/* CurrentSubFrame */
|
&d3d12->pass[i].current_subframe,/* CurrentSubFrame */
|
||||||
}
|
}
|
||||||
@ -3595,6 +3597,14 @@ static bool d3d12_gfx_frame(
|
|||||||
|
|
||||||
d3d12->pass[i].rotation = retroarch_get_rotation();
|
d3d12->pass[i].rotation = retroarch_get_rotation();
|
||||||
|
|
||||||
|
d3d12->pass[i].core_aspect = video_driver_get_core_aspect();
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
d3d12->pass[i].core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
d3d12->pass[i].core_aspect_rot = 1/d3d12->pass[i].core_aspect_rot;
|
||||||
|
|
||||||
/* Sub-frame info for multiframe shaders (per real content frame).
|
/* Sub-frame info for multiframe shaders (per real content frame).
|
||||||
Should always be 1 for non-use of subframes */
|
Should always be 1 for non-use of subframes */
|
||||||
if (!(d3d12->flags & D3D12_ST_FLAG_FRAME_DUPE_LOCK))
|
if (!(d3d12->flags & D3D12_ST_FLAG_FRAME_DUPE_LOCK))
|
||||||
|
@ -2744,6 +2744,15 @@ static bool gl3_frame(void *data, const void *frame,
|
|||||||
#endif
|
#endif
|
||||||
gl3_filter_chain_set_rotation(gl->filter_chain, retroarch_get_rotation());
|
gl3_filter_chain_set_rotation(gl->filter_chain, retroarch_get_rotation());
|
||||||
|
|
||||||
|
gl3_filter_chain_set_core_aspect(gl->filter_chain, video_driver_get_core_aspect());
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
float core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
core_aspect_rot = 1/core_aspect_rot;
|
||||||
|
gl3_filter_chain_set_core_aspect_rot(gl->filter_chain, core_aspect_rot);
|
||||||
|
|
||||||
/* Sub-frame info for multiframe shaders (per real content frame).
|
/* Sub-frame info for multiframe shaders (per real content frame).
|
||||||
Should always be 1 for non-use of subframes*/
|
Should always be 1 for non-use of subframes*/
|
||||||
if (!(gl->flags & GL3_FLAG_FRAME_DUPE_LOCK))
|
if (!(gl->flags & GL3_FLAG_FRAME_DUPE_LOCK))
|
||||||
|
@ -1665,7 +1665,7 @@ static bool wiiu_init_frame_textures(wiiu_video_t *wiiu, unsigned width, unsigne
|
|||||||
static void gx2_update_uniform_block(wiiu_video_t *wiiu,
|
static void gx2_update_uniform_block(wiiu_video_t *wiiu,
|
||||||
int pass, float *ubo, int id,
|
int pass, float *ubo, int id,
|
||||||
int size, int uniformVarCount, GX2UniformVar *uniformVars,
|
int size, int uniformVarCount, GX2UniformVar *uniformVars,
|
||||||
uint64_t frame_count, int32_t frame_direction, uint32_t rotation)
|
uint64_t frame_count, int32_t frame_direction, uint32_t rotation, float core_aspect, float core_aspect_rot)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
for (i = 0; i < uniformVarCount; i++)
|
for (i = 0; i < uniformVarCount; i++)
|
||||||
@ -1723,6 +1723,18 @@ static void gx2_update_uniform_block(wiiu_video_t *wiiu,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string_is_equal(id, "OriginalAspect"))
|
||||||
|
{
|
||||||
|
*dst = core_aspect;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string_is_equal(id, "OriginalAspectRotated"))
|
||||||
|
{
|
||||||
|
*dst = core_aspect_rot;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (string_is_equal(id, "OriginalSize"))
|
if (string_is_equal(id, "OriginalSize"))
|
||||||
{
|
{
|
||||||
((GX2_vec4 *)dst)->x = wiiu->texture.surface.width;
|
((GX2_vec4 *)dst)->x = wiiu->texture.surface.width;
|
||||||
@ -1940,6 +1952,13 @@ static bool gx2_frame(void *data, const void *frame,
|
|||||||
#endif
|
#endif
|
||||||
uint32_t rotation = retroarch_get_rotation();
|
uint32_t rotation = retroarch_get_rotation();
|
||||||
|
|
||||||
|
float core_aspect = video_driver_get_core_aspect();
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
float core_aspect_rot = core_aspect;
|
||||||
|
if (rotation == 1 || rotation == 3)
|
||||||
|
core_aspect_rot = 1/core_aspect;
|
||||||
|
|
||||||
for (i = 0; i < wiiu->shader_preset->passes; i++)
|
for (i = 0; i < wiiu->shader_preset->passes; i++)
|
||||||
{
|
{
|
||||||
unsigned j;
|
unsigned j;
|
||||||
@ -1950,7 +1969,7 @@ static bool gx2_frame(void *data, const void *frame,
|
|||||||
gx2_update_uniform_block(wiiu, i, wiiu->pass[i].vs_ubos[j], j,
|
gx2_update_uniform_block(wiiu, i, wiiu->pass[i].vs_ubos[j], j,
|
||||||
wiiu->pass[i].gfd->vs->uniformBlocks[j].size,
|
wiiu->pass[i].gfd->vs->uniformBlocks[j].size,
|
||||||
wiiu->pass[i].gfd->vs->uniformVarCount, wiiu->pass[i].gfd->vs->uniformVars,
|
wiiu->pass[i].gfd->vs->uniformVarCount, wiiu->pass[i].gfd->vs->uniformVars,
|
||||||
frame_count, frame_direction, rotation);
|
frame_count, frame_direction, rotation, core_aspect, core_aspect_rot);
|
||||||
GX2SetVertexUniformBlock(wiiu->pass[i].gfd->vs->uniformBlocks[j].offset,
|
GX2SetVertexUniformBlock(wiiu->pass[i].gfd->vs->uniformBlocks[j].offset,
|
||||||
wiiu->pass[i].gfd->vs->uniformBlocks[j].size, wiiu->pass[i].vs_ubos[j]);
|
wiiu->pass[i].gfd->vs->uniformBlocks[j].size, wiiu->pass[i].vs_ubos[j]);
|
||||||
}
|
}
|
||||||
@ -1962,7 +1981,7 @@ static bool gx2_frame(void *data, const void *frame,
|
|||||||
gx2_update_uniform_block(wiiu, i, wiiu->pass[i].ps_ubos[j], j,
|
gx2_update_uniform_block(wiiu, i, wiiu->pass[i].ps_ubos[j], j,
|
||||||
wiiu->pass[i].gfd->ps->uniformBlocks[j].size,
|
wiiu->pass[i].gfd->ps->uniformBlocks[j].size,
|
||||||
wiiu->pass[i].gfd->ps->uniformVarCount, wiiu->pass[i].gfd->ps->uniformVars,
|
wiiu->pass[i].gfd->ps->uniformVarCount, wiiu->pass[i].gfd->ps->uniformVars,
|
||||||
frame_count, frame_direction, rotation);
|
frame_count, frame_direction, rotation, core_aspect, core_aspect_rot);
|
||||||
GX2SetPixelUniformBlock(wiiu->pass[i].gfd->ps->uniformBlocks[j].offset,
|
GX2SetPixelUniformBlock(wiiu->pass[i].gfd->ps->uniformBlocks[j].offset,
|
||||||
wiiu->pass[i].gfd->ps->uniformBlocks[j].size, wiiu->pass[i].ps_ubos[j]);
|
wiiu->pass[i].gfd->ps->uniformBlocks[j].size, wiiu->pass[i].ps_ubos[j]);
|
||||||
}
|
}
|
||||||
|
@ -1206,6 +1206,8 @@ typedef struct MTLALIGN(16)
|
|||||||
uint32_t frame_count;
|
uint32_t frame_count;
|
||||||
int32_t frame_direction;
|
int32_t frame_direction;
|
||||||
uint32_t rotation;
|
uint32_t rotation;
|
||||||
|
float_t core_aspect;
|
||||||
|
float_t core_aspect_rot;
|
||||||
pass_semantics_t semantics;
|
pass_semantics_t semantics;
|
||||||
MTLViewport viewport;
|
MTLViewport viewport;
|
||||||
__unsafe_unretained id<MTLRenderPipelineState> _state;
|
__unsafe_unretained id<MTLRenderPipelineState> _state;
|
||||||
@ -1579,6 +1581,15 @@ typedef struct MTLALIGN(16)
|
|||||||
|
|
||||||
_engine.pass[i].rotation = retroarch_get_rotation();
|
_engine.pass[i].rotation = retroarch_get_rotation();
|
||||||
|
|
||||||
|
_engine.pass[i].core_aspect = video_driver_get_core_aspect();
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
int rot = retroarch_get_rotation();
|
||||||
|
float core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
core_aspect_rot = 1/core_aspect_rot;
|
||||||
|
_engine.pass[i].core_aspect_rot = core_aspect_rot;
|
||||||
|
|
||||||
for (j = 0; j < SLANG_CBUFFER_MAX; j++)
|
for (j = 0; j < SLANG_CBUFFER_MAX; j++)
|
||||||
{
|
{
|
||||||
id<MTLBuffer> buffer = _engine.pass[i].buffers[j];
|
id<MTLBuffer> buffer = _engine.pass[i].buffers[j];
|
||||||
@ -1836,6 +1847,8 @@ typedef struct MTLALIGN(16)
|
|||||||
&_engine.pass[i].frame_count, /* FrameCount */
|
&_engine.pass[i].frame_count, /* FrameCount */
|
||||||
&_engine.pass[i].frame_direction, /* FrameDirection */
|
&_engine.pass[i].frame_direction, /* FrameDirection */
|
||||||
&_engine.pass[i].rotation, /* Rotation */
|
&_engine.pass[i].rotation, /* Rotation */
|
||||||
|
&_engine.pass[i].core_aspect, /* OriginalAspect */
|
||||||
|
&_engine.pass[i].core_aspect_rot, /* OriginalAspectRotated */
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
@ -4574,6 +4574,17 @@ static bool vulkan_frame(void *data, const void *frame,
|
|||||||
vulkan_filter_chain_set_rotation(
|
vulkan_filter_chain_set_rotation(
|
||||||
(vulkan_filter_chain_t*)vk->filter_chain, retroarch_get_rotation());
|
(vulkan_filter_chain_t*)vk->filter_chain, retroarch_get_rotation());
|
||||||
|
|
||||||
|
vulkan_filter_chain_set_core_aspect(
|
||||||
|
(vulkan_filter_chain_t*)vk->filter_chain, video_driver_get_core_aspect());
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
float core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
core_aspect_rot = 1/core_aspect_rot;
|
||||||
|
vulkan_filter_chain_set_core_aspect_rot(
|
||||||
|
(vulkan_filter_chain_t*)vk->filter_chain, core_aspect_rot);
|
||||||
|
|
||||||
/* Render offscreen filter chain passes. */
|
/* Render offscreen filter chain passes. */
|
||||||
{
|
{
|
||||||
/* Set the source texture in the filter chain */
|
/* Set the source texture in the filter chain */
|
||||||
|
@ -177,17 +177,21 @@ bool glslang_read_shader_file(const char *path,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add defines about supported retroarch features */
|
||||||
|
if (!string_list_append(output, "#define _HAS_ORIGINALASPECT_UNIFORMS", attr))
|
||||||
|
goto error;
|
||||||
|
|
||||||
/* At least VIM treats the first line as line #1,
|
/* At least VIM treats the first line as line #1,
|
||||||
* so offset everything by one. */
|
* so offset everything by one. */
|
||||||
snprintf(tmp, sizeof(tmp), "#line %u \"%s\"", root_file ? 2 : 1, basename);
|
snprintf(tmp, sizeof(tmp), "#line %u \"%s\"", root_file ? 2 : 1, basename);
|
||||||
if (!string_list_append(output, tmp, attr))
|
if (!string_list_append(output, tmp, attr))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Loop through lines of file */
|
/* Loop through lines of file */
|
||||||
for (i = root_file ? 1 : 0; i < lines.size; i++)
|
for (i = root_file ? 1 : 0; i < lines.size; i++)
|
||||||
{
|
{
|
||||||
const char *line = lines.elems[i].data;
|
const char *line = lines.elems[i].data;
|
||||||
|
|
||||||
/* Check for 'include' statements */
|
/* Check for 'include' statements */
|
||||||
bool include_optional = !strncmp("#pragma include_optional ", line, STRLEN_CONST("#pragma include_optional "));
|
bool include_optional = !strncmp("#pragma include_optional ", line, STRLEN_CONST("#pragma include_optional "));
|
||||||
if ( !strncmp("#include ", line, STRLEN_CONST("#include ")) || include_optional )
|
if ( !strncmp("#include ", line, STRLEN_CONST("#include ")) || include_optional )
|
||||||
|
@ -757,6 +757,16 @@ public:
|
|||||||
rotation = rot;
|
rotation = rot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_core_aspect(float coreaspect)
|
||||||
|
{
|
||||||
|
core_aspect = coreaspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_core_aspect_rot(float coreaspectrot)
|
||||||
|
{
|
||||||
|
core_aspect_rot = coreaspectrot;
|
||||||
|
}
|
||||||
|
|
||||||
void set_shader_subframes(uint32_t tot_subframes)
|
void set_shader_subframes(uint32_t tot_subframes)
|
||||||
{
|
{
|
||||||
total_subframes = tot_subframes;
|
total_subframes = tot_subframes;
|
||||||
@ -855,6 +865,8 @@ private:
|
|||||||
slang_semantic semantic, uint32_t value);
|
slang_semantic semantic, uint32_t value);
|
||||||
void build_semantic_int(uint8_t *data,
|
void build_semantic_int(uint8_t *data,
|
||||||
slang_semantic semantic, int32_t value);
|
slang_semantic semantic, int32_t value);
|
||||||
|
void build_semantic_float(uint8_t *data,
|
||||||
|
slang_semantic semantic, float value);
|
||||||
void build_semantic_parameter(uint8_t *data, unsigned index, float value);
|
void build_semantic_parameter(uint8_t *data, unsigned index, float value);
|
||||||
void build_semantic_texture_vec4(uint8_t *data,
|
void build_semantic_texture_vec4(uint8_t *data,
|
||||||
slang_texture_semantic semantic,
|
slang_texture_semantic semantic,
|
||||||
@ -872,6 +884,8 @@ private:
|
|||||||
unsigned frame_count_period = 0;
|
unsigned frame_count_period = 0;
|
||||||
int32_t frame_direction = 1;
|
int32_t frame_direction = 1;
|
||||||
uint32_t rotation = 0;
|
uint32_t rotation = 0;
|
||||||
|
float core_aspect = 0;
|
||||||
|
float core_aspect_rot = 0;
|
||||||
unsigned pass_number = 0;
|
unsigned pass_number = 0;
|
||||||
uint32_t total_subframes = 1;
|
uint32_t total_subframes = 1;
|
||||||
uint32_t current_subframe = 1;
|
uint32_t current_subframe = 1;
|
||||||
@ -1080,6 +1094,8 @@ bool Pass::init_pipeline()
|
|||||||
reflect_parameter("FrameCount", reflection.semantics[SLANG_SEMANTIC_FRAME_COUNT]);
|
reflect_parameter("FrameCount", reflection.semantics[SLANG_SEMANTIC_FRAME_COUNT]);
|
||||||
reflect_parameter("FrameDirection", reflection.semantics[SLANG_SEMANTIC_FRAME_DIRECTION]);
|
reflect_parameter("FrameDirection", reflection.semantics[SLANG_SEMANTIC_FRAME_DIRECTION]);
|
||||||
reflect_parameter("Rotation", reflection.semantics[SLANG_SEMANTIC_ROTATION]);
|
reflect_parameter("Rotation", reflection.semantics[SLANG_SEMANTIC_ROTATION]);
|
||||||
|
reflect_parameter("OriginalAspect", reflection.semantics[SLANG_SEMANTIC_CORE_ASPECT]);
|
||||||
|
reflect_parameter("OriginalAspectRotated", reflection.semantics[SLANG_SEMANTIC_CORE_ASPECT_ROT]);
|
||||||
reflect_parameter("TotalSubFrames", reflection.semantics[SLANG_SEMANTIC_TOTAL_SUBFRAMES]);
|
reflect_parameter("TotalSubFrames", reflection.semantics[SLANG_SEMANTIC_TOTAL_SUBFRAMES]);
|
||||||
reflect_parameter("CurrentSubFrame", reflection.semantics[SLANG_SEMANTIC_CURRENT_SUBFRAME]);
|
reflect_parameter("CurrentSubFrame", reflection.semantics[SLANG_SEMANTIC_CURRENT_SUBFRAME]);
|
||||||
|
|
||||||
@ -1319,6 +1335,38 @@ void Pass::build_semantic_int(uint8_t *data, slang_semantic semantic,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Pass::build_semantic_float(uint8_t *data, slang_semantic semantic,
|
||||||
|
float value)
|
||||||
|
{
|
||||||
|
auto &refl = reflection.semantics[semantic];
|
||||||
|
|
||||||
|
if (data && refl.uniform)
|
||||||
|
{
|
||||||
|
if (refl.location.ubo_vertex >= 0 || refl.location.ubo_fragment >= 0)
|
||||||
|
{
|
||||||
|
if (refl.location.ubo_vertex >= 0)
|
||||||
|
glUniform1f(refl.location.ubo_vertex, value);
|
||||||
|
if (refl.location.ubo_fragment >= 0)
|
||||||
|
glUniform1f(refl.location.ubo_fragment, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*reinterpret_cast<float *>(data + reflection.semantics[semantic].ubo_offset) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refl.push_constant)
|
||||||
|
{
|
||||||
|
if (refl.location.push_vertex >= 0 || refl.location.push_fragment >= 0)
|
||||||
|
{
|
||||||
|
if (refl.location.push_vertex >= 0)
|
||||||
|
glUniform1f(refl.location.push_vertex, value);
|
||||||
|
if (refl.location.push_fragment >= 0)
|
||||||
|
glUniform1f(refl.location.push_fragment, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*reinterpret_cast<float *>(push_constant_buffer.data() + refl.push_constant_offset) = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Pass::build_semantic_texture(uint8_t *buffer,
|
void Pass::build_semantic_texture(uint8_t *buffer,
|
||||||
slang_texture_semantic semantic, const Texture &texture)
|
slang_texture_semantic semantic, const Texture &texture)
|
||||||
{
|
{
|
||||||
@ -1515,6 +1563,12 @@ void Pass::build_semantics(uint8_t *buffer,
|
|||||||
build_semantic_uint(buffer, SLANG_SEMANTIC_ROTATION,
|
build_semantic_uint(buffer, SLANG_SEMANTIC_ROTATION,
|
||||||
rotation);
|
rotation);
|
||||||
|
|
||||||
|
build_semantic_float(buffer, SLANG_SEMANTIC_CORE_ASPECT,
|
||||||
|
core_aspect);
|
||||||
|
|
||||||
|
build_semantic_float(buffer, SLANG_SEMANTIC_CORE_ASPECT_ROT,
|
||||||
|
core_aspect_rot);
|
||||||
|
|
||||||
build_semantic_uint(buffer, SLANG_SEMANTIC_TOTAL_SUBFRAMES,
|
build_semantic_uint(buffer, SLANG_SEMANTIC_TOTAL_SUBFRAMES,
|
||||||
total_subframes);
|
total_subframes);
|
||||||
build_semantic_uint(buffer, SLANG_SEMANTIC_CURRENT_SUBFRAME,
|
build_semantic_uint(buffer, SLANG_SEMANTIC_CURRENT_SUBFRAME,
|
||||||
@ -1764,6 +1818,8 @@ public:
|
|||||||
void set_frame_count_period(unsigned pass, unsigned period);
|
void set_frame_count_period(unsigned pass, unsigned period);
|
||||||
void set_frame_direction(int32_t direction);
|
void set_frame_direction(int32_t direction);
|
||||||
void set_rotation(uint32_t rot);
|
void set_rotation(uint32_t rot);
|
||||||
|
void set_core_aspect(float coreaspect);
|
||||||
|
void set_core_aspect_rot(float coreaspectrot);
|
||||||
void set_shader_subframes(uint32_t tot_subframes);
|
void set_shader_subframes(uint32_t tot_subframes);
|
||||||
void set_current_shader_subframe(uint32_t cur_subframe);
|
void set_current_shader_subframe(uint32_t cur_subframe);
|
||||||
#ifdef GL3_ROLLING_SCANLINE_SIMULATION
|
#ifdef GL3_ROLLING_SCANLINE_SIMULATION
|
||||||
@ -2259,6 +2315,21 @@ void gl3_filter_chain::set_rotation(uint32_t rot)
|
|||||||
passes[i]->set_rotation(rot);
|
passes[i]->set_rotation(rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gl3_filter_chain::set_core_aspect(float coreaspect)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < passes.size(); i++)
|
||||||
|
passes[i]->set_core_aspect(coreaspect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gl3_filter_chain::set_core_aspect_rot(float coreaspectrot)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < passes.size(); i++)
|
||||||
|
passes[i]->set_core_aspect_rot(coreaspectrot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void gl3_filter_chain::set_shader_subframes(uint32_t tot_subframes)
|
void gl3_filter_chain::set_shader_subframes(uint32_t tot_subframes)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@ -2702,6 +2773,20 @@ void gl3_filter_chain_set_rotation(
|
|||||||
chain->set_rotation(rot);
|
chain->set_rotation(rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gl3_filter_chain_set_core_aspect(
|
||||||
|
gl3_filter_chain_t *chain,
|
||||||
|
float coreaspect)
|
||||||
|
{
|
||||||
|
chain->set_core_aspect(coreaspect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gl3_filter_chain_set_core_aspect_rot(
|
||||||
|
gl3_filter_chain_t *chain,
|
||||||
|
float coreaspectrot)
|
||||||
|
{
|
||||||
|
chain->set_core_aspect_rot(coreaspectrot);
|
||||||
|
}
|
||||||
|
|
||||||
void gl3_filter_chain_set_shader_subframes(
|
void gl3_filter_chain_set_shader_subframes(
|
||||||
gl3_filter_chain_t *chain,
|
gl3_filter_chain_t *chain,
|
||||||
uint32_t tot_subframes)
|
uint32_t tot_subframes)
|
||||||
|
@ -56,7 +56,7 @@ struct gl3_filter_chain_pass_info
|
|||||||
|
|
||||||
float scale_x;
|
float scale_x;
|
||||||
float scale_y;
|
float scale_y;
|
||||||
/* Ignored for the last pass, swapchain info
|
/* Ignored for the last pass, swapchain info
|
||||||
* will be used instead. */
|
* will be used instead. */
|
||||||
GLenum rt_format;
|
GLenum rt_format;
|
||||||
/* For the last pass, make sure VIEWPORT scale
|
/* For the last pass, make sure VIEWPORT scale
|
||||||
@ -119,6 +119,14 @@ void gl3_filter_chain_set_rotation(
|
|||||||
gl3_filter_chain_t *chain,
|
gl3_filter_chain_t *chain,
|
||||||
uint32_t rotation);
|
uint32_t rotation);
|
||||||
|
|
||||||
|
void gl3_filter_chain_set_core_aspect(
|
||||||
|
gl3_filter_chain_t *chain,
|
||||||
|
float coreaspect);
|
||||||
|
|
||||||
|
void gl3_filter_chain_set_core_aspect_rot(
|
||||||
|
gl3_filter_chain_t *chain,
|
||||||
|
float coreaspectrot);
|
||||||
|
|
||||||
void gl3_filter_chain_set_shader_subframes(
|
void gl3_filter_chain_set_shader_subframes(
|
||||||
gl3_filter_chain_t *chain,
|
gl3_filter_chain_t *chain,
|
||||||
uint32_t tot_subframes);
|
uint32_t tot_subframes);
|
||||||
@ -131,7 +139,7 @@ void gl3_filter_chain_set_current_shader_subframe(
|
|||||||
void gl3_filter_chain_set_simulate_scanline(
|
void gl3_filter_chain_set_simulate_scanline(
|
||||||
gl3_filter_chain_t *chain,
|
gl3_filter_chain_t *chain,
|
||||||
bool simulate_scanline);
|
bool simulate_scanline);
|
||||||
#endif // GL3_ROLLING_SCANLINE_SIMULATION
|
#endif // GL3_ROLLING_SCANLINE_SIMULATION
|
||||||
|
|
||||||
void gl3_filter_chain_set_pass_name(
|
void gl3_filter_chain_set_pass_name(
|
||||||
gl3_filter_chain_t *chain,
|
gl3_filter_chain_t *chain,
|
||||||
|
@ -87,12 +87,16 @@ struct shader_program_cg
|
|||||||
CGparameter frame_cnt_f;
|
CGparameter frame_cnt_f;
|
||||||
CGparameter frame_dir_f;
|
CGparameter frame_dir_f;
|
||||||
CGparameter rotation_f;
|
CGparameter rotation_f;
|
||||||
|
CGparameter originalaspect_f;
|
||||||
|
CGparameter originalaspectrotated_f;
|
||||||
CGparameter vid_size_v;
|
CGparameter vid_size_v;
|
||||||
CGparameter tex_size_v;
|
CGparameter tex_size_v;
|
||||||
CGparameter out_size_v;
|
CGparameter out_size_v;
|
||||||
CGparameter frame_cnt_v;
|
CGparameter frame_cnt_v;
|
||||||
CGparameter frame_dir_v;
|
CGparameter frame_dir_v;
|
||||||
CGparameter rotation_v;
|
CGparameter rotation_v;
|
||||||
|
CGparameter originalaspect_v;
|
||||||
|
CGparameter originalaspectrotated_v;
|
||||||
CGparameter mvp;
|
CGparameter mvp;
|
||||||
|
|
||||||
struct cg_fbo_params fbo[GFX_MAX_SHADERS];
|
struct cg_fbo_params fbo[GFX_MAX_SHADERS];
|
||||||
@ -310,7 +314,9 @@ static void gl_cg_set_texture_info(
|
|||||||
|
|
||||||
static void gl_cg_set_params(void *dat, void *shader_data)
|
static void gl_cg_set_params(void *dat, void *shader_data)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned int i;
|
||||||
|
int rot;
|
||||||
|
float originalaspectrotated;
|
||||||
video_shader_ctx_params_t *params =
|
video_shader_ctx_params_t *params =
|
||||||
(video_shader_ctx_params_t*)dat;
|
(video_shader_ctx_params_t*)dat;
|
||||||
unsigned width = params->width;
|
unsigned width = params->width;
|
||||||
@ -361,11 +367,22 @@ static void gl_cg_set_params(void *dat, void *shader_data)
|
|||||||
cg_gl_set_param_1f(cg->prg[cg->active_idx].rotation_f, (float)retroarch_get_rotation());
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].rotation_f, (float)retroarch_get_rotation());
|
||||||
cg_gl_set_param_1f(cg->prg[cg->active_idx].rotation_v, (float)retroarch_get_rotation());
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].rotation_v, (float)retroarch_get_rotation());
|
||||||
|
|
||||||
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].originalaspect_f, (float)video_driver_get_core_aspect());
|
||||||
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].originalaspect_v, (float)video_driver_get_core_aspect());
|
||||||
|
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
rot = retroarch_get_rotation();
|
||||||
|
originalaspectrotated = video_driver_get_core_aspect();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
originalaspectrotated = 1/originalaspectrotated;
|
||||||
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].originalaspectrotated_f, (float)originalaspectrotated);
|
||||||
|
cg_gl_set_param_1f(cg->prg[cg->active_idx].originalaspectrotated_v, (float)originalaspectrotated);
|
||||||
|
|
||||||
set_param_2f(cg->prg[cg->active_idx].vid_size_v, width, height);
|
set_param_2f(cg->prg[cg->active_idx].vid_size_v, width, height);
|
||||||
set_param_2f(cg->prg[cg->active_idx].tex_size_v, tex_width, tex_height);
|
set_param_2f(cg->prg[cg->active_idx].tex_size_v, tex_width, tex_height);
|
||||||
set_param_2f(cg->prg[cg->active_idx].out_size_v, out_width, out_height);
|
set_param_2f(cg->prg[cg->active_idx].out_size_v, out_width, out_height);
|
||||||
|
|
||||||
if ( cg->prg[cg->active_idx].frame_cnt_f ||
|
if ( cg->prg[cg->active_idx].frame_cnt_f ||
|
||||||
cg->prg[cg->active_idx].frame_cnt_v)
|
cg->prg[cg->active_idx].frame_cnt_v)
|
||||||
{
|
{
|
||||||
unsigned modulo = cg->shader->pass[cg->active_idx - 1].frame_count_mod;
|
unsigned modulo = cg->shader->pass[cg->active_idx - 1].frame_count_mod;
|
||||||
@ -797,12 +814,16 @@ static void gl_cg_set_program_attributes(void *data, unsigned i)
|
|||||||
cg->prg[i].frame_cnt_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.frame_count");
|
cg->prg[i].frame_cnt_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.frame_count");
|
||||||
cg->prg[i].frame_dir_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.frame_direction");
|
cg->prg[i].frame_dir_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.frame_direction");
|
||||||
cg->prg[i].rotation_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.rotation");
|
cg->prg[i].rotation_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.rotation");
|
||||||
|
cg->prg[i].originalaspect_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.originalaspect");
|
||||||
|
cg->prg[i].originalaspectrotated_f = cgGetNamedParameter(cg->prg[i].fprg, "IN.originalaspectrotated");
|
||||||
cg->prg[i].vid_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.video_size");
|
cg->prg[i].vid_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.video_size");
|
||||||
cg->prg[i].tex_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.texture_size");
|
cg->prg[i].tex_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.texture_size");
|
||||||
cg->prg[i].out_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.output_size");
|
cg->prg[i].out_size_v = cgGetNamedParameter (cg->prg[i].vprg, "IN.output_size");
|
||||||
cg->prg[i].frame_cnt_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.frame_count");
|
cg->prg[i].frame_cnt_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.frame_count");
|
||||||
cg->prg[i].frame_dir_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.frame_direction");
|
cg->prg[i].frame_dir_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.frame_direction");
|
||||||
cg->prg[i].rotation_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.rotation");
|
cg->prg[i].rotation_v = cgGetNamedParameter(cg->prg[i].vprg, "IN.rotation");
|
||||||
|
cg->prg[i].originalaspect_v = cgGetNamedParameter(cg->prg[i].fprg, "IN.originalaspect");
|
||||||
|
cg->prg[i].originalaspectrotated_v = cgGetNamedParameter(cg->prg[i].fprg, "IN.originalaspectrotated");
|
||||||
|
|
||||||
cg->prg[i].mvp = cgGetNamedParameter(cg->prg[i].vprg, "modelViewProj");
|
cg->prg[i].mvp = cgGetNamedParameter(cg->prg[i].vprg, "modelViewProj");
|
||||||
if (!cg->prg[i].mvp)
|
if (!cg->prg[i].mvp)
|
||||||
|
@ -101,6 +101,9 @@ struct shader_uniforms
|
|||||||
/* Use int for maximal compatibility despite other drivers using uint. */
|
/* Use int for maximal compatibility despite other drivers using uint. */
|
||||||
int rotation;
|
int rotation;
|
||||||
|
|
||||||
|
float core_aspect;
|
||||||
|
float core_aspect_rot;
|
||||||
|
|
||||||
int lut_texture[GFX_MAX_TEXTURES];
|
int lut_texture[GFX_MAX_TEXTURES];
|
||||||
unsigned frame_count_mod;
|
unsigned frame_count_mod;
|
||||||
|
|
||||||
@ -287,7 +290,7 @@ static const XXH64_hash_t gl_glsl_hash_shader(
|
|||||||
{
|
{
|
||||||
XXH64_update(state, source[n], strlen(source[n]));
|
XXH64_update(state, source[n], strlen(source[n]));
|
||||||
}
|
}
|
||||||
|
|
||||||
XXH64_hash_t const hash = XXH64_digest(state);
|
XXH64_hash_t const hash = XXH64_digest(state);
|
||||||
|
|
||||||
XXH64_freeState(state);
|
XXH64_freeState(state);
|
||||||
@ -417,10 +420,10 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl,
|
|||||||
source[2] = glsl->alias_define;
|
source[2] = glsl->alias_define;
|
||||||
source[3] = program;
|
source[3] = program;
|
||||||
|
|
||||||
#if defined(ORBIS)
|
#if defined(ORBIS)
|
||||||
{
|
{
|
||||||
char save_path[250];
|
char save_path[250];
|
||||||
XXH64_hash_t const hash =
|
XXH64_hash_t const hash =
|
||||||
gl_glsl_hash_shader(source, ARRAY_SIZE(source));
|
gl_glsl_hash_shader(source, ARRAY_SIZE(source));
|
||||||
snprintf(save_path, sizeof(save_path),
|
snprintf(save_path, sizeof(save_path),
|
||||||
"/data/retroarch/temp/%lx.sb", hash);
|
"/data/retroarch/temp/%lx.sb", hash);
|
||||||
@ -468,7 +471,7 @@ static bool gl_glsl_compile_program(
|
|||||||
struct shader_program_info *program_info)
|
struct shader_program_info *program_info)
|
||||||
{
|
{
|
||||||
glsl_shader_data_t *glsl = (glsl_shader_data_t*)data;
|
glsl_shader_data_t *glsl = (glsl_shader_data_t*)data;
|
||||||
struct shader_program_glsl_data *program =
|
struct shader_program_glsl_data *program =
|
||||||
(struct shader_program_glsl_data*)program_data;
|
(struct shader_program_glsl_data*)program_data;
|
||||||
GLuint prog = glCreateProgram();
|
GLuint prog = glCreateProgram();
|
||||||
|
|
||||||
@ -486,7 +489,8 @@ static bool gl_glsl_compile_program(
|
|||||||
if (!gl_glsl_compile_shader(
|
if (!gl_glsl_compile_shader(
|
||||||
glsl,
|
glsl,
|
||||||
program->vprg,
|
program->vprg,
|
||||||
"#define VERTEX\n#define PARAMETER_UNIFORM\n", program_info->vertex))
|
"#define VERTEX\n#define PARAMETER_UNIFORM\n#define _HAS_ORIGINALASPECT_UNIFORMS\n",
|
||||||
|
program_info->vertex))
|
||||||
{
|
{
|
||||||
RARCH_ERR("Failed to compile vertex shader #%u\n", idx);
|
RARCH_ERR("Failed to compile vertex shader #%u\n", idx);
|
||||||
goto error;
|
goto error;
|
||||||
@ -500,7 +504,7 @@ static bool gl_glsl_compile_program(
|
|||||||
RARCH_LOG("[GLSL]: Found GLSL fragment shader.\n");
|
RARCH_LOG("[GLSL]: Found GLSL fragment shader.\n");
|
||||||
program->fprg = glCreateShader(GL_FRAGMENT_SHADER);
|
program->fprg = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
if (!gl_glsl_compile_shader(glsl, program->fprg,
|
if (!gl_glsl_compile_shader(glsl, program->fprg,
|
||||||
"#define FRAGMENT\n#define PARAMETER_UNIFORM\n",
|
"#define FRAGMENT\n#define PARAMETER_UNIFORM\n#define _HAS_ORIGINALASPECT_UNIFORMS\n",
|
||||||
program_info->fragment))
|
program_info->fragment))
|
||||||
{
|
{
|
||||||
RARCH_ERR("Failed to compile fragment shader #%u\n", idx);
|
RARCH_ERR("Failed to compile fragment shader #%u\n", idx);
|
||||||
@ -750,6 +754,8 @@ static void gl_glsl_find_uniforms(glsl_shader_data_t *glsl,
|
|||||||
uni->frame_count = gl_glsl_get_uniform(glsl, prog, "FrameCount");
|
uni->frame_count = gl_glsl_get_uniform(glsl, prog, "FrameCount");
|
||||||
uni->frame_direction = gl_glsl_get_uniform(glsl, prog, "FrameDirection");
|
uni->frame_direction = gl_glsl_get_uniform(glsl, prog, "FrameDirection");
|
||||||
uni->rotation = gl_glsl_get_uniform(glsl, prog, "Rotation");
|
uni->rotation = gl_glsl_get_uniform(glsl, prog, "Rotation");
|
||||||
|
uni->core_aspect = gl_glsl_get_uniform(glsl, prog, "OriginalAspect");
|
||||||
|
uni->core_aspect_rot = gl_glsl_get_uniform(glsl, prog, "OriginalAspectRotated");
|
||||||
|
|
||||||
for (i = 0; i < glsl->shader->luts; i++)
|
for (i = 0; i < glsl->shader->luts; i++)
|
||||||
uni->lut_texture[i] = glGetUniformLocation(prog, glsl->shader->lut[i].id);
|
uni->lut_texture[i] = glGetUniformLocation(prog, glsl->shader->lut[i].id);
|
||||||
@ -1112,7 +1118,7 @@ static void *gl_glsl_init(void *data, const char *path)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if ( glsl_core
|
if ( glsl_core
|
||||||
&& (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
|
&& (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
|
||||||
{
|
{
|
||||||
RARCH_ERR("[GL]: GL core context is used, but shader is not core compatible. Cannot use it.\n");
|
RARCH_ERR("[GL]: GL core context is used, but shader is not core compatible. Cannot use it.\n");
|
||||||
@ -1358,6 +1364,18 @@ static void gl_glsl_set_params(void *dat, void *shader_data)
|
|||||||
if (uni->rotation >= 0)
|
if (uni->rotation >= 0)
|
||||||
glUniform1i(uni->rotation, retroarch_get_rotation());
|
glUniform1i(uni->rotation, retroarch_get_rotation());
|
||||||
|
|
||||||
|
if (uni->core_aspect >= 0)
|
||||||
|
glUniform1f(uni->core_aspect, video_driver_get_core_aspect());
|
||||||
|
|
||||||
|
if (uni->core_aspect_rot >= 0) {
|
||||||
|
/* OriginalAspectRotated: return 1/aspect for 90 and 270 rotated content */
|
||||||
|
float core_aspect_rot = video_driver_get_core_aspect();
|
||||||
|
uint32_t rot = retroarch_get_rotation();
|
||||||
|
if (rot == 1 || rot == 3)
|
||||||
|
core_aspect_rot = 1/core_aspect_rot;
|
||||||
|
glUniform1f(uni->core_aspect_rot, core_aspect_rot);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set lookup textures. */
|
/* Set lookup textures. */
|
||||||
for (i = 0; i < glsl->shader->luts; i++)
|
for (i = 0; i < glsl->shader->luts; i++)
|
||||||
{
|
{
|
||||||
@ -1545,7 +1563,7 @@ static bool gl_glsl_set_mvp(void *shader_data, const void *mat_data)
|
|||||||
int loc;
|
int loc;
|
||||||
glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data;
|
glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data;
|
||||||
|
|
||||||
if ( !glsl
|
if ( !glsl
|
||||||
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
|
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1589,7 +1607,7 @@ static bool gl_glsl_set_coords(void *shader_data,
|
|||||||
const struct shader_uniforms *uni = glsl
|
const struct shader_uniforms *uni = glsl
|
||||||
? &glsl->uniforms[glsl->active_idx] : NULL;
|
? &glsl->uniforms[glsl->active_idx] : NULL;
|
||||||
|
|
||||||
if ( !glsl
|
if ( !glsl
|
||||||
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN))
|
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN))
|
||||||
|| !coords)
|
|| !coords)
|
||||||
{
|
{
|
||||||
|
@ -254,6 +254,8 @@ class Pass
|
|||||||
#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */
|
#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */
|
||||||
void set_frame_direction(int32_t dir) { frame_direction = dir; }
|
void set_frame_direction(int32_t dir) { frame_direction = dir; }
|
||||||
void set_rotation(uint32_t rot) { rotation = rot; }
|
void set_rotation(uint32_t rot) { rotation = rot; }
|
||||||
|
void set_core_aspect(float coreaspect) { core_aspect = coreaspect; }
|
||||||
|
void set_core_aspect_rot(float coreaspectrot) { core_aspect_rot = coreaspectrot; }
|
||||||
void set_name(const char *name) { pass_name = name; }
|
void set_name(const char *name) { pass_name = name; }
|
||||||
const std::string &get_name() const { return pass_name; }
|
const std::string &get_name() const { return pass_name; }
|
||||||
glslang_filter_chain_filter get_source_filter() const {
|
glslang_filter_chain_filter get_source_filter() const {
|
||||||
@ -328,6 +330,7 @@ class Pass
|
|||||||
unsigned width, unsigned height);
|
unsigned width, unsigned height);
|
||||||
void build_semantic_uint(uint8_t *data, slang_semantic semantic, uint32_t value);
|
void build_semantic_uint(uint8_t *data, slang_semantic semantic, uint32_t value);
|
||||||
void build_semantic_int(uint8_t *data, slang_semantic semantic, int32_t value);
|
void build_semantic_int(uint8_t *data, slang_semantic semantic, int32_t value);
|
||||||
|
void build_semantic_float(uint8_t *data,slang_semantic semantic, float value);
|
||||||
void build_semantic_parameter(uint8_t *data, unsigned index, float value);
|
void build_semantic_parameter(uint8_t *data, unsigned index, float value);
|
||||||
void build_semantic_texture_vec4(uint8_t *data,
|
void build_semantic_texture_vec4(uint8_t *data,
|
||||||
slang_texture_semantic semantic,
|
slang_texture_semantic semantic,
|
||||||
@ -343,6 +346,8 @@ class Pass
|
|||||||
uint64_t frame_count = 0;
|
uint64_t frame_count = 0;
|
||||||
int32_t frame_direction = 1;
|
int32_t frame_direction = 1;
|
||||||
uint32_t rotation = 0;
|
uint32_t rotation = 0;
|
||||||
|
float core_aspect = 0;
|
||||||
|
float core_aspect_rot = 0;
|
||||||
unsigned frame_count_period = 0;
|
unsigned frame_count_period = 0;
|
||||||
unsigned pass_number = 0;
|
unsigned pass_number = 0;
|
||||||
uint32_t total_subframes = 1;
|
uint32_t total_subframes = 1;
|
||||||
@ -411,6 +416,8 @@ struct vulkan_filter_chain
|
|||||||
#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */
|
#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */
|
||||||
void set_frame_direction(int32_t direction);
|
void set_frame_direction(int32_t direction);
|
||||||
void set_rotation(uint32_t rot);
|
void set_rotation(uint32_t rot);
|
||||||
|
void set_core_aspect(float coreaspect);
|
||||||
|
void set_core_aspect_rot(float coreaspect);
|
||||||
void set_pass_name(unsigned pass, const char *name);
|
void set_pass_name(unsigned pass, const char *name);
|
||||||
|
|
||||||
void add_static_texture(std::unique_ptr<StaticTexture> texture);
|
void add_static_texture(std::unique_ptr<StaticTexture> texture);
|
||||||
@ -1441,6 +1448,21 @@ void vulkan_filter_chain::set_rotation(uint32_t rot)
|
|||||||
passes[i]->set_rotation(rot);
|
passes[i]->set_rotation(rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vulkan_filter_chain::set_core_aspect(float coreaspect)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < passes.size(); i++)
|
||||||
|
passes[i]->set_core_aspect(coreaspect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vulkan_filter_chain::set_core_aspect_rot(float coreaspectrot)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < passes.size(); i++)
|
||||||
|
passes[i]->set_core_aspect_rot(coreaspectrot);
|
||||||
|
}
|
||||||
|
|
||||||
void vulkan_filter_chain::set_pass_name(unsigned pass, const char *name)
|
void vulkan_filter_chain::set_pass_name(unsigned pass, const char *name)
|
||||||
{
|
{
|
||||||
passes[pass]->set_name(name);
|
passes[pass]->set_name(name);
|
||||||
@ -2279,6 +2301,19 @@ void Pass::build_semantic_int(uint8_t *data, slang_semantic semantic,
|
|||||||
*reinterpret_cast<int32_t*>(push.buffer.data() + (refl.push_constant_offset >> 2)) = value;
|
*reinterpret_cast<int32_t*>(push.buffer.data() + (refl.push_constant_offset >> 2)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Pass::build_semantic_float(uint8_t *data, slang_semantic semantic,
|
||||||
|
float value)
|
||||||
|
{
|
||||||
|
auto &refl = reflection.semantics[semantic];
|
||||||
|
|
||||||
|
if (data && refl.uniform)
|
||||||
|
*reinterpret_cast<float*>(data + reflection.semantics[semantic].ubo_offset) = value;
|
||||||
|
|
||||||
|
if (refl.push_constant)
|
||||||
|
*reinterpret_cast<float*>(push.buffer.data() + (refl.push_constant_offset >> 2)) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Pass::build_semantic_texture(VkDescriptorSet set, uint8_t *buffer,
|
void Pass::build_semantic_texture(VkDescriptorSet set, uint8_t *buffer,
|
||||||
slang_texture_semantic semantic, const Texture &texture)
|
slang_texture_semantic semantic, const Texture &texture)
|
||||||
{
|
{
|
||||||
@ -2344,6 +2379,12 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer,
|
|||||||
build_semantic_uint(buffer, SLANG_SEMANTIC_ROTATION,
|
build_semantic_uint(buffer, SLANG_SEMANTIC_ROTATION,
|
||||||
rotation);
|
rotation);
|
||||||
|
|
||||||
|
build_semantic_float(buffer, SLANG_SEMANTIC_CORE_ASPECT,
|
||||||
|
core_aspect);
|
||||||
|
|
||||||
|
build_semantic_float(buffer, SLANG_SEMANTIC_CORE_ASPECT_ROT,
|
||||||
|
core_aspect_rot);
|
||||||
|
|
||||||
/* Standard inputs */
|
/* Standard inputs */
|
||||||
build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_ORIGINAL, original);
|
build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_ORIGINAL, original);
|
||||||
build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_SOURCE, source);
|
build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_SOURCE, source);
|
||||||
@ -3188,6 +3229,20 @@ void vulkan_filter_chain_set_rotation(
|
|||||||
chain->set_rotation(rot);
|
chain->set_rotation(rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vulkan_filter_chain_set_core_aspect(
|
||||||
|
vulkan_filter_chain_t *chain,
|
||||||
|
float coreaspect)
|
||||||
|
{
|
||||||
|
chain->set_core_aspect(coreaspect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vulkan_filter_chain_set_core_aspect_rot(
|
||||||
|
vulkan_filter_chain_t *chain,
|
||||||
|
float coreaspectrot)
|
||||||
|
{
|
||||||
|
chain->set_core_aspect_rot(coreaspectrot);
|
||||||
|
}
|
||||||
|
|
||||||
void vulkan_filter_chain_set_pass_name(
|
void vulkan_filter_chain_set_pass_name(
|
||||||
vulkan_filter_chain_t *chain,
|
vulkan_filter_chain_t *chain,
|
||||||
unsigned pass,
|
unsigned pass,
|
||||||
|
@ -51,7 +51,7 @@ struct vulkan_filter_chain_pass_info
|
|||||||
float scale_x;
|
float scale_x;
|
||||||
float scale_y;
|
float scale_y;
|
||||||
|
|
||||||
/* Ignored for the last pass, swapchain info
|
/* Ignored for the last pass, swapchain info
|
||||||
* will be used instead. */
|
* will be used instead. */
|
||||||
VkFormat rt_format;
|
VkFormat rt_format;
|
||||||
/* For the last pass, make sure VIEWPORT scale
|
/* For the last pass, make sure VIEWPORT scale
|
||||||
@ -102,7 +102,7 @@ void vulkan_filter_chain_set_shader(vulkan_filter_chain_t *chain,
|
|||||||
|
|
||||||
VkFormat vulkan_filter_chain_get_pass_rt_format(
|
VkFormat vulkan_filter_chain_get_pass_rt_format(
|
||||||
vulkan_filter_chain_t *chain,
|
vulkan_filter_chain_t *chain,
|
||||||
unsigned pass);
|
unsigned pass);
|
||||||
|
|
||||||
bool vulkan_filter_chain_update_swapchain_info(vulkan_filter_chain_t *chain,
|
bool vulkan_filter_chain_update_swapchain_info(vulkan_filter_chain_t *chain,
|
||||||
const struct vulkan_filter_chain_swapchain_info *info);
|
const struct vulkan_filter_chain_swapchain_info *info);
|
||||||
@ -139,6 +139,12 @@ void vulkan_filter_chain_set_frame_direction(vulkan_filter_chain_t *chain,
|
|||||||
void vulkan_filter_chain_set_rotation(vulkan_filter_chain_t *chain,
|
void vulkan_filter_chain_set_rotation(vulkan_filter_chain_t *chain,
|
||||||
uint32_t rot);
|
uint32_t rot);
|
||||||
|
|
||||||
|
void vulkan_filter_chain_set_core_aspect(vulkan_filter_chain_t *chain,
|
||||||
|
float coreaspect);
|
||||||
|
|
||||||
|
void vulkan_filter_chain_set_core_aspect_rot(vulkan_filter_chain_t *chain,
|
||||||
|
float coreaspectrot);
|
||||||
|
|
||||||
void vulkan_filter_chain_build_offscreen_passes(vulkan_filter_chain_t *chain,
|
void vulkan_filter_chain_build_offscreen_passes(vulkan_filter_chain_t *chain,
|
||||||
VkCommandBuffer cmd, const VkViewport *vp);
|
VkCommandBuffer cmd, const VkViewport *vp);
|
||||||
void vulkan_filter_chain_build_viewport_pass(vulkan_filter_chain_t *chain,
|
void vulkan_filter_chain_build_viewport_pass(vulkan_filter_chain_t *chain,
|
||||||
|
@ -157,6 +157,8 @@ static bool slang_process_reflection(
|
|||||||
"FrameCount",
|
"FrameCount",
|
||||||
"FrameDirection",
|
"FrameDirection",
|
||||||
"Rotation",
|
"Rotation",
|
||||||
|
"OriginalAspect",
|
||||||
|
"OriginalAspectRotated",
|
||||||
"TotalSubFrames",
|
"TotalSubFrames",
|
||||||
"CurrentSubFrame",
|
"CurrentSubFrame",
|
||||||
};
|
};
|
||||||
|
@ -51,6 +51,8 @@ static const char *semantic_uniform_names[] = {
|
|||||||
"FrameCount",
|
"FrameCount",
|
||||||
"FrameDirection",
|
"FrameDirection",
|
||||||
"Rotation",
|
"Rotation",
|
||||||
|
"OriginalAspect",
|
||||||
|
"OriginalAspectRotated",
|
||||||
"TotalSubFrames",
|
"TotalSubFrames",
|
||||||
"CurrentSubFrame",
|
"CurrentSubFrame",
|
||||||
};
|
};
|
||||||
@ -270,6 +272,14 @@ static bool validate_type_for_semantic(const spirv_cross::SPIRType &type, slang_
|
|||||||
return type.basetype == spirv_cross::SPIRType::UInt
|
return type.basetype == spirv_cross::SPIRType::UInt
|
||||||
&& type.vecsize == 1
|
&& type.vecsize == 1
|
||||||
&& type.columns == 1;
|
&& type.columns == 1;
|
||||||
|
case SLANG_SEMANTIC_CORE_ASPECT:
|
||||||
|
return type.basetype == spirv_cross::SPIRType::Float
|
||||||
|
&& type.vecsize == 1
|
||||||
|
&& type.columns == 1;
|
||||||
|
case SLANG_SEMANTIC_CORE_ASPECT_ROT:
|
||||||
|
return type.basetype == spirv_cross::SPIRType::Float
|
||||||
|
&& type.vecsize == 1
|
||||||
|
&& type.columns == 1;
|
||||||
/* float */
|
/* float */
|
||||||
case SLANG_SEMANTIC_FLOAT_PARAMETER:
|
case SLANG_SEMANTIC_FLOAT_PARAMETER:
|
||||||
return type.basetype == spirv_cross::SPIRType::Float
|
return type.basetype == spirv_cross::SPIRType::Float
|
||||||
|
@ -72,14 +72,18 @@ enum slang_semantic
|
|||||||
SLANG_SEMANTIC_FRAME_DIRECTION = 4,
|
SLANG_SEMANTIC_FRAME_DIRECTION = 4,
|
||||||
/* uint, rotation */
|
/* uint, rotation */
|
||||||
SLANG_SEMANTIC_ROTATION = 5,
|
SLANG_SEMANTIC_ROTATION = 5,
|
||||||
|
/* float, rotation */
|
||||||
|
SLANG_SEMANTIC_CORE_ASPECT = 6,
|
||||||
|
SLANG_SEMANTIC_CORE_ASPECT_ROT = 7,
|
||||||
|
|
||||||
/* uint, sub frames per content frame */
|
/* uint, sub frames per content frame */
|
||||||
SLANG_SEMANTIC_TOTAL_SUBFRAMES = 6,
|
SLANG_SEMANTIC_TOTAL_SUBFRAMES = 8,
|
||||||
/* uint, current sub frame */
|
/* uint, current sub frame */
|
||||||
SLANG_SEMANTIC_CURRENT_SUBFRAME = 7,
|
SLANG_SEMANTIC_CURRENT_SUBFRAME = 9,
|
||||||
SLANG_NUM_BASE_SEMANTICS,
|
SLANG_NUM_BASE_SEMANTICS,
|
||||||
|
|
||||||
/* float, user defined parameter, arrayed */
|
/* float, user defined parameter, arrayed */
|
||||||
SLANG_SEMANTIC_FLOAT_PARAMETER = 8,
|
SLANG_SEMANTIC_FLOAT_PARAMETER = 10,
|
||||||
|
|
||||||
SLANG_NUM_SEMANTICS,
|
SLANG_NUM_SEMANTICS,
|
||||||
SLANG_INVALID_SEMANTIC = -1
|
SLANG_INVALID_SEMANTIC = -1
|
||||||
|
@ -50,6 +50,8 @@ def replace_global_in(source):
|
|||||||
('IN.frame_count', 'FrameCount'),
|
('IN.frame_count', 'FrameCount'),
|
||||||
('IN.frame_direction', 'FrameDirection'),
|
('IN.frame_direction', 'FrameDirection'),
|
||||||
('IN.rotation', 'Rotation'),
|
('IN.rotation', 'Rotation'),
|
||||||
|
('IN.core_aspect', 'OriginalAspect'),
|
||||||
|
('IN.core_aspect_rot', 'OriginalAspectRotated'),
|
||||||
]
|
]
|
||||||
|
|
||||||
for line in source.splitlines():
|
for line in source.splitlines():
|
||||||
@ -109,6 +111,8 @@ def no_uniform(elem):
|
|||||||
'_frame_count',
|
'_frame_count',
|
||||||
'_frame_direction',
|
'_frame_direction',
|
||||||
'_rotation',
|
'_rotation',
|
||||||
|
'_core_aspect',
|
||||||
|
'_core_aspect_rot',
|
||||||
'_mvp_matrix',
|
'_mvp_matrix',
|
||||||
'_vertex_coord',
|
'_vertex_coord',
|
||||||
'sampler2D'
|
'sampler2D'
|
||||||
|
Loading…
Reference in New Issue
Block a user