diff --git a/panda/src/dxgsg9/dxTextureContext9.cxx b/panda/src/dxgsg9/dxTextureContext9.cxx index e6672b4402..d3803061bf 100755 --- a/panda/src/dxgsg9/dxTextureContext9.cxx +++ b/panda/src/dxgsg9/dxTextureContext9.cxx @@ -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; } diff --git a/panda/src/dxgsg9/wdxGraphicsPipe9.cxx b/panda/src/dxgsg9/wdxGraphicsPipe9.cxx index 30e9d18853..1a5c8e17c9 100755 --- a/panda/src/dxgsg9/wdxGraphicsPipe9.cxx +++ b/panda/src/dxgsg9/wdxGraphicsPipe9.cxx @@ -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";