Add support for:

Texture::F_rgba16
Texture::F_rgba32
This commit is contained in:
aignacio_sf 2006-12-08 22:44:06 +00:00
parent 6bb18ad099
commit c8c7eaf6fb
2 changed files with 52 additions and 10 deletions

View File

@ -97,6 +97,8 @@ create_texture(DXScreenData &scrn) {
DWORD target_bpp = get_bits_per_pixel(get_texture()->get_format(), &num_alpha_bits);
DWORD num_color_channels = get_texture()->get_num_components();
// printf ("target_bpp %d, num_color_channels %d num_alpha_bits %d \n", target_bpp, num_color_channels, num_alpha_bits);
//PRINT_REFCNT(dxgsg9, scrn._d3d9);
DWORD orig_width = (DWORD)get_texture()->get_x_size();
@ -291,6 +293,26 @@ create_texture(DXScreenData &scrn) {
// target_bpp is REQUESTED bpp, not what exists in the texture
// array (the texture array contains num_color_channels*8bits)
case 128:
// check if format is supported
if (scrn._supports_rgba32f_texture_format) {
target_pixel_format = D3DFMT_A32B32G32R32F;
}
else {
target_pixel_format = scrn._render_to_texture_d3d_format;
}
goto found_matching_format;
case 64:
// check if format is supported
if (scrn._supports_rgba16f_texture_format) {
target_pixel_format = D3DFMT_A16B16G16R16F;
}
else {
target_pixel_format = scrn._render_to_texture_d3d_format;
}
goto found_matching_format;
case 32:
if (!((num_color_channels == 3) || (num_color_channels == 4)))
break; //bail
@ -643,13 +665,21 @@ create_texture(DXScreenData &scrn) {
D3DPOOL pool;
usage = 0;
// if (get_texture()->get_render_to_texture ( )) {
if (get_texture()->get_render_to_texture ( )) {
// REQUIRED PARAMETERS
_managed = false;
pool = D3DPOOL_DEFAULT;
usage = D3DUSAGE_RENDERTARGET;
target_pixel_format = scrn._render_to_texture_d3d_format;
if (target_bpp <= 32 ) {
target_pixel_format = scrn._render_to_texture_d3d_format;
}
dxgsg9_cat.debug ()
<< "*** RENDER TO TEXTURE ***: format "
<< D3DFormatStr(target_pixel_format)
<< " "
<< target_pixel_format
<< "\n";
}
else {
_managed = scrn._managed_textures;
@ -748,12 +778,10 @@ create_texture(DXScreenData &scrn) {
data_size = target_width * target_height * target_depth;
data_size = (int) ((float) data_size * bytes_per_texel);
if (_has_mipmaps)
{
if (_has_mipmaps) {
data_size = (int) ((float) data_size * 1.3f);
}
if (get_texture()->get_texture_type() == Texture::TT_cube_map)
{
if (get_texture()->get_texture_type() == Texture::TT_cube_map) {
data_size *= 6;
}
update_data_size_bytes(data_size);
@ -808,6 +836,12 @@ create_texture(DXScreenData &scrn) {
hr = fill_d3d_texture_pixels(scrn._supports_automatic_mipmap_generation);
if (FAILED(hr)) {
dxgsg9_cat.debug ()
<< "*** fill_d3d_texture_pixels failed ***: format "
<< target_pixel_format
<< "\n";
goto error_exit;
}
@ -815,16 +849,16 @@ create_texture(DXScreenData &scrn) {
if (!_managed && !get_texture()->get_render_to_texture()) {
if (_lru_page == 0) {
Lru *lru;
lru = scrn._dxgsg9 -> _lru;
if (lru) {
LruPage *lru_page;
lru_page = lru -> allocate_page (data_size);
if (lru_page) {
lru_page -> _m.v.type = GPT_Texture;
lru_page -> _m.lru_page_type.pointer = this;
lru -> add_cached_page (LPP_New, lru_page);
_lru_page = lru_page;
}
@ -1544,6 +1578,12 @@ get_bits_per_pixel(Texture::Format format, int *alphbits) {
case Texture::F_rgba12:
*alphbits = 12;
return 48;
case Texture::F_rgba16:
*alphbits = 16;
return 64;
case Texture::F_rgba32:
*alphbits = 32;
return 128;
}
return 8;
}

View File

@ -919,7 +919,9 @@ const char *D3DFormatStr(D3DFORMAT fmt) {
CASESTR(D3DFMT_D24X4S4);
CASESTR(D3DFMT_VERTEXDATA);
CASESTR(D3DFMT_INDEX16);
CASESTR(D3DFMT_INDEX32);
CASESTR(D3DFMT_INDEX32);
CASESTR(D3DFMT_A16B16G16R16F);
CASESTR(D3DFMT_A32B32G32R32F);
}
return "Invalid D3DFORMAT";