Merge pull request #8881 from LazyBumHorse/master

implement FrameDirection slang semantic for d3d10-12, gx2_gfx and metal
This commit is contained in:
Twinaphex 2019-05-30 10:50:46 +02:00 committed by GitHub
commit 9eecf1302b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 53 additions and 20 deletions

View File

@ -1208,6 +1208,7 @@ typedef struct
D3D10_VIEWPORT viewport;
pass_semantics_t semantics;
uint32_t frame_count;
int32_t frame_direction;
} pass[GFX_MAX_SHADERS];
struct video_shader* shader_preset;

View File

@ -2584,6 +2584,7 @@ typedef struct
D3D11_VIEWPORT viewport;
pass_semantics_t semantics;
uint32_t frame_count;
int32_t frame_direction;
} pass[GFX_MAX_SHADERS];
struct video_shader* shader_preset;

View File

@ -1444,6 +1444,7 @@ typedef struct
D3D12_RECT scissorRect;
pass_semantics_t semantics;
uint32_t frame_count;
int32_t frame_direction;
D3D12_GPU_DESCRIPTOR_HANDLE textures;
D3D12_GPU_DESCRIPTOR_HANDLE samplers;
} pass[GFX_MAX_SHADERS];

View File

@ -14,6 +14,7 @@
#include <simd/simd.h>
#import <gfx/video_frame.h>
#include "../../managers/state_manager.h"
#import "metal_common.h"
#import "../../ui/drivers/cocoa/cocoa_common.h"
@ -552,6 +553,7 @@ typedef struct MTLALIGN(16)
texture_t rt;
texture_t feedback;
uint32_t frame_count;
int32_t frame_direction;
pass_semantics_t semantics;
MTLViewport viewport;
__unsafe_unretained id<MTLRenderPipelineState> _state;
@ -927,6 +929,8 @@ typedef struct MTLALIGN(16)
if (_shader->pass[i].frame_count_mod)
_engine.pass[i].frame_count %= _shader->pass[i].frame_count_mod;
_engine.pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1;
for (unsigned j = 0; j < SLANG_CBUFFER_MAX; j++)
{
id<MTLBuffer> buffer = _engine.pass[i].buffers[j];
@ -1176,10 +1180,11 @@ typedef struct MTLALIGN(16)
&_engine.luts[0].size_data, sizeof(*_engine.luts)},
},
{
mvp, /* MVP */
&_engine.pass[i].rt.size_data, /* OutputSize */
&_engine.frame.output_size, /* FinalViewportSize */
&_engine.pass[i].frame_count, /* FrameCount */
mvp, /* MVP */
&_engine.pass[i].rt.size_data, /* OutputSize */
&_engine.frame.output_size, /* FinalViewportSize */
&_engine.pass[i].frame_count, /* FrameCount */
&_engine.pass[i].frame_direction, /* FrameDirection */
}
};
/* clang-format on */

View File

@ -27,6 +27,7 @@
#include "../../verbosity.h"
#include "../../configuration.h"
#include "../../retroarch.h"
#include "../../managers/state_manager.h"
#include "../video_driver.h"
#include "../font_driver.h"
@ -390,10 +391,11 @@ static bool d3d10_gfx_set_shader(void* data,
&d3d10->luts[0].size_data, sizeof(*d3d10->luts)},
},
{
&d3d10->mvp, /* MVP */
&d3d10->pass[i].rt.size_data, /* OutputSize */
&d3d10->frame.output_size, /* FinalViewportSize */
&d3d10->pass[i].frame_count, /* FrameCount */
&d3d10->mvp, /* MVP */
&d3d10->pass[i].rt.size_data, /* OutputSize */
&d3d10->frame.output_size, /* FinalViewportSize */
&d3d10->pass[i].frame_count, /* FrameCount */
&d3d10->pass[i].frame_direction, /* FrameDirection */
}
};
/* clang-format on */
@ -1283,6 +1285,8 @@ static bool d3d10_gfx_frame(
else
d3d10->pass[i].frame_count = frame_count;
d3d10->pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1;
for (j = 0; j < SLANG_CBUFFER_MAX; j++)
{
D3D10Buffer buffer = d3d10->pass[i].buffers[j];

View File

@ -43,6 +43,7 @@
#include "../../menu/menu_driver.h"
#include "../video_shader_parse.h"
#include "../drivers_shader/slang_preprocess.h"
#include "../../managers/state_manager.h"
#include "../common/d3d_common.h"
#include "../common/d3d11_common.h"
@ -408,10 +409,11 @@ static bool d3d11_gfx_set_shader(void* data, enum rarch_shader_type type, const
&d3d11->luts[0].size_data, sizeof(*d3d11->luts)},
},
{
&d3d11->mvp, /* MVP */
&d3d11->pass[i].rt.size_data, /* OutputSize */
&d3d11->frame.output_size, /* FinalViewportSize */
&d3d11->pass[i].frame_count, /* FrameCount */
&d3d11->mvp, /* MVP */
&d3d11->pass[i].rt.size_data, /* OutputSize */
&d3d11->frame.output_size, /* FinalViewportSize */
&d3d11->pass[i].frame_count, /* FrameCount */
&d3d11->pass[i].frame_direction, /* FrameDirection */
}
};
/* clang-format on */
@ -1356,6 +1358,8 @@ static bool d3d11_gfx_frame(
else
d3d11->pass[i].frame_count = frame_count;
d3d11->pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1;
for (j = 0; j < SLANG_CBUFFER_MAX; j++)
{
D3D11Buffer buffer = d3d11->pass[i].buffers[j];

View File

@ -32,6 +32,7 @@
#include "../../verbosity.h"
#include "../../configuration.h"
#include "../../retroarch.h"
#include "../../managers/state_manager.h"
#ifdef HAVE_MENU
#include "../../menu/menu_driver.h"
@ -398,10 +399,11 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
&d3d12->luts[0].size_data, sizeof(*d3d12->luts)},
},
{
&d3d12->mvp, /* MVP */
&d3d12->pass[i].rt.size_data, /* OutputSize */
&d3d12->frame.output_size, /* FinalViewportSize */
&d3d12->pass[i].frame_count, /* FrameCount */
&d3d12->mvp, /* MVP */
&d3d12->pass[i].rt.size_data, /* OutputSize */
&d3d12->frame.output_size, /* FinalViewportSize */
&d3d12->pass[i].frame_count, /* FrameCount */
&d3d12->pass[i].frame_direction, /* FrameDirection */
}
};
/* clang-format on */
@ -1294,6 +1296,8 @@ static bool d3d12_gfx_frame(
else
d3d12->pass[i].frame_count = frame_count;
d3d12->pass[i].frame_direction = state_manager_frame_is_reversed() ? -1 : 1;
for (j = 0; j < SLANG_CBUFFER_MAX; j++)
{
cbuffer_sem_t* buffer_sem = &d3d12->pass[i].semantics.cbuffers[j];

View File

@ -25,6 +25,7 @@
#include "../../configuration.h"
#include "../../verbosity.h"
#include "../../retroarch.h"
#include "../../managers/state_manager.h"
#ifdef HAVE_CONFIG_H
#include "../../config.h"
@ -873,7 +874,8 @@ static bool wiiu_init_frame_textures(wiiu_video_t *wiiu, unsigned width, unsigne
}
static void wiiu_gfx_update_uniform_block(wiiu_video_t *wiiu, int pass, float *ubo, int id,
int size, int uniformVarCount, GX2UniformVar *uniformVars, uint64_t frame_count)
int size, int uniformVarCount, GX2UniformVar *uniformVars,
uint64_t frame_count, int32_t frame_direction)
{
for (int i = 0; i < uniformVarCount; i++)
{
@ -916,6 +918,13 @@ static void wiiu_gfx_update_uniform_block(wiiu_video_t *wiiu, int pass, float *u
continue;
}
if (string_is_equal(id, "FrameDirection"))
{
*dst = frame_direction;
*(u32 *)dst = __builtin_bswap32(*(u32 *)dst);
continue;
}
if (string_is_equal(id, "OriginalSize"))
{
((GX2_vec4 *)dst)->x = wiiu->texture.surface.width;
@ -1146,6 +1155,8 @@ static bool wiiu_gfx_frame(void *data, const void *frame,
if (wiiu->shader_preset)
{
int32_t frame_direction = state_manager_frame_is_reversed() ? -1 : 1;
for (int i = 0; i < wiiu->shader_preset->passes; i++)
{
@ -1155,7 +1166,8 @@ static bool wiiu_gfx_frame(void *data, const void *frame,
{
wiiu_gfx_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->uniformVarCount, wiiu->pass[i].gfd->vs->uniformVars, frame_count);
wiiu->pass[i].gfd->vs->uniformVarCount, wiiu->pass[i].gfd->vs->uniformVars,
frame_count, frame_direction);
GX2SetVertexUniformBlock(wiiu->pass[i].gfd->vs->uniformBlocks[j].offset,
wiiu->pass[i].gfd->vs->uniformBlocks[j].size, wiiu->pass[i].vs_ubos[j]);
}
@ -1166,7 +1178,8 @@ static bool wiiu_gfx_frame(void *data, const void *frame,
{
wiiu_gfx_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->uniformVarCount, wiiu->pass[i].gfd->ps->uniformVars, frame_count);
wiiu->pass[i].gfd->ps->uniformVarCount, wiiu->pass[i].gfd->ps->uniformVars,
frame_count, frame_direction);
GX2SetPixelUniformBlock(wiiu->pass[i].gfd->ps->uniformBlocks[j].offset,
wiiu->pass[i].gfd->ps->uniformBlocks[j].size, wiiu->pass[i].ps_ubos[j]);
}
@ -1444,7 +1457,7 @@ static bool wiiu_gfx_set_shader(void *data,
video_shader_resolve_relative(wiiu->shader_preset, path);
#if 0
video_shader_resolve_parameters(conf, wiiu->shader_preset);
video_shader_resolve_parameters(conf, wiiu->shader_preset);
#else
for (int i = 0; i < wiiu->shader_preset->passes; i++)
slang_preprocess_parse_parameters(wiiu->shader_preset->pass[i].source.path, wiiu->shader_preset);