mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
dxgsg9: support texture clear, gracefully handle 0x0 textures
This commit is contained in:
parent
f3aaa12adc
commit
6a1d717e90
@ -365,6 +365,12 @@ create_texture(DXScreenData &scrn) {
|
|||||||
shrink_original = true;
|
shrink_original = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (target_width == 0 || target_height == 0) {
|
||||||
|
// We can't create a zero-sized texture, so change it to 1x1.
|
||||||
|
target_width = 1;
|
||||||
|
target_height = 1;
|
||||||
|
}
|
||||||
|
|
||||||
const char *error_message;
|
const char *error_message;
|
||||||
|
|
||||||
error_message = "create_texture failed: couldn't find compatible device Texture Pixel Format for input texture";
|
error_message = "create_texture failed: couldn't find compatible device Texture Pixel Format for input texture";
|
||||||
@ -1721,16 +1727,32 @@ HRESULT DXTextureContext9::fill_d3d_texture_mipmap_pixels(int mip_level, int dep
|
|||||||
bool using_temp_buffer = false;
|
bool using_temp_buffer = false;
|
||||||
HRESULT hr = E_FAIL;
|
HRESULT hr = E_FAIL;
|
||||||
CPTA_uchar image = get_texture()->get_ram_mipmap_image(mip_level);
|
CPTA_uchar image = get_texture()->get_ram_mipmap_image(mip_level);
|
||||||
nassertr(!image.is_null(), E_FAIL);
|
|
||||||
BYTE *pixels = (BYTE*) image.p();
|
BYTE *pixels = (BYTE*) image.p();
|
||||||
DWORD width = (DWORD) get_texture()->get_expected_mipmap_x_size(mip_level);
|
DWORD width = (DWORD) get_texture()->get_expected_mipmap_x_size(mip_level);
|
||||||
DWORD height = (DWORD) get_texture()->get_expected_mipmap_y_size(mip_level);
|
DWORD height = (DWORD) get_texture()->get_expected_mipmap_y_size(mip_level);
|
||||||
int component_width = get_texture()->get_component_width();
|
int component_width = get_texture()->get_component_width();
|
||||||
|
|
||||||
size_t view_size = get_texture()->get_ram_mipmap_view_size(mip_level);
|
|
||||||
pixels += view_size * get_view();
|
|
||||||
size_t page_size = get_texture()->get_expected_ram_mipmap_page_size(mip_level);
|
size_t page_size = get_texture()->get_expected_ram_mipmap_page_size(mip_level);
|
||||||
|
size_t view_size;
|
||||||
|
vector_uchar clear_data;
|
||||||
|
if (page_size > 0) {
|
||||||
|
if (image.is_null()) {
|
||||||
|
// Make an image, filled with the texture's clear color.
|
||||||
|
image = get_texture()->make_ram_mipmap_image(mip_level);
|
||||||
|
nassertr(!image.is_null(), E_FAIL);
|
||||||
|
pixels = (BYTE *)image.p();
|
||||||
|
}
|
||||||
|
view_size = image.size();
|
||||||
|
pixels += view_size * get_view();
|
||||||
pixels += page_size * depth_index;
|
pixels += page_size * depth_index;
|
||||||
|
} else {
|
||||||
|
// This is a 0x0 texture, which gets loaded as though it were 1x1.
|
||||||
|
width = 1;
|
||||||
|
height = 1;
|
||||||
|
clear_data = get_texture()->get_clear_data();
|
||||||
|
pixels = clear_data.data();
|
||||||
|
view_size = clear_data.size();
|
||||||
|
}
|
||||||
|
|
||||||
if (get_texture()->get_texture_type() == Texture::TT_cube_map) {
|
if (get_texture()->get_texture_type() == Texture::TT_cube_map) {
|
||||||
nassertr(IS_VALID_PTR(_d3d_cube_texture), E_FAIL);
|
nassertr(IS_VALID_PTR(_d3d_cube_texture), E_FAIL);
|
||||||
@ -1909,7 +1931,9 @@ fill_d3d_texture_pixels(DXScreenData &scrn, bool compress_texture) {
|
|||||||
DWORD flags;
|
DWORD flags;
|
||||||
D3DCOLOR color;
|
D3DCOLOR color;
|
||||||
|
|
||||||
color = 0xFF000000;
|
LColor scaled = tex->get_clear_color().fmin(LColor(1)).fmax(LColor::zero());
|
||||||
|
scaled *= 255;
|
||||||
|
color = D3DCOLOR_RGBA((int)scaled[0], (int)scaled[1], (int)scaled[2], (int)scaled[3]);
|
||||||
flags = D3DCLEAR_TARGET;
|
flags = D3DCLEAR_TARGET;
|
||||||
if (device -> Clear (NULL, NULL, flags, color, 0.0f, 0) == D3D_OK) {
|
if (device -> Clear (NULL, NULL, flags, color, 0.0f, 0) == D3D_OK) {
|
||||||
}
|
}
|
||||||
@ -1933,9 +1957,8 @@ fill_d3d_texture_pixels(DXScreenData &scrn, bool compress_texture) {
|
|||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
return E_FAIL;
|
|
||||||
}
|
}
|
||||||
nassertr(IS_VALID_PTR((BYTE*)image.p()), E_FAIL);
|
//nassertr(IS_VALID_PTR((BYTE*)image.p()), E_FAIL);
|
||||||
nassertr(IS_VALID_PTR(_d3d_texture), E_FAIL);
|
nassertr(IS_VALID_PTR(_d3d_texture), E_FAIL);
|
||||||
|
|
||||||
PStatTimer timer(GraphicsStateGuardian::_load_texture_pcollector);
|
PStatTimer timer(GraphicsStateGuardian::_load_texture_pcollector);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user