mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxgi] Remove support gamma-related ScaleAndOffsetSupported
Some games, including Heroes of the Storm (#287), do not set the values correctly so it's better to ignore them altogether.
This commit is contained in:
parent
256645724b
commit
af19bba048
@ -260,7 +260,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE DxgiOutput::GetGammaControlCapabilities(DXGI_GAMMA_CONTROL_CAPABILITIES* pGammaCaps) {
|
HRESULT STDMETHODCALLTYPE DxgiOutput::GetGammaControlCapabilities(DXGI_GAMMA_CONTROL_CAPABILITIES* pGammaCaps) {
|
||||||
pGammaCaps->ScaleAndOffsetSupported = TRUE;
|
pGammaCaps->ScaleAndOffsetSupported = FALSE;
|
||||||
pGammaCaps->MaxConvertedValue = 1.0f;
|
pGammaCaps->MaxConvertedValue = 1.0f;
|
||||||
pGammaCaps->MinConvertedValue = 0.0f;
|
pGammaCaps->MinConvertedValue = 0.0f;
|
||||||
pGammaCaps->NumGammaControlPoints = DXGI_VK_GAMMA_CP_COUNT;
|
pGammaCaps->NumGammaControlPoints = DXGI_VK_GAMMA_CP_COUNT;
|
||||||
|
@ -34,7 +34,6 @@ namespace dxvk {
|
|||||||
// Create objects required for the gamma ramp. This is implemented partially
|
// Create objects required for the gamma ramp. This is implemented partially
|
||||||
// with an UBO, which stores global parameters, and a lookup texture, which
|
// with an UBO, which stores global parameters, and a lookup texture, which
|
||||||
// stores the actual gamma ramp and can be sampled with a linear filter.
|
// stores the actual gamma ramp and can be sampled with a linear filter.
|
||||||
m_gammaUbo = CreateGammaUbo();
|
|
||||||
m_gammaSampler = CreateSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
|
m_gammaSampler = CreateSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
|
||||||
m_gammaTexture = CreateGammaTexture();
|
m_gammaTexture = CreateGammaTexture();
|
||||||
m_gammaTextureView = CreateGammaTextureView();
|
m_gammaTextureView = CreateGammaTextureView();
|
||||||
@ -204,7 +203,6 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_context->bindResourceSampler(BindingIds::GammaSmp, m_gammaSampler);
|
m_context->bindResourceSampler(BindingIds::GammaSmp, m_gammaSampler);
|
||||||
m_context->bindResourceView (BindingIds::GammaTex, m_gammaTextureView, nullptr);
|
m_context->bindResourceView (BindingIds::GammaTex, m_gammaTextureView, nullptr);
|
||||||
m_context->bindResourceBuffer (BindingIds::GammaUbo, DxvkBufferSlice(m_gammaUbo));
|
|
||||||
|
|
||||||
if (m_hud != nullptr) {
|
if (m_hud != nullptr) {
|
||||||
m_blendMode.enableBlending = VK_TRUE;
|
m_blendMode.enableBlending = VK_TRUE;
|
||||||
@ -339,15 +337,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void DxgiVkPresenter::SetGammaControl(
|
void DxgiVkPresenter::SetGammaControl(
|
||||||
const DXGI_VK_GAMMA_INPUT_CONTROL* pGammaControl,
|
|
||||||
const DXGI_VK_GAMMA_CURVE* pGammaCurve) {
|
const DXGI_VK_GAMMA_CURVE* pGammaCurve) {
|
||||||
m_context->beginRecording(
|
m_context->beginRecording(
|
||||||
m_device->createCommandList());
|
m_device->createCommandList());
|
||||||
|
|
||||||
m_context->updateBuffer(m_gammaUbo,
|
|
||||||
0, sizeof(DXGI_VK_GAMMA_INPUT_CONTROL),
|
|
||||||
pGammaControl);
|
|
||||||
|
|
||||||
m_context->updateImage(m_gammaTexture,
|
m_context->updateImage(m_gammaTexture,
|
||||||
VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 },
|
VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 },
|
||||||
VkOffset3D { 0, 0, 0 },
|
VkOffset3D { 0, 0, 0 },
|
||||||
@ -383,19 +376,6 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkBuffer> DxgiVkPresenter::CreateGammaUbo() {
|
|
||||||
DxvkBufferCreateInfo info;
|
|
||||||
info.size = sizeof(DXGI_VK_GAMMA_INPUT_CONTROL);
|
|
||||||
info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
|
||||||
| VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
|
|
||||||
info.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
|
|
||||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
|
||||||
info.access = VK_ACCESS_TRANSFER_WRITE_BIT
|
|
||||||
| VK_ACCESS_SHADER_READ_BIT;
|
|
||||||
return m_device->createBuffer(info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkImage> DxgiVkPresenter::CreateGammaTexture() {
|
Rc<DxvkImage> DxgiVkPresenter::CreateGammaTexture() {
|
||||||
DxvkImageCreateInfo info;
|
DxvkImageCreateInfo info;
|
||||||
info.type = VK_IMAGE_TYPE_1D;
|
info.type = VK_IMAGE_TYPE_1D;
|
||||||
@ -444,12 +424,11 @@ namespace dxvk {
|
|||||||
const SpirvCodeBuffer codeBuffer(dxgi_presenter_frag);
|
const SpirvCodeBuffer codeBuffer(dxgi_presenter_frag);
|
||||||
|
|
||||||
// Shader resource slots
|
// Shader resource slots
|
||||||
const std::array<DxvkResourceSlot, 5> resourceSlots = {{
|
const std::array<DxvkResourceSlot, 4> resourceSlots = {{
|
||||||
{ BindingIds::Sampler, VK_DESCRIPTOR_TYPE_SAMPLER, VK_IMAGE_VIEW_TYPE_MAX_ENUM },
|
{ BindingIds::Sampler, VK_DESCRIPTOR_TYPE_SAMPLER, VK_IMAGE_VIEW_TYPE_MAX_ENUM },
|
||||||
{ BindingIds::Texture, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_IMAGE_VIEW_TYPE_2D },
|
{ BindingIds::Texture, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_IMAGE_VIEW_TYPE_2D },
|
||||||
{ BindingIds::GammaSmp, VK_DESCRIPTOR_TYPE_SAMPLER, VK_IMAGE_VIEW_TYPE_MAX_ENUM },
|
{ BindingIds::GammaSmp, VK_DESCRIPTOR_TYPE_SAMPLER, VK_IMAGE_VIEW_TYPE_MAX_ENUM },
|
||||||
{ BindingIds::GammaTex, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_IMAGE_VIEW_TYPE_1D },
|
{ BindingIds::GammaTex, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_IMAGE_VIEW_TYPE_1D },
|
||||||
{ BindingIds::GammaUbo, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_IMAGE_VIEW_TYPE_MAX_ENUM },
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
// Create the actual shader module
|
// Create the actual shader module
|
||||||
|
@ -35,26 +35,6 @@ namespace dxvk {
|
|||||||
DXGI_VK_GAMMA_CP ControlPoints[DXGI_VK_GAMMA_CP_COUNT];
|
DXGI_VK_GAMMA_CP ControlPoints[DXGI_VK_GAMMA_CP_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Gamma input color
|
|
||||||
* A floating-point color vector.
|
|
||||||
*/
|
|
||||||
struct DXGI_VK_GAMMA_INPUT_COLOR {
|
|
||||||
float R, G, B, A;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Gamma input control
|
|
||||||
*
|
|
||||||
* Stores a scaling factor and a bias that shall
|
|
||||||
* be applied to the input color before performing
|
|
||||||
* the gamma lookup in the fragment shader.
|
|
||||||
*/
|
|
||||||
struct DXGI_VK_GAMMA_INPUT_CONTROL {
|
|
||||||
DXGI_VK_GAMMA_INPUT_COLOR Factor;
|
|
||||||
DXGI_VK_GAMMA_INPUT_COLOR Offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Maps color value to normalized integer
|
* \brief Maps color value to normalized integer
|
||||||
*
|
*
|
||||||
@ -151,7 +131,6 @@ namespace dxvk {
|
|||||||
* \param [in] pGammaCurve Gamma curve
|
* \param [in] pGammaCurve Gamma curve
|
||||||
*/
|
*/
|
||||||
void SetGammaControl(
|
void SetGammaControl(
|
||||||
const DXGI_VK_GAMMA_INPUT_CONTROL* pGammaControl,
|
|
||||||
const DXGI_VK_GAMMA_CURVE* pGammaCurve);
|
const DXGI_VK_GAMMA_CURVE* pGammaCurve);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -161,7 +140,6 @@ namespace dxvk {
|
|||||||
Texture = 1,
|
Texture = 1,
|
||||||
GammaSmp = 2,
|
GammaSmp = 2,
|
||||||
GammaTex = 3,
|
GammaTex = 3,
|
||||||
GammaUbo = 4,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Rc<DxvkDevice> m_device;
|
Rc<DxvkDevice> m_device;
|
||||||
@ -177,7 +155,6 @@ namespace dxvk {
|
|||||||
Rc<DxvkImage> m_backBufferResolve;
|
Rc<DxvkImage> m_backBufferResolve;
|
||||||
Rc<DxvkImageView> m_backBufferView;
|
Rc<DxvkImageView> m_backBufferView;
|
||||||
|
|
||||||
Rc<DxvkBuffer> m_gammaUbo;
|
|
||||||
Rc<DxvkSampler> m_gammaSampler;
|
Rc<DxvkSampler> m_gammaSampler;
|
||||||
Rc<DxvkImage> m_gammaTexture;
|
Rc<DxvkImage> m_gammaTexture;
|
||||||
Rc<DxvkImageView> m_gammaTextureView;
|
Rc<DxvkImageView> m_gammaTextureView;
|
||||||
@ -191,7 +168,6 @@ namespace dxvk {
|
|||||||
VkFilter Filter,
|
VkFilter Filter,
|
||||||
VkSamplerAddressMode AddressMode);
|
VkSamplerAddressMode AddressMode);
|
||||||
|
|
||||||
Rc<DxvkBuffer> CreateGammaUbo();
|
|
||||||
Rc<DxvkImage> CreateGammaTexture();
|
Rc<DxvkImage> CreateGammaTexture();
|
||||||
Rc<DxvkImageView> CreateGammaTextureView();
|
Rc<DxvkImageView> CreateGammaTextureView();
|
||||||
|
|
||||||
|
@ -284,13 +284,6 @@ namespace dxvk {
|
|||||||
HRESULT DxgiSwapChain::SetGammaControl(const DXGI_GAMMA_CONTROL* pGammaControl) {
|
HRESULT DxgiSwapChain::SetGammaControl(const DXGI_GAMMA_CONTROL* pGammaControl) {
|
||||||
std::lock_guard<std::recursive_mutex> lock(m_mutex);
|
std::lock_guard<std::recursive_mutex> lock(m_mutex);
|
||||||
|
|
||||||
const DXGI_RGB Factor = pGammaControl->Scale;
|
|
||||||
const DXGI_RGB Offset = pGammaControl->Offset;
|
|
||||||
|
|
||||||
DXGI_VK_GAMMA_INPUT_CONTROL control;
|
|
||||||
control.Factor = { Factor.Red, Factor.Green, Factor.Blue, 1.0f };
|
|
||||||
control.Offset = { Offset.Red, Offset.Green, Offset.Blue, 0.0f };
|
|
||||||
|
|
||||||
DXGI_VK_GAMMA_CURVE curve;
|
DXGI_VK_GAMMA_CURVE curve;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < DXGI_VK_GAMMA_CP_COUNT; i++) {
|
for (uint32_t i = 0; i < DXGI_VK_GAMMA_CP_COUNT; i++) {
|
||||||
@ -301,7 +294,7 @@ namespace dxvk {
|
|||||||
curve.ControlPoints[i].A = 0;
|
curve.ControlPoints[i].A = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_presenter->SetGammaControl(&control, &curve);
|
m_presenter->SetGammaControl(&curve);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,10 +302,6 @@ namespace dxvk {
|
|||||||
HRESULT DxgiSwapChain::SetDefaultGammaControl() {
|
HRESULT DxgiSwapChain::SetDefaultGammaControl() {
|
||||||
std::lock_guard<std::recursive_mutex> lock(m_mutex);
|
std::lock_guard<std::recursive_mutex> lock(m_mutex);
|
||||||
|
|
||||||
DXGI_VK_GAMMA_INPUT_CONTROL control;
|
|
||||||
control.Factor = { 1.0f, 1.0f, 1.0f, 1.0f };
|
|
||||||
control.Offset = { 0.0f, 0.0f, 0.0f, 0.0f };
|
|
||||||
|
|
||||||
DXGI_VK_GAMMA_CURVE curve;
|
DXGI_VK_GAMMA_CURVE curve;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < DXGI_VK_GAMMA_CP_COUNT; i++) {
|
for (uint32_t i = 0; i < DXGI_VK_GAMMA_CP_COUNT; i++) {
|
||||||
@ -321,7 +310,7 @@ namespace dxvk {
|
|||||||
curve.ControlPoints[i] = { value, value, value, 0 };
|
curve.ControlPoints[i] = { value, value, value, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
m_presenter->SetGammaControl(&control, &curve);
|
m_presenter->SetGammaControl(&curve);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,25 +6,15 @@ layout(binding = 1) uniform texture2D t_texture;
|
|||||||
layout(binding = 2) uniform sampler s_gamma;
|
layout(binding = 2) uniform sampler s_gamma;
|
||||||
layout(binding = 3) uniform texture1D t_gamma;
|
layout(binding = 3) uniform texture1D t_gamma;
|
||||||
|
|
||||||
layout(binding = 4)
|
|
||||||
uniform u_gamma_info_t {
|
|
||||||
layout(offset = 0) vec4 in_factor;
|
|
||||||
layout(offset = 16) vec4 in_offset;
|
|
||||||
} u_gamma_info;
|
|
||||||
|
|
||||||
layout(location = 0) in vec2 i_texcoord;
|
layout(location = 0) in vec2 i_texcoord;
|
||||||
layout(location = 0) out vec4 o_color;
|
layout(location = 0) out vec4 o_color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec4 color = texture(sampler2D(t_texture, s_sampler), i_texcoord);
|
vec4 color = texture(sampler2D(t_texture, s_sampler), i_texcoord);
|
||||||
|
|
||||||
vec3 cp_lookup = color.rgb;
|
|
||||||
cp_lookup *= u_gamma_info.in_factor.rgb;
|
|
||||||
cp_lookup += u_gamma_info.in_offset.rgb;
|
|
||||||
|
|
||||||
o_color = vec4(
|
o_color = vec4(
|
||||||
texture(sampler1D(t_gamma, s_gamma), cp_lookup.r).r,
|
texture(sampler1D(t_gamma, s_gamma), color.r).r,
|
||||||
texture(sampler1D(t_gamma, s_gamma), cp_lookup.g).g,
|
texture(sampler1D(t_gamma, s_gamma), color.g).g,
|
||||||
texture(sampler1D(t_gamma, s_gamma), cp_lookup.b).b,
|
texture(sampler1D(t_gamma, s_gamma), color.b).b,
|
||||||
color.a);
|
color.a);
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user