fix bugs with shaders and with pre-compressed textures
This commit is contained in:
parent
f723924399
commit
d6f8308127
|
|
@ -342,7 +342,7 @@ create_texture(DXScreenData &scrn) {
|
|||
target_pixel_format = D3DFMT_##FMT; \
|
||||
goto found_matching_format; }
|
||||
|
||||
if (texture_stored_compressed){
|
||||
if (texture_stored_compressed && compress_texture) {
|
||||
// if the texture is already compressed, we need to choose the
|
||||
// corresponding format, otherwise we might end up
|
||||
// cross-compressing from e.g. DXT5 to DXT3
|
||||
|
|
@ -363,9 +363,8 @@ create_texture(DXScreenData &scrn) {
|
|||
CHECK_FOR_FMT(DXT5);
|
||||
break;
|
||||
}
|
||||
// if we can't support the texture's compressed image, we can't
|
||||
// load the texture.
|
||||
goto error_exit;
|
||||
|
||||
// We don't support the compressed format. Fall through.
|
||||
}
|
||||
|
||||
if (compress_texture) {
|
||||
|
|
@ -1485,7 +1484,7 @@ fill_d3d_texture_pixels(DXScreenData &scrn) {
|
|||
D3DFORMAT source_format = _d3d_format;
|
||||
|
||||
// check for compressed textures and adjust source_format accordingly
|
||||
switch (tex->get_ram_image_compression()) {
|
||||
switch (image_compression) {
|
||||
case Texture::CM_dxt1:
|
||||
source_format = D3DFMT_DXT1;
|
||||
break;
|
||||
|
|
@ -1579,7 +1578,12 @@ fill_d3d_volume_texture_pixels(DXScreenData &scrn) {
|
|||
image_compression = tex->get_ram_image_compression();
|
||||
}
|
||||
|
||||
if (!scrn._dxgsg8->get_supports_compressed_texture_format(image_compression)) {
|
||||
if (!scrn._dxgsg8->get_supports_compressed_texture_format(image_compression) ||
|
||||
tex->get_x_size() < 4 || tex->get_y_size() < 4) {
|
||||
// If we don't support this particular compression method, or in
|
||||
// any case if the texture is too small (DirectX won't accept a
|
||||
// small compressed texture), then fetch and load the uncompressed
|
||||
// version instead.
|
||||
image = tex->get_uncompressed_ram_image();
|
||||
image_compression = Texture::CM_off;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1383,7 +1383,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
|
|||
_vertex_array_shader_context = _current_shader_context;
|
||||
|
||||
const GeomVertexFormat *format = _data_reader->get_format ( );
|
||||
const GeomVertexArrayDataHandle *data;
|
||||
const GeomVertexArrayDataHandle *data = NULL;
|
||||
int number_of_arrays = _data_reader -> get_num_arrays ( );
|
||||
|
||||
if (_current_shader_context && number_of_arrays > 1) {
|
||||
|
|
@ -1444,15 +1444,13 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
|
|||
if (number_of_columns >= vertex_element_array -> total_elements)
|
||||
{
|
||||
|
||||
// check not implemented yet
|
||||
dxgsg9_cat.error ( ) << "vertex_element_type_array check not implemented yet\n";
|
||||
|
||||
// build a vertex_element_type_array from data
|
||||
|
||||
// compare both vertex_element_type_array for a match
|
||||
vertex_element_array -> vertex_element_type_array;
|
||||
|
||||
|
||||
// check not implemented yet
|
||||
dxgsg9_cat.error ( ) << "vertex_element_type_array check not implemented yet\n";
|
||||
|
||||
// build a vertex_element_type_array from data
|
||||
|
||||
// compare both vertex_element_type_array for a match
|
||||
vertex_element_array -> vertex_element_type_array;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1490,7 +1488,10 @@ vertex_element_array -> vertex_element_type_array;
|
|||
data = _data_reader->get_array_reader(0);
|
||||
}
|
||||
|
||||
VertexBufferContext *vbc = ((GeomVertexArrayData *)(data->get_object()))->prepare_now(get_prepared_objects(), this);
|
||||
nassertr(data != (GeomVertexArrayDataHandle *)NULL, false);
|
||||
GeomVertexArrayData *data_obj = (GeomVertexArrayData *)data->get_object();
|
||||
nassertr(data_obj != (GeomVertexArrayData *)NULL, false);
|
||||
VertexBufferContext *vbc = data_obj->prepare_now(get_prepared_objects(), this);
|
||||
nassertr(vbc != (VertexBufferContext *)NULL, false);
|
||||
if (!apply_vertex_buffer(vbc, _current_shader_context, data, force, name)) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -352,7 +352,7 @@ create_texture(DXScreenData &scrn) {
|
|||
target_pixel_format = D3DFMT_##FMT; \
|
||||
goto found_matching_format; }
|
||||
|
||||
if (texture_stored_compressed){
|
||||
if (texture_stored_compressed && compress_texture) {
|
||||
// if the texture is already compressed, we need to choose the
|
||||
// corresponding format, otherwise we might end up
|
||||
// cross-compressing from e.g. DXT5 to DXT3
|
||||
|
|
@ -373,9 +373,8 @@ create_texture(DXScreenData &scrn) {
|
|||
CHECK_FOR_FMT(DXT5);
|
||||
break;
|
||||
}
|
||||
// if we can't support the texture's compressed image, we can't
|
||||
// load the texture.
|
||||
goto error_exit;
|
||||
|
||||
// We don't support the compressed format. Fall through.
|
||||
}
|
||||
|
||||
if (compress_texture) {
|
||||
|
|
@ -1662,7 +1661,12 @@ fill_d3d_texture_pixels(DXScreenData &scrn) {
|
|||
image_compression = tex->get_ram_image_compression();
|
||||
}
|
||||
|
||||
if (!scrn._dxgsg9->get_supports_compressed_texture_format(image_compression)) {
|
||||
if (!scrn._dxgsg9->get_supports_compressed_texture_format(image_compression) ||
|
||||
tex->get_x_size() < 4 || tex->get_y_size() < 4) {
|
||||
// If we don't support this particular compression method, or in
|
||||
// any case if the texture is too small (DirectX won't accept a
|
||||
// small compressed texture), then fetch and load the uncompressed
|
||||
// version instead.
|
||||
image = tex->get_uncompressed_ram_image();
|
||||
image_compression = Texture::CM_off;
|
||||
}
|
||||
|
|
@ -1718,7 +1722,7 @@ fill_d3d_texture_pixels(DXScreenData &scrn) {
|
|||
D3DFORMAT source_format = _d3d_format;
|
||||
|
||||
// check for compressed textures and adjust source_format accordingly
|
||||
switch (tex->get_ram_image_compression()) {
|
||||
switch (image_compression) {
|
||||
case Texture::CM_dxt1:
|
||||
source_format = D3DFMT_DXT1;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -386,6 +386,10 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg) {
|
|||
GLP(Enable)(target);
|
||||
|
||||
gsg->apply_texture(tc);
|
||||
if (!gsg->update_texture(tc, false)) {
|
||||
GLP(Disable)(target);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
cg_report_errors();
|
||||
if (glGetError() != GL_NO_ERROR) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue