DX12: 16 bit textures.
This commit is contained in:
parent
6e4a2f13aa
commit
c81a77fe4b
|
|
@ -1333,17 +1333,9 @@ void dx_begin_frame() {
|
||||||
|
|
||||||
dx.frame_index = dx.swapchain->GetCurrentBackBufferIndex();
|
dx.frame_index = dx.swapchain->GetCurrentBackBufferIndex();
|
||||||
|
|
||||||
// Command list allocators can only be reset when the associated
|
|
||||||
// command lists have finished execution on the GPU; apps should use
|
|
||||||
// fences to determine GPU execution progress.
|
|
||||||
DX_CHECK(dx.command_allocator->Reset());
|
DX_CHECK(dx.command_allocator->Reset());
|
||||||
|
|
||||||
// However, when ExecuteCommandList() is called on a particular command
|
|
||||||
// list, that command list can then be reset at any time and must be before
|
|
||||||
// re-recording.
|
|
||||||
DX_CHECK(dx.command_list->Reset(dx.command_allocator, nullptr));
|
DX_CHECK(dx.command_list->Reset(dx.command_allocator, nullptr));
|
||||||
|
|
||||||
// Set necessary state.
|
|
||||||
dx.command_list->SetGraphicsRootSignature(dx.root_signature);
|
dx.command_list->SetGraphicsRootSignature(dx.root_signature);
|
||||||
|
|
||||||
ID3D12DescriptorHeap* heaps[] = { dx.srv_heap, dx.sampler_heap };
|
ID3D12DescriptorHeap* heaps[] = { dx.srv_heap, dx.sampler_heap };
|
||||||
|
|
@ -1357,14 +1349,10 @@ void dx_begin_frame() {
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE rtv_handle(dx.rtv_heap->GetCPUDescriptorHandleForHeapStart(), dx.frame_index, dx.rtv_descriptor_size);
|
CD3DX12_CPU_DESCRIPTOR_HANDLE rtv_handle(dx.rtv_heap->GetCPUDescriptorHandleForHeapStart(), dx.frame_index, dx.rtv_descriptor_size);
|
||||||
dx.command_list->OMSetRenderTargets(1, &rtv_handle, FALSE, &dsv_handle);
|
dx.command_list->OMSetRenderTargets(1, &rtv_handle, FALSE, &dsv_handle);
|
||||||
|
|
||||||
// Record commands.
|
|
||||||
const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
|
|
||||||
dx.command_list->ClearRenderTargetView(rtv_handle, clearColor, 0, nullptr);
|
|
||||||
dx.command_list->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
|
||||||
|
|
||||||
D3D12_CLEAR_FLAGS flags = D3D12_CLEAR_FLAG_DEPTH;
|
D3D12_CLEAR_FLAGS flags = D3D12_CLEAR_FLAG_DEPTH;
|
||||||
if (r_shadows->integer == 2)
|
if (r_shadows->integer == 2)
|
||||||
flags |= D3D12_CLEAR_FLAG_STENCIL;
|
flags |= D3D12_CLEAR_FLAG_STENCIL;
|
||||||
|
|
||||||
dx.command_list->ClearDepthStencilView(dsv_handle, flags, 1.0f, 0, 0, nullptr);
|
dx.command_list->ClearDepthStencilView(dsv_handle, flags, 1.0f, 0, 0, nullptr);
|
||||||
|
|
||||||
dx.xyz_elements = 0;
|
dx.xyz_elements = 0;
|
||||||
|
|
|
||||||
|
|
@ -714,44 +714,49 @@ static Dx_Image upload_dx_image(const Image_Upload_Data& upload_data, bool repea
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte* buffer = upload_data.buffer;
|
||||||
DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
if (r_texturebits->integer <= 16) {
|
|
||||||
format = has_alpha ? DXGI_FORMAT_B4G4R4A4_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM;
|
|
||||||
}
|
|
||||||
|
|
||||||
int bytes_per_pixel = 4;
|
int bytes_per_pixel = 4;
|
||||||
|
|
||||||
if (format == DXGI_FORMAT_B5G5R5A1_UNORM) {
|
if (r_texturebits->integer <= 16) {
|
||||||
|
buffer = (byte*) ri.Hunk_AllocateTempMemory( upload_data.buffer_size / 2 );
|
||||||
|
format = has_alpha ? DXGI_FORMAT_B4G4R4A4_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM;
|
||||||
bytes_per_pixel = 2;
|
bytes_per_pixel = 2;
|
||||||
auto p = (uint16_t*)upload_data.buffer;
|
}
|
||||||
|
|
||||||
|
if (format == DXGI_FORMAT_B5G5R5A1_UNORM) {
|
||||||
|
auto p = (uint16_t*)buffer;
|
||||||
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
||||||
byte r = upload_data.buffer[i+0];
|
byte r = upload_data.buffer[i+0];
|
||||||
byte g = upload_data.buffer[i+1];
|
byte g = upload_data.buffer[i+1];
|
||||||
byte b = upload_data.buffer[i+2];
|
byte b = upload_data.buffer[i+2];
|
||||||
|
|
||||||
*p = uint32_t((b/255.0) * 31.0 + 0.5) |
|
*p = (uint32_t((b/255.0) * 31.0 + 0.5) << 0) |
|
||||||
(uint32_t((g/255.0) * 31.0 + 0.5) << 5) |
|
(uint32_t((g/255.0) * 31.0 + 0.5) << 5) |
|
||||||
(uint32_t((r/255.0) * 31.0 + 0.5) << 10) |
|
(uint32_t((r/255.0) * 31.0 + 0.5) << 10) |
|
||||||
(1 << 15);
|
(1 << 15);
|
||||||
}
|
}
|
||||||
} else if (format == DXGI_FORMAT_B4G4R4A4_UNORM) {
|
} else if (format == DXGI_FORMAT_B4G4R4A4_UNORM) {
|
||||||
bytes_per_pixel = 2;
|
auto p = (uint16_t*)buffer;
|
||||||
auto p = (uint16_t*)upload_data.buffer;
|
|
||||||
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
||||||
byte r = upload_data.buffer[i+0];
|
byte r = upload_data.buffer[i+0];
|
||||||
byte g = upload_data.buffer[i+1];
|
byte g = upload_data.buffer[i+1];
|
||||||
byte b = upload_data.buffer[i+2];
|
byte b = upload_data.buffer[i+2];
|
||||||
byte a = upload_data.buffer[i+3];
|
byte a = upload_data.buffer[i+3];
|
||||||
|
|
||||||
*p = uint32_t((a/255.0) * 15.0 + 0.5) |
|
*p =(uint32_t((b/255.0) * 15.0 + 0.5) << 0) |
|
||||||
(uint32_t((r/255.0) * 15.0 + 0.5) << 4) |
|
(uint32_t((g/255.0) * 15.0 + 0.5) << 4) |
|
||||||
(uint32_t((g/255.0) * 15.0 + 0.5) << 8) |
|
(uint32_t((r/255.0) * 15.0 + 0.5) << 8) |
|
||||||
(uint32_t((b/255.0) * 15.0 + 0.5) << 12);
|
(uint32_t((a/255.0) * 15.0 + 0.5) << 12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dx_Image image = dx_create_image(w, h, format, upload_data.mip_levels, repeat_texture, image_index);
|
Dx_Image image = dx_create_image(w, h, format, upload_data.mip_levels, repeat_texture, image_index);
|
||||||
dx_upload_image_data(image.texture, w, h, upload_data.mip_levels, upload_data.buffer, bytes_per_pixel);
|
dx_upload_image_data(image.texture, w, h, upload_data.mip_levels, buffer, bytes_per_pixel);
|
||||||
|
|
||||||
|
if (bytes_per_pixel == 2)
|
||||||
|
ri.Hunk_FreeTempMemory(buffer);
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -767,16 +772,19 @@ static Vk_Image upload_vk_image(const Image_Upload_Data& upload_data, bool repea
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
if (r_texturebits->integer <= 16) {
|
|
||||||
format = has_alpha ? VK_FORMAT_B4G4R4A4_UNORM_PACK16 : VK_FORMAT_A1R5G5B5_UNORM_PACK16;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
byte* buffer = upload_data.buffer;
|
||||||
|
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
int bytes_per_pixel = 4;
|
int bytes_per_pixel = 4;
|
||||||
|
|
||||||
if (format == VK_FORMAT_A1R5G5B5_UNORM_PACK16) {
|
if (r_texturebits->integer <= 16) {
|
||||||
|
buffer = (byte*) ri.Hunk_AllocateTempMemory( upload_data.buffer_size / 2 );
|
||||||
|
format = has_alpha ? VK_FORMAT_B4G4R4A4_UNORM_PACK16 : VK_FORMAT_A1R5G5B5_UNORM_PACK16;
|
||||||
bytes_per_pixel = 2;
|
bytes_per_pixel = 2;
|
||||||
auto p = (uint16_t*)upload_data.buffer;
|
}
|
||||||
|
|
||||||
|
if (format == VK_FORMAT_A1R5G5B5_UNORM_PACK16) {
|
||||||
|
auto p = (uint16_t*)buffer;
|
||||||
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
||||||
byte r = upload_data.buffer[i+0];
|
byte r = upload_data.buffer[i+0];
|
||||||
byte g = upload_data.buffer[i+1];
|
byte g = upload_data.buffer[i+1];
|
||||||
|
|
@ -788,8 +796,7 @@ static Vk_Image upload_vk_image(const Image_Upload_Data& upload_data, bool repea
|
||||||
(1 << 15);
|
(1 << 15);
|
||||||
}
|
}
|
||||||
} else if (format == VK_FORMAT_B4G4R4A4_UNORM_PACK16) {
|
} else if (format == VK_FORMAT_B4G4R4A4_UNORM_PACK16) {
|
||||||
bytes_per_pixel = 2;
|
auto p = (uint16_t*)buffer;
|
||||||
auto p = (uint16_t*)upload_data.buffer;
|
|
||||||
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
for (int i = 0; i < upload_data.buffer_size; i += 4, p++) {
|
||||||
byte r = upload_data.buffer[i+0];
|
byte r = upload_data.buffer[i+0];
|
||||||
byte g = upload_data.buffer[i+1];
|
byte g = upload_data.buffer[i+1];
|
||||||
|
|
@ -804,7 +811,11 @@ static Vk_Image upload_vk_image(const Image_Upload_Data& upload_data, bool repea
|
||||||
}
|
}
|
||||||
|
|
||||||
Vk_Image image = vk_create_image(w, h, format, upload_data.mip_levels, repeat_texture);
|
Vk_Image image = vk_create_image(w, h, format, upload_data.mip_levels, repeat_texture);
|
||||||
vk_upload_image_data(image.handle, w, h, upload_data.mip_levels > 1, upload_data.buffer, bytes_per_pixel);
|
vk_upload_image_data(image.handle, w, h, upload_data.mip_levels > 1, buffer, bytes_per_pixel);
|
||||||
|
|
||||||
|
if (bytes_per_pixel == 2)
|
||||||
|
ri.Hunk_FreeTempMemory(buffer);
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user