Files
LNXRNT/Kinc/Backends/Graphics4/Direct3D9/Sources/kinc/backend/graphics4/rendertarget.cpp
2025-01-29 10:55:49 +01:00

134 lines
6.1 KiB
C++

#include <kinc/graphics4/rendertarget.h>
#include <kinc/log.h>
#include <kinc/backend/SystemMicrosoft.h>
#include "Direct3D9.h"
void kinc_g4_render_target_init_with_multisampling(kinc_g4_render_target_t *renderTarget, int width, int height, kinc_g4_render_target_format_t format,
int depthBufferBits, int stencilBufferBits, int samples_per_pixel) {
renderTarget->width = width;
renderTarget->height = height;
renderTarget->texWidth = width;
renderTarget->texHeight = height;
renderTarget->isCubeMap = false;
renderTarget->isDepthAttachment = false;
const bool antialiasing = samples_per_pixel > 1;
renderTarget->impl.antialiasing = antialiasing;
D3DFORMAT d3dformat;
switch (format) {
case KINC_G4_RENDER_TARGET_FORMAT_64BIT_FLOAT:
d3dformat = D3DFMT_A16B16G16R16F;
break;
case KINC_G4_RENDER_TARGET_FORMAT_32BIT_RED_FLOAT:
d3dformat = D3DFMT_R32F;
break;
case KINC_G4_RENDER_TARGET_FORMAT_32BIT:
default:
d3dformat = D3DFMT_A8R8G8B8;
}
#if defined(_DEBUG)
kinc_log(KINC_LOG_LEVEL_INFO, "depthBufferBits not implemented yet, using defaults (D3DFMT_D24S8)");
kinc_log(KINC_LOG_LEVEL_INFO, "stencilBufferBits not implemented yet, using defaults (D3DFMT_D24S8)");
#endif
renderTarget->impl.colorSurface = nullptr;
renderTarget->impl.depthSurface = nullptr;
renderTarget->impl.colorTexture = nullptr;
renderTarget->impl.depthTexture = nullptr;
if (antialiasing) {
kinc_microsoft_affirm(
device->CreateRenderTarget(width, height, d3dformat, D3DMULTISAMPLE_8_SAMPLES, 0, FALSE, &renderTarget->impl.colorSurface, nullptr));
kinc_microsoft_affirm(
device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, D3DMULTISAMPLE_8_SAMPLES, 0, TRUE, &renderTarget->impl.depthSurface, nullptr));
kinc_microsoft_affirm(
device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, d3dformat, D3DPOOL_DEFAULT, &renderTarget->impl.colorTexture, nullptr));
// Microsoft::affirm(device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &depthTexture, nullptr));
renderTarget->impl.depthTexture = nullptr;
}
else {
if (format == KINC_G4_RENDER_TARGET_FORMAT_16BIT_DEPTH) {
kinc_microsoft_affirm(device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, (D3DFORMAT)MAKEFOURCC('N', 'U', 'L', 'L'), D3DPOOL_DEFAULT,
&renderTarget->impl.colorTexture, nullptr));
kinc_microsoft_affirm(device->CreateTexture(width, height, 1, D3DUSAGE_DEPTHSTENCIL, (D3DFORMAT)MAKEFOURCC('I', 'N', 'T', 'Z'), D3DPOOL_DEFAULT,
&renderTarget->impl.depthTexture, nullptr));
renderTarget->isDepthAttachment = true;
}
else {
kinc_microsoft_affirm(
device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, d3dformat, D3DPOOL_DEFAULT, &renderTarget->impl.colorTexture, nullptr));
kinc_microsoft_affirm(
device->CreateTexture(width, height, 1, D3DUSAGE_DEPTHSTENCIL, D3DFMT_D24S8, D3DPOOL_DEFAULT, &renderTarget->impl.depthTexture, nullptr));
}
kinc_microsoft_affirm(renderTarget->impl.colorTexture->GetSurfaceLevel(0, &renderTarget->impl.colorSurface));
kinc_microsoft_affirm(renderTarget->impl.depthTexture->GetSurfaceLevel(0, &renderTarget->impl.depthSurface));
}
}
void kinc_g4_render_target_init_cube_with_multisampling(kinc_g4_render_target_t *renderTarget, int cubeMapSize, kinc_g4_render_target_format_t format,
int depthBufferBits, int stencilBufferBits, int samples_per_pixel) {
renderTarget->isCubeMap = true;
renderTarget->isDepthAttachment = false;
}
void kinc_g4_render_target_destroy(kinc_g4_render_target_t *renderTarget) {
if (renderTarget->impl.colorSurface != nullptr) {
renderTarget->impl.colorSurface->Release();
}
if (renderTarget->impl.depthSurface != nullptr) {
renderTarget->impl.depthSurface->Release();
}
if (renderTarget->impl.colorTexture != nullptr) {
renderTarget->impl.colorTexture->Release();
}
if (renderTarget->impl.depthTexture != nullptr) {
renderTarget->impl.depthTexture->Release();
}
}
#ifdef KINC_KONG
void kinc_g4_render_target_use_color_as_texture(kinc_g4_render_target_t *renderTarget, uint32_t unit) {
if (renderTarget->impl.antialiasing) {
IDirect3DSurface9 *surface;
renderTarget->impl.colorTexture->GetSurfaceLevel(0, &surface);
kinc_microsoft_affirm(device->StretchRect(renderTarget->impl.colorSurface, nullptr, surface, nullptr, D3DTEXF_NONE));
surface->Release();
}
device->SetTexture(unit, renderTarget->isDepthAttachment ? renderTarget->impl.depthTexture : renderTarget->impl.colorTexture);
}
#else
void kinc_g4_render_target_use_color_as_texture(kinc_g4_render_target_t *renderTarget, kinc_g4_texture_unit_t unit) {
if (renderTarget->impl.antialiasing) {
IDirect3DSurface9 *surface;
renderTarget->impl.colorTexture->GetSurfaceLevel(0, &surface);
kinc_microsoft_affirm(device->StretchRect(renderTarget->impl.colorSurface, nullptr, surface, nullptr, D3DTEXF_NONE));
surface->Release();
}
device->SetTexture(unit.stages[KINC_G4_SHADER_TYPE_FRAGMENT],
renderTarget->isDepthAttachment ? renderTarget->impl.depthTexture : renderTarget->impl.colorTexture);
}
#endif
void kinc_g4_render_target_set_depth_stencil_from(kinc_g4_render_target_t *renderTarget, kinc_g4_render_target_t *source) {
renderTarget->impl.depthTexture = source->impl.depthTexture;
renderTarget->impl.depthSurface = source->impl.depthSurface;
}
void kinc_g4_render_target_use_depth_as_texture(kinc_g4_render_target_t *renderTarget, kinc_g4_texture_unit_t unit) {
if (renderTarget->impl.antialiasing) {
IDirect3DSurface9 *surface;
renderTarget->impl.depthTexture->GetSurfaceLevel(0, &surface);
kinc_microsoft_affirm(device->StretchRect(renderTarget->impl.depthSurface, nullptr, surface, nullptr, D3DTEXF_NONE));
surface->Release();
}
device->SetTexture(unit.stages[KINC_G4_SHADER_TYPE_FRAGMENT], renderTarget->impl.depthTexture);
}
void kinc_g4_render_target_get_pixels(kinc_g4_render_target_t *renderTarget, uint8_t *data) {}
void kinc_g4_render_target_generate_mipmaps(kinc_g4_render_target_t *renderTarget, int levels) {}