mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Rework HUD font texture initialization
We really shouldn't need a separate context for this.
This commit is contained in:
parent
425fce9200
commit
95b7e6c030
@ -12,13 +12,13 @@ namespace dxvk::hud {
|
|||||||
: m_mode (Mode::RenderNone),
|
: m_mode (Mode::RenderNone),
|
||||||
m_scale (1.0f),
|
m_scale (1.0f),
|
||||||
m_surfaceSize { 0, 0 },
|
m_surfaceSize { 0, 0 },
|
||||||
m_textShaders (createTextShaders(device)),
|
m_device (device),
|
||||||
m_lineShaders (createLineShaders(device)),
|
m_textShaders (createTextShaders()),
|
||||||
m_fontImage (createFontImage(device)),
|
m_lineShaders (createLineShaders()),
|
||||||
m_fontView (createFontView(device)),
|
m_fontImage (createFontImage()),
|
||||||
m_fontSampler (createFontSampler(device)),
|
m_fontView (createFontView()),
|
||||||
m_vertexBuffer (createVertexBuffer(device)) {
|
m_fontSampler (createFontSampler()),
|
||||||
this->initFontTexture(device);
|
m_vertexBuffer (createVertexBuffer()) {
|
||||||
this->initCharMap();
|
this->initCharMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -29,6 +29,9 @@ 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) {
|
||||||
|
if (!m_initialized)
|
||||||
|
this->initFontTexture(context);
|
||||||
|
|
||||||
context->bindResourceSampler(0, m_fontSampler);
|
context->bindResourceSampler(0, m_fontSampler);
|
||||||
context->bindResourceView (0, m_fontView, nullptr);
|
context->bindResourceView (0, m_fontView, nullptr);
|
||||||
|
|
||||||
@ -214,7 +217,7 @@ namespace dxvk::hud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HudRenderer::ShaderPair HudRenderer::createTextShaders(const Rc<DxvkDevice>& device) {
|
HudRenderer::ShaderPair HudRenderer::createTextShaders() {
|
||||||
ShaderPair result;
|
ShaderPair result;
|
||||||
|
|
||||||
const SpirvCodeBuffer vsCode(hud_text_vert);
|
const SpirvCodeBuffer vsCode(hud_text_vert);
|
||||||
@ -225,11 +228,11 @@ namespace dxvk::hud {
|
|||||||
{ 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_IMAGE_VIEW_TYPE_2D },
|
{ 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_IMAGE_VIEW_TYPE_2D },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
result.vert = device->createShader(
|
result.vert = m_device->createShader(
|
||||||
VK_SHADER_STAGE_VERTEX_BIT,
|
VK_SHADER_STAGE_VERTEX_BIT,
|
||||||
0, nullptr, { 0x7, 0x3 }, vsCode);
|
0, nullptr, { 0x7, 0x3 }, vsCode);
|
||||||
|
|
||||||
result.frag = device->createShader(
|
result.frag = m_device->createShader(
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
fsResources.size(),
|
fsResources.size(),
|
||||||
fsResources.data(),
|
fsResources.data(),
|
||||||
@ -240,17 +243,17 @@ namespace dxvk::hud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HudRenderer::ShaderPair HudRenderer::createLineShaders(const Rc<DxvkDevice>& device) {
|
HudRenderer::ShaderPair HudRenderer::createLineShaders() {
|
||||||
ShaderPair result;
|
ShaderPair result;
|
||||||
|
|
||||||
const SpirvCodeBuffer vsCode(hud_line_vert);
|
const SpirvCodeBuffer vsCode(hud_line_vert);
|
||||||
const SpirvCodeBuffer fsCode(hud_line_frag);
|
const SpirvCodeBuffer fsCode(hud_line_frag);
|
||||||
|
|
||||||
result.vert = device->createShader(
|
result.vert = m_device->createShader(
|
||||||
VK_SHADER_STAGE_VERTEX_BIT,
|
VK_SHADER_STAGE_VERTEX_BIT,
|
||||||
0, nullptr, { 0x3, 0x1 }, vsCode);
|
0, nullptr, { 0x3, 0x1 }, vsCode);
|
||||||
|
|
||||||
result.frag = device->createShader(
|
result.frag = m_device->createShader(
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
0, nullptr, { 0x1, 0x1 }, fsCode);
|
0, nullptr, { 0x1, 0x1 }, fsCode);
|
||||||
|
|
||||||
@ -258,7 +261,7 @@ namespace dxvk::hud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkImage> HudRenderer::createFontImage(const Rc<DxvkDevice>& device) {
|
Rc<DxvkImage> HudRenderer::createFontImage() {
|
||||||
DxvkImageCreateInfo info;
|
DxvkImageCreateInfo info;
|
||||||
info.type = VK_IMAGE_TYPE_2D;
|
info.type = VK_IMAGE_TYPE_2D;
|
||||||
info.format = VK_FORMAT_R8_UNORM;
|
info.format = VK_FORMAT_R8_UNORM;
|
||||||
@ -276,11 +279,11 @@ namespace dxvk::hud {
|
|||||||
info.tiling = VK_IMAGE_TILING_OPTIMAL;
|
info.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
info.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
info.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
|
||||||
return device->createImage(info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
return m_device->createImage(info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkImageView> HudRenderer::createFontView(const Rc<DxvkDevice>& device) {
|
Rc<DxvkImageView> HudRenderer::createFontView() {
|
||||||
DxvkImageViewCreateInfo info;
|
DxvkImageViewCreateInfo info;
|
||||||
info.type = VK_IMAGE_VIEW_TYPE_2D;
|
info.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
info.format = m_fontImage->info().format;
|
info.format = m_fontImage->info().format;
|
||||||
@ -291,11 +294,11 @@ namespace dxvk::hud {
|
|||||||
info.minLayer = 0;
|
info.minLayer = 0;
|
||||||
info.numLayers = 1;
|
info.numLayers = 1;
|
||||||
|
|
||||||
return device->createImageView(m_fontImage, info);
|
return m_device->createImageView(m_fontImage, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkSampler> HudRenderer::createFontSampler(const Rc<DxvkDevice>& device) {
|
Rc<DxvkSampler> HudRenderer::createFontSampler() {
|
||||||
DxvkSamplerCreateInfo info;
|
DxvkSamplerCreateInfo info;
|
||||||
info.magFilter = VK_FILTER_LINEAR;
|
info.magFilter = VK_FILTER_LINEAR;
|
||||||
info.minFilter = VK_FILTER_LINEAR;
|
info.minFilter = VK_FILTER_LINEAR;
|
||||||
@ -313,18 +316,18 @@ namespace dxvk::hud {
|
|||||||
info.borderColor = VkClearColorValue();
|
info.borderColor = VkClearColorValue();
|
||||||
info.usePixelCoord = VK_TRUE;
|
info.usePixelCoord = VK_TRUE;
|
||||||
|
|
||||||
return device->createSampler(info);
|
return m_device->createSampler(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkBuffer> HudRenderer::createVertexBuffer(const Rc<DxvkDevice>& device) {
|
Rc<DxvkBuffer> HudRenderer::createVertexBuffer() {
|
||||||
DxvkBufferCreateInfo info;
|
DxvkBufferCreateInfo info;
|
||||||
info.size = sizeof(VertexBufferData);
|
info.size = sizeof(VertexBufferData);
|
||||||
info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||||
info.stages = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
|
info.stages = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
|
||||||
info.access = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
|
info.access = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
|
||||||
|
|
||||||
return device->createBuffer(info,
|
return m_device->createBuffer(info,
|
||||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
||||||
@ -332,26 +335,24 @@ namespace dxvk::hud {
|
|||||||
|
|
||||||
|
|
||||||
void HudRenderer::initFontTexture(
|
void HudRenderer::initFontTexture(
|
||||||
const Rc<DxvkDevice>& device) {
|
const Rc<DxvkContext>& context) {
|
||||||
Rc<DxvkContext> context = device->createContext();
|
DxvkBufferCreateInfo bufferInfo;
|
||||||
|
bufferInfo.size = g_hudFont.width * g_hudFont.height;
|
||||||
|
bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
bufferInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||||
|
bufferInfo.access = VK_ACCESS_TRANSFER_READ_BIT;
|
||||||
|
|
||||||
|
auto stagingBuffer = m_device->createBuffer(bufferInfo,
|
||||||
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
||||||
|
std::memcpy(stagingBuffer->mapPtr(0), g_hudFont.texture, bufferInfo.size);
|
||||||
|
|
||||||
|
context->copyBufferToImage(m_fontImage,
|
||||||
|
VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 },
|
||||||
|
VkOffset3D { 0, 0, 0 },
|
||||||
|
VkExtent3D { g_hudFont.width, g_hudFont.height, 1 },
|
||||||
|
stagingBuffer, 0, 0, 0);
|
||||||
|
|
||||||
context->beginRecording(
|
m_initialized = true;
|
||||||
device->createCommandList());
|
|
||||||
|
|
||||||
context->uploadImage(m_fontImage,
|
|
||||||
VkImageSubresourceLayers {
|
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
|
||||||
0, 0, 1 },
|
|
||||||
g_hudFont.texture,
|
|
||||||
g_hudFont.width,
|
|
||||||
g_hudFont.width * g_hudFont.height);
|
|
||||||
|
|
||||||
device->submitCommandList(
|
|
||||||
context->endRecording(),
|
|
||||||
VK_NULL_HANDLE,
|
|
||||||
VK_NULL_HANDLE);
|
|
||||||
|
|
||||||
context->trimStagingBuffers();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,6 +132,8 @@ namespace dxvk::hud {
|
|||||||
Mode m_mode;
|
Mode m_mode;
|
||||||
float m_scale;
|
float m_scale;
|
||||||
VkExtent2D m_surfaceSize;
|
VkExtent2D m_surfaceSize;
|
||||||
|
|
||||||
|
Rc<DxvkDevice> m_device;
|
||||||
Rc<DxvkContext> m_context;
|
Rc<DxvkContext> m_context;
|
||||||
|
|
||||||
ShaderPair m_textShaders;
|
ShaderPair m_textShaders;
|
||||||
@ -148,32 +150,25 @@ namespace dxvk::hud {
|
|||||||
uint32_t m_currTextInstance = 0;
|
uint32_t m_currTextInstance = 0;
|
||||||
uint32_t m_currLineVertex = 0;
|
uint32_t m_currLineVertex = 0;
|
||||||
|
|
||||||
|
bool m_initialized = false;
|
||||||
|
|
||||||
void allocVertexBufferSlice();
|
void allocVertexBufferSlice();
|
||||||
|
|
||||||
void beginTextRendering();
|
void beginTextRendering();
|
||||||
|
|
||||||
void beginLineRendering();
|
void beginLineRendering();
|
||||||
|
|
||||||
ShaderPair createTextShaders(
|
ShaderPair createTextShaders();
|
||||||
const Rc<DxvkDevice>& device);
|
ShaderPair createLineShaders();
|
||||||
|
|
||||||
|
Rc<DxvkImage> createFontImage();
|
||||||
|
Rc<DxvkImageView> createFontView();
|
||||||
|
|
||||||
ShaderPair createLineShaders(
|
Rc<DxvkSampler> createFontSampler();
|
||||||
const Rc<DxvkDevice>& device);
|
Rc<DxvkBuffer> createVertexBuffer();
|
||||||
|
|
||||||
Rc<DxvkImage> createFontImage(
|
|
||||||
const Rc<DxvkDevice>& device);
|
|
||||||
|
|
||||||
Rc<DxvkImageView> createFontView(
|
|
||||||
const Rc<DxvkDevice>& device);
|
|
||||||
|
|
||||||
Rc<DxvkSampler> createFontSampler(
|
|
||||||
const Rc<DxvkDevice>& device);
|
|
||||||
|
|
||||||
Rc<DxvkBuffer> createVertexBuffer(
|
|
||||||
const Rc<DxvkDevice>& device);
|
|
||||||
|
|
||||||
void initFontTexture(
|
void initFontTexture(
|
||||||
const Rc<DxvkDevice>& device);
|
const Rc<DxvkContext>& context);
|
||||||
|
|
||||||
void initCharMap();
|
void initCharMap();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user