mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[dxvk] Add configurable HUD opacity
This commit is contained in:
parent
99b367cdd6
commit
d4a7346198
@ -94,6 +94,7 @@ The `DXVK_HUD` environment variable controls a HUD which can display the framera
|
|||||||
- `compiler`: Shows shader compiler activity
|
- `compiler`: Shows shader compiler activity
|
||||||
- `samplers`: Shows the current number of sampler pairs used *[D3D9 Only]*
|
- `samplers`: Shows the current number of sampler pairs used *[D3D9 Only]*
|
||||||
- `scale=x`: Scales the HUD by a factor of `x` (e.g. `1.5`)
|
- `scale=x`: Scales the HUD by a factor of `x` (e.g. `1.5`)
|
||||||
|
- `opacity=y`: Adjusts the HUD opacity by a factor of `y` (e.g. `0.5`, `1.0` being fully opaque).
|
||||||
|
|
||||||
Additionally, `DXVK_HUD=1` has the same effect as `DXVK_HUD=devinfo,fps`, and `DXVK_HUD=full` enables all available HUD elements.
|
Additionally, `DXVK_HUD=1` has the same effect as `DXVK_HUD=devinfo,fps`, and `DXVK_HUD=full` enables all available HUD elements.
|
||||||
|
|
||||||
|
@ -9,11 +9,16 @@ namespace dxvk::hud {
|
|||||||
: m_device (device),
|
: m_device (device),
|
||||||
m_renderer (device),
|
m_renderer (device),
|
||||||
m_hudItems (device),
|
m_hudItems (device),
|
||||||
m_scale (m_hudItems.getOption<float>("scale", 1.0f)) {
|
m_scale (m_hudItems.getOption<float>("scale", 1.0f)),
|
||||||
|
m_opacity (m_hudItems.getOption<float>("opacity", 1.0f)) {
|
||||||
// Sanitize scaling factor
|
// Sanitize scaling factor
|
||||||
if (m_scale < 0.01f)
|
if (m_scale < 0.01f)
|
||||||
m_scale = 1.0f;
|
m_scale = 1.0f;
|
||||||
|
|
||||||
|
// Sanitize HUD opacity factor
|
||||||
|
if (m_opacity != 1.0f)
|
||||||
|
m_opacity = std::max(std::min(m_opacity, 1.0f), 0.1f);
|
||||||
|
|
||||||
// Set up constant state
|
// Set up constant state
|
||||||
m_rsState.polygonMode = VK_POLYGON_MODE_FILL;
|
m_rsState.polygonMode = VK_POLYGON_MODE_FILL;
|
||||||
m_rsState.cullMode = VK_CULL_MODE_BACK_BIT;
|
m_rsState.cullMode = VK_CULL_MODE_BACK_BIT;
|
||||||
@ -101,7 +106,7 @@ namespace dxvk::hud {
|
|||||||
ctx->setBlendMode(0, m_blendMode);
|
ctx->setBlendMode(0, m_blendMode);
|
||||||
|
|
||||||
ctx->setSpecConstant(VK_PIPELINE_BIND_POINT_GRAPHICS, 0, colorSpace);
|
ctx->setSpecConstant(VK_PIPELINE_BIND_POINT_GRAPHICS, 0, colorSpace);
|
||||||
m_renderer.beginFrame(ctx, surfaceSize, m_scale);
|
m_renderer.beginFrame(ctx, surfaceSize, m_scale, m_opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ namespace dxvk::hud {
|
|||||||
HudItemSet m_hudItems;
|
HudItemSet m_hudItems;
|
||||||
|
|
||||||
float m_scale;
|
float m_scale;
|
||||||
|
float m_opacity;
|
||||||
|
|
||||||
void setupRendererState(
|
void setupRendererState(
|
||||||
const Rc<DxvkContext>& ctx,
|
const Rc<DxvkContext>& ctx,
|
||||||
|
@ -32,12 +32,17 @@ namespace dxvk::hud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void HudRenderer::beginFrame(const Rc<DxvkContext>& context, VkExtent2D surfaceSize, float scale) {
|
void HudRenderer::beginFrame(
|
||||||
|
const Rc<DxvkContext>& context,
|
||||||
|
VkExtent2D surfaceSize,
|
||||||
|
float scale,
|
||||||
|
float opacity) {
|
||||||
if (!m_initialized)
|
if (!m_initialized)
|
||||||
this->initFontTexture(context);
|
this->initFontTexture(context);
|
||||||
|
|
||||||
m_mode = Mode::RenderNone;
|
m_mode = Mode::RenderNone;
|
||||||
m_scale = scale;
|
m_scale = scale;
|
||||||
|
m_opacity = opacity;
|
||||||
m_surfaceSize = surfaceSize;
|
m_surfaceSize = surfaceSize;
|
||||||
m_context = context;
|
m_context = context;
|
||||||
}
|
}
|
||||||
@ -61,6 +66,10 @@ namespace dxvk::hud {
|
|||||||
VkDeviceSize offset = allocDataBuffer(textCopy.size());
|
VkDeviceSize offset = allocDataBuffer(textCopy.size());
|
||||||
std::memcpy(m_dataBuffer->mapPtr(offset), textCopy.data(), textCopy.size());
|
std::memcpy(m_dataBuffer->mapPtr(offset), textCopy.data(), textCopy.size());
|
||||||
|
|
||||||
|
// Enforce HUD opacity factor on alpha
|
||||||
|
if (m_opacity != 1.0f)
|
||||||
|
color.a *= m_opacity;
|
||||||
|
|
||||||
// Fill in push constants for the next draw
|
// Fill in push constants for the next draw
|
||||||
HudTextPushConstants pushData;
|
HudTextPushConstants pushData;
|
||||||
pushData.color = color;
|
pushData.color = color;
|
||||||
@ -95,6 +104,7 @@ namespace dxvk::hud {
|
|||||||
pushData.size = size;
|
pushData.size = size;
|
||||||
pushData.scale.x = m_scale / std::max(float(m_surfaceSize.width), 1.0f);
|
pushData.scale.x = m_scale / std::max(float(m_surfaceSize.width), 1.0f);
|
||||||
pushData.scale.y = m_scale / std::max(float(m_surfaceSize.height), 1.0f);
|
pushData.scale.y = m_scale / std::max(float(m_surfaceSize.height), 1.0f);
|
||||||
|
pushData.opacity = m_opacity;
|
||||||
|
|
||||||
m_context->pushConstants(0, sizeof(pushData), &pushData);
|
m_context->pushConstants(0, sizeof(pushData), &pushData);
|
||||||
m_context->draw(4, 1, 0, 0);
|
m_context->draw(4, 1, 0, 0);
|
||||||
|
@ -67,6 +67,7 @@ namespace dxvk::hud {
|
|||||||
HudPos pos;
|
HudPos pos;
|
||||||
HudPos size;
|
HudPos size;
|
||||||
HudPos scale;
|
HudPos scale;
|
||||||
|
float opacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -106,7 +107,8 @@ namespace dxvk::hud {
|
|||||||
void beginFrame(
|
void beginFrame(
|
||||||
const Rc<DxvkContext>& context,
|
const Rc<DxvkContext>& context,
|
||||||
VkExtent2D surfaceSize,
|
VkExtent2D surfaceSize,
|
||||||
float scale);
|
float scale,
|
||||||
|
float opacity);
|
||||||
|
|
||||||
void drawText(
|
void drawText(
|
||||||
float size,
|
float size,
|
||||||
@ -143,6 +145,7 @@ namespace dxvk::hud {
|
|||||||
|
|
||||||
Mode m_mode;
|
Mode m_mode;
|
||||||
float m_scale;
|
float m_scale;
|
||||||
|
float m_opacity;
|
||||||
VkExtent2D m_surfaceSize;
|
VkExtent2D m_surfaceSize;
|
||||||
|
|
||||||
Rc<DxvkDevice> m_device;
|
Rc<DxvkDevice> m_device;
|
||||||
|
@ -24,6 +24,7 @@ uniform push_data_t {
|
|||||||
vec2 pos;
|
vec2 pos;
|
||||||
vec2 size;
|
vec2 size;
|
||||||
vec2 scale;
|
vec2 scale;
|
||||||
|
float opacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
@ -47,7 +48,7 @@ void main() {
|
|||||||
o_color = mix(
|
o_color = mix(
|
||||||
unpackUnorm4x8(p0.color),
|
unpackUnorm4x8(p0.color),
|
||||||
unpackUnorm4x8(p1.color), fx);
|
unpackUnorm4x8(p1.color), fx);
|
||||||
o_color *= alpha;
|
o_color *= alpha * opacity;
|
||||||
|
|
||||||
o_color.rgb = encodeOutput(o_color.rgb);
|
o_color.rgb = encodeOutput(o_color.rgb);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ uniform push_data_t {
|
|||||||
vec2 pos;
|
vec2 pos;
|
||||||
vec2 size;
|
vec2 size;
|
||||||
vec2 scale;
|
vec2 scale;
|
||||||
|
float opacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user