This commit is contained in:
David Rose 2006-01-26 01:50:26 +00:00
parent b99be8da93
commit 8e7e0f5332

View File

@ -189,13 +189,13 @@ apply_texture(int i, TextureContext *tc) {
// error or oversight. // error or oversight.
if ((dirty & Texture::DF_image) == 0) { if ((dirty & Texture::DF_image) == 0) {
dxgsg8_cat.warning() dxgsg8_cat.warning()
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n"; << "Texture " << *dtc->_texture << " has changed mipmap state.\n";
} }
if (!dtc->create_texture(*_screen)) { if (!dtc->create_texture(*_screen)) {
// Oops, we can't re-create the texture for some reason. // Oops, we can't re-create the texture for some reason.
dxgsg8_cat.error() dxgsg8_cat.error()
<< "Unable to re-create texture " << *dtc->_texture << endl; << "Unable to re-create texture " << *dtc->_texture << endl;
_d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE); _d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
return; return;
} }
@ -212,7 +212,7 @@ apply_texture(int i, TextureContext *tc) {
_d3d_device->SetTextureStageState(i, D3DTSS_ADDRESSW, get_texture_wrap_mode(wrap_w)); _d3d_device->SetTextureStageState(i, D3DTSS_ADDRESSW, get_texture_wrap_mode(wrap_w));
_d3d_device->SetTextureStageState(i, D3DTSS_BORDERCOLOR, _d3d_device->SetTextureStageState(i, D3DTSS_BORDERCOLOR,
Colorf_to_D3DCOLOR(tex->get_border_color())); Colorf_to_D3DCOLOR(tex->get_border_color()));
uint aniso_degree = tex->get_anisotropic_degree(); uint aniso_degree = tex->get_anisotropic_degree();
Texture::FilterType ft = tex->get_magfilter(); Texture::FilterType ft = tex->get_magfilter();
@ -930,10 +930,10 @@ draw_triangles(const GeomTriangles *primitive) {
// Nonindexed, client arrays. // Nonindexed, client arrays.
draw_primitive_up(D3DPT_TRIANGLELIST, primitive->get_num_primitives(), draw_primitive_up(D3DPT_TRIANGLELIST, primitive->get_num_primitives(),
primitive->get_first_vertex(), primitive->get_first_vertex(),
primitive->get_num_vertices(), primitive->get_num_vertices(),
_vertex_data->get_array(0)->get_data(), _vertex_data->get_array(0)->get_data(),
_vertex_data->get_format()->get_array(0)->get_stride()); _vertex_data->get_format()->get_array(0)->get_stride());
} }
} }
} }
@ -968,7 +968,7 @@ draw_tristrips(const GeomTristrips *primitive) {
} else { } else {
// Indexed, client arrays, one long triangle strip. // Indexed, client arrays, one long triangle strip.
D3DFORMAT index_type = get_index_type(primitive->get_index_type()); D3DFORMAT index_type = get_index_type(primitive->get_index_type());
draw_indexed_primitive_up draw_indexed_primitive_up
(D3DPT_TRIANGLESTRIP, (D3DPT_TRIANGLESTRIP,
min_vertex, max_vertex, min_vertex, max_vertex,
primitive->get_num_vertices() - 2, primitive->get_num_vertices() - 2,
@ -986,12 +986,12 @@ draw_tristrips(const GeomTristrips *primitive) {
} else { } else {
// Indexed, client arrays, one long triangle strip. // Indexed, client arrays, one long triangle strip.
draw_primitive_up(D3DPT_TRIANGLESTRIP, draw_primitive_up(D3DPT_TRIANGLESTRIP,
primitive->get_num_vertices() - 2, primitive->get_num_vertices() - 2,
primitive->get_first_vertex(), primitive->get_first_vertex(),
primitive->get_num_vertices(), primitive->get_num_vertices(),
_vertex_data->get_array(0)->get_data(), _vertex_data->get_array(0)->get_data(),
_vertex_data->get_format()->get_array(0)->get_stride()); _vertex_data->get_format()->get_array(0)->get_stride());
} }
} }
@ -1042,7 +1042,7 @@ draw_tristrips(const GeomTristrips *primitive) {
_vertices_tristrip_pcollector.add_level(ends[i] - start); _vertices_tristrip_pcollector.add_level(ends[i] - start);
unsigned int min = mins.get_data1i(); unsigned int min = mins.get_data1i();
unsigned int max = maxs.get_data1i(); unsigned int max = maxs.get_data1i();
draw_indexed_primitive_up draw_indexed_primitive_up
(D3DPT_TRIANGLESTRIP, (D3DPT_TRIANGLESTRIP,
min, max, min, max,
ends[i] - start - 2, ends[i] - start - 2,
@ -1075,10 +1075,10 @@ draw_tristrips(const GeomTristrips *primitive) {
unsigned int start = 0; unsigned int start = 0;
for (size_t i = 0; i < ends.size(); i++) { for (size_t i = 0; i < ends.size(); i++) {
_vertices_tristrip_pcollector.add_level(ends[i] - start); _vertices_tristrip_pcollector.add_level(ends[i] - start);
draw_primitive_up(D3DPT_TRIANGLESTRIP, ends[i] - start - 2, draw_primitive_up(D3DPT_TRIANGLESTRIP, ends[i] - start - 2,
first_vertex + start, first_vertex + start,
ends[i] - start, ends[i] - start,
array_data, stride); array_data, stride);
start = ends[i] + 2; start = ends[i] + 2;
} }
@ -1141,7 +1141,7 @@ draw_trifans(const GeomTrifans *primitive) {
_vertices_trifan_pcollector.add_level(ends[i] - start); _vertices_trifan_pcollector.add_level(ends[i] - start);
unsigned int min = mins.get_data1i(); unsigned int min = mins.get_data1i();
unsigned int max = maxs.get_data1i(); unsigned int max = maxs.get_data1i();
draw_indexed_primitive_up draw_indexed_primitive_up
(D3DPT_TRIANGLEFAN, (D3DPT_TRIANGLEFAN,
min, max, min, max,
ends[i] - start - 2, ends[i] - start - 2,
@ -1174,11 +1174,11 @@ draw_trifans(const GeomTrifans *primitive) {
unsigned int start = 0; unsigned int start = 0;
for (size_t i = 0; i < ends.size(); i++) { for (size_t i = 0; i < ends.size(); i++) {
_vertices_trifan_pcollector.add_level(ends[i] - start); _vertices_trifan_pcollector.add_level(ends[i] - start);
draw_primitive_up(D3DPT_TRIANGLEFAN, draw_primitive_up(D3DPT_TRIANGLEFAN,
ends[i] - start - 2, ends[i] - start - 2,
first_vertex, first_vertex,
ends[i] - start, ends[i] - start,
array_data, stride); array_data, stride);
start = ends[i]; start = ends[i];
} }
} }
@ -1234,10 +1234,10 @@ draw_lines(const GeomLines *primitive) {
} else { } else {
// Nonindexed, client arrays. // Nonindexed, client arrays.
draw_primitive_up(D3DPT_LINELIST, primitive->get_num_primitives(), draw_primitive_up(D3DPT_LINELIST, primitive->get_num_primitives(),
primitive->get_first_vertex(), primitive->get_first_vertex(),
primitive->get_num_vertices(), primitive->get_num_vertices(),
_vertex_data->get_array(0)->get_data(), _vertex_data->get_array(0)->get_data(),
_vertex_data->get_format()->get_array(0)->get_stride()); _vertex_data->get_format()->get_array(0)->get_stride());
} }
} }
} }
@ -1275,10 +1275,10 @@ draw_points(const GeomPoints *primitive) {
} else { } else {
// Nonindexed, client arrays. // Nonindexed, client arrays.
draw_primitive_up(D3DPT_POINTLIST, primitive->get_num_primitives(), draw_primitive_up(D3DPT_POINTLIST, primitive->get_num_primitives(),
primitive->get_first_vertex(), primitive->get_first_vertex(),
primitive->get_num_vertices(), primitive->get_num_vertices(),
_vertex_data->get_array(0)->get_data(), _vertex_data->get_array(0)->get_data(),
_vertex_data->get_format()->get_array(0)->get_stride()); _vertex_data->get_format()->get_array(0)->get_stride());
} }
} }
@ -1496,11 +1496,11 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend
// need to copy it to a temporary surface of the appropriate type // need to copy it to a temporary surface of the appropriate type
// first. // first.
hr = _d3d_device->CreateImageSurface(w, h, _screen->_display_mode.Format, hr = _d3d_device->CreateImageSurface(w, h, _screen->_display_mode.Format,
&temp_surface); &temp_surface);
if (FAILED(hr)) { if (FAILED(hr)) {
dxgsg8_cat.error() dxgsg8_cat.error()
<< "CreateImageSurface failed in copy_pixel_buffer()" << "CreateImageSurface failed in copy_pixel_buffer()"
<< D3DERRORSTRING(hr); << D3DERRORSTRING(hr);
backbuffer->Release(); backbuffer->Release();
return false; return false;
} }
@ -1542,8 +1542,8 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend
hr = _d3d_device->CreateImageSurface(w, h, D3DFMT_A8R8G8B8, &temp_surface); hr = _d3d_device->CreateImageSurface(w, h, D3DFMT_A8R8G8B8, &temp_surface);
if (FAILED(hr)) { if (FAILED(hr)) {
dxgsg8_cat.error() dxgsg8_cat.error()
<< "CreateImageSurface failed in copy_pixel_buffer()" << "CreateImageSurface failed in copy_pixel_buffer()"
<< D3DERRORSTRING(hr); << D3DERRORSTRING(hr);
return false; return false;
} }
@ -1551,7 +1551,7 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend
if (hr == D3DERR_DEVICELOST) { if (hr == D3DERR_DEVICELOST) {
dxgsg8_cat.error() dxgsg8_cat.error()
<< "copy_pixel_buffer failed: device lost\n"; << "copy_pixel_buffer failed: device lost\n";
temp_surface->Release(); temp_surface->Release();
return false; return false;
} }
@ -1568,7 +1568,7 @@ framebuffer_copy_to_ram(Texture *tex, int z, const DisplayRegion *dr, const Rend
} }
DXTextureContext8::d3d_surface_to_texture(rect, temp_surface, DXTextureContext8::d3d_surface_to_texture(rect, temp_surface,
copy_inverted, tex, z); copy_inverted, tex, z);
RELEASE(temp_surface, dxgsg8, "temp_surface", RELEASE_ONCE); RELEASE(temp_surface, dxgsg8, "temp_surface", RELEASE_ONCE);
@ -1658,19 +1658,19 @@ reset() {
hr = _d3d_device->GetCreationParameters (&creation_parameters); hr = _d3d_device->GetCreationParameters (&creation_parameters);
// default render to texture format // default render to texture format
// _screen->_render_to_texture_d3d_format = D3DFMT_X8R8G8B8; // _screen->_render_to_texture_d3d_format = D3DFMT_X8R8G8B8;
// match the display mode format for render to texture // match the display mode format for render to texture
_screen->_render_to_texture_d3d_format = _screen->_display_mode.Format; _screen->_render_to_texture_d3d_format = _screen->_display_mode.Format;
if (SUCCEEDED (hr)) { if (SUCCEEDED (hr)) {
hr = _screen->_d3d8->CheckDeviceFormat ( hr = _screen->_d3d8->CheckDeviceFormat (
creation_parameters.AdapterOrdinal, creation_parameters.AdapterOrdinal,
creation_parameters.DeviceType, creation_parameters.DeviceType,
_screen->_display_mode.Format, _screen->_display_mode.Format,
D3DUSAGE_RENDERTARGET, D3DUSAGE_RENDERTARGET,
D3DRTYPE_TEXTURE, D3DRTYPE_TEXTURE,
_screen->_render_to_texture_d3d_format); _screen->_render_to_texture_d3d_format);
if (SUCCEEDED (hr)) { if (SUCCEEDED (hr)) {
_supports_render_texture = true; _supports_render_texture = true;
} }
@ -1724,7 +1724,7 @@ reset() {
// look for all possible DX8 texture fmts // look for all possible DX8 texture fmts
D3DFORMAT_FLAG fmtflag = D3DFORMAT_FLAG(1 << i); D3DFORMAT_FLAG fmtflag = D3DFORMAT_FLAG(1 << i);
hr = _screen->_d3d8->CheckDeviceFormat(_screen->_card_id, D3DDEVTYPE_HAL, _screen->_display_mode.Format, hr = _screen->_d3d8->CheckDeviceFormat(_screen->_card_id, D3DDEVTYPE_HAL, _screen->_display_mode.Format,
0x0, D3DRTYPE_TEXTURE, g_D3DFORMATmap[fmtflag]); 0x0, D3DRTYPE_TEXTURE, g_D3DFORMATmap[fmtflag]);
if (SUCCEEDED(hr)){ if (SUCCEEDED(hr)){
_screen->_supported_tex_formats_mask |= fmtflag; _screen->_supported_tex_formats_mask |= fmtflag;
} }
@ -1770,7 +1770,7 @@ reset() {
// turn on dithering if the rendertarget is < 8bits/color channel // turn on dithering if the rendertarget is < 8bits/color channel
bool dither_enabled = ((!dx_no_dithering) && IS_16BPP_DISPLAY_FORMAT(_screen->_presentation_params.BackBufferFormat) bool dither_enabled = ((!dx_no_dithering) && IS_16BPP_DISPLAY_FORMAT(_screen->_presentation_params.BackBufferFormat)
&& (_screen->_d3dcaps.RasterCaps & D3DPRASTERCAPS_DITHER)); && (_screen->_d3dcaps.RasterCaps & D3DPRASTERCAPS_DITHER));
_d3d_device->SetRenderState(D3DRS_DITHERENABLE, dither_enabled); _d3d_device->SetRenderState(D3DRS_DITHERENABLE, dither_enabled);
_d3d_device->SetRenderState(D3DRS_CLIPPING, true); _d3d_device->SetRenderState(D3DRS_CLIPPING, true);
@ -1832,9 +1832,9 @@ apply_fog(Fog *fog) {
fog->get_linear_range(onset, opaque); fog->get_linear_range(onset, opaque);
_d3d_device->SetRenderState(D3DRS_FOGSTART, _d3d_device->SetRenderState(D3DRS_FOGSTART,
*((LPDWORD) (&onset))); *((LPDWORD) (&onset)));
_d3d_device->SetRenderState(D3DRS_FOGEND, _d3d_device->SetRenderState(D3DRS_FOGEND,
*((LPDWORD) (&opaque))); *((LPDWORD) (&opaque)));
} }
break; break;
case Fog::M_exponential: case Fog::M_exponential:
@ -1843,7 +1843,7 @@ apply_fog(Fog *fog) {
// Exponential fog is always camera-relative. // Exponential fog is always camera-relative.
float fog_density = fog->get_exp_density(); float fog_density = fog->get_exp_density();
_d3d_device->SetRenderState(D3DRS_FOGDENSITY, _d3d_device->SetRenderState(D3DRS_FOGDENSITY,
*((LPDWORD) (&fog_density))); *((LPDWORD) (&fog_density)));
} }
break; break;
} }
@ -2518,7 +2518,7 @@ do_issue_texture() {
apply_texture(i, tc); apply_texture(i, tc);
set_texture_blend_mode(i, stage); set_texture_blend_mode(i, stage);
int texcoord_dimensions = 0; int texcoord_dimensions = 2;
CPT(TransformState) tex_mat = TransformState::make_identity(); CPT(TransformState) tex_mat = TransformState::make_identity();
if (_state._tex_matrix->has_stage(stage)) { if (_state._tex_matrix->has_stage(stage)) {
@ -2623,7 +2623,7 @@ do_issue_texture() {
_d3d_device->SetRenderState(D3DRS_POINTSPRITEENABLE, any_point_sprite); _d3d_device->SetRenderState(D3DRS_POINTSPRITEENABLE, any_point_sprite);
if (!tex_mat->is_identity()) { if (!tex_mat->is_identity()) {
if (tex_mat->is_2d() && texcoord_dimensions <= 2) { if (/*tex_mat->is_2d() &&*/ texcoord_dimensions <= 2) {
// For 2-d texture coordinates, we have to reorder the matrix. // For 2-d texture coordinates, we have to reorder the matrix.
LMatrix4f m = tex_mat->get_mat(); LMatrix4f m = tex_mat->get_mat();
m.set(m(0, 0), m(0, 1), m(0, 3), 0.0f, m.set(m(0, 0), m(0, 1), m(0, 3), 0.0f,
@ -2636,12 +2636,12 @@ do_issue_texture() {
} else { } else {
LMatrix4f m = tex_mat->get_mat(); LMatrix4f m = tex_mat->get_mat();
_d3d_device->SetTransform(get_tex_mat_sym(i), (D3DMATRIX *)m.get_data()); _d3d_device->SetTransform(get_tex_mat_sym(i), (D3DMATRIX *)m.get_data());
DWORD transform_flags = texcoord_dimensions; DWORD transform_flags = texcoord_dimensions;
if (m.get_col(3) != LVecBase4f(0.0f, 0.0f, 0.0f, 1.0f)) { if (m.get_col(3) != LVecBase4f(0.0f, 0.0f, 0.0f, 1.0f)) {
// If we have a projected texture matrix, we also need to // If we have a projected texture matrix, we also need to
// set D3DTTFF_COUNT4. // set D3DTTFF_COUNT4.
transform_flags = D3DTTFF_COUNT4 | D3DTTFF_PROJECTED; transform_flags = D3DTTFF_COUNT4 | D3DTTFF_PROJECTED;
} }
_d3d_device->SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, _d3d_device->SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS,
transform_flags); transform_flags);
} }
@ -2776,12 +2776,12 @@ do_issue_blending() {
if (_target._color_write->get_channels() == ColorWriteAttrib::C_off) { if (_target._color_write->get_channels() == ColorWriteAttrib::C_off) {
if (_target._color_write != _state._color_write) { if (_target._color_write != _state._color_write) {
if (_screen->_can_direct_disable_color_writes) { if (_screen->_can_direct_disable_color_writes) {
_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); _d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
_d3d_device->SetRenderState(D3DRS_COLORWRITEENABLE, (DWORD)0x0); _d3d_device->SetRenderState(D3DRS_COLORWRITEENABLE, (DWORD)0x0);
} else { } else {
_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); _d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
_d3d_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); _d3d_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
_d3d_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); _d3d_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
} }
} }
return; return;
@ -2824,9 +2824,9 @@ do_issue_blending() {
} }
_d3d_device->SetRenderState(D3DRS_SRCBLEND, _d3d_device->SetRenderState(D3DRS_SRCBLEND,
get_blend_func(color_blend->get_operand_a())); get_blend_func(color_blend->get_operand_a()));
_d3d_device->SetRenderState(D3DRS_DESTBLEND, _d3d_device->SetRenderState(D3DRS_DESTBLEND,
get_blend_func(color_blend->get_operand_b())); get_blend_func(color_blend->get_operand_b()));
return; return;
} }
@ -3751,10 +3751,10 @@ get_texture_argument_modifier(TextureStage::CombineOperand operand) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void DXGraphicsStateGuardian8:: void DXGraphicsStateGuardian8::
draw_primitive_up(D3DPRIMITIVETYPE primitive_type, draw_primitive_up(D3DPRIMITIVETYPE primitive_type,
unsigned int primitive_count, unsigned int primitive_count,
unsigned int first_vertex, unsigned int first_vertex,
unsigned int num_vertices, unsigned int num_vertices,
const unsigned char *buffer, size_t stride) { const unsigned char *buffer, size_t stride) {
// It appears that the common ATI driver seems to fail to draw // It appears that the common ATI driver seems to fail to draw
// anything in the DrawPrimitiveUP() call if the address range of // anything in the DrawPrimitiveUP() call if the address range of
@ -3769,12 +3769,12 @@ draw_primitive_up(D3DPRIMITIVETYPE primitive_type,
// Actually, the buffer doesn't fit within the required limit // Actually, the buffer doesn't fit within the required limit
// anyway. Go ahead and draw it and hope for the best. // anyway. Go ahead and draw it and hope for the best.
_d3d_device->DrawPrimitiveUP(primitive_type, primitive_count, _d3d_device->DrawPrimitiveUP(primitive_type, primitive_count,
buffer_start, stride); buffer_start, stride);
} else if ((((long)buffer_end ^ (long)buffer_start) & ~0xffff) == 0) { } else if ((((long)buffer_end ^ (long)buffer_start) & ~0xffff) == 0) {
// No problem; we can draw the buffer directly. // No problem; we can draw the buffer directly.
_d3d_device->DrawPrimitiveUP(primitive_type, primitive_count, _d3d_device->DrawPrimitiveUP(primitive_type, primitive_count,
buffer_start, stride); buffer_start, stride);
} else { } else {
// We have a problem--the buffer crosses over a 0x10000 boundary. // We have a problem--the buffer crosses over a 0x10000 boundary.
@ -3783,7 +3783,7 @@ draw_primitive_up(D3DPRIMITIVETYPE primitive_type,
unsigned char *safe_buffer_start = get_safe_buffer_start(); unsigned char *safe_buffer_start = get_safe_buffer_start();
memcpy(safe_buffer_start, buffer_start, buffer_end - buffer_start); memcpy(safe_buffer_start, buffer_start, buffer_end - buffer_start);
_d3d_device->DrawPrimitiveUP(primitive_type, primitive_count, _d3d_device->DrawPrimitiveUP(primitive_type, primitive_count,
safe_buffer_start, stride); safe_buffer_start, stride);
} }
} }
@ -3801,19 +3801,16 @@ draw_primitive_up(D3DPRIMITIVETYPE primitive_type,
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void DXGraphicsStateGuardian8:: void DXGraphicsStateGuardian8::
draw_indexed_primitive_up(D3DPRIMITIVETYPE primitive_type, draw_indexed_primitive_up(D3DPRIMITIVETYPE primitive_type,
unsigned int min_index, unsigned int max_index, unsigned int min_index, unsigned int max_index,
unsigned int num_primitives, unsigned int num_primitives,
const unsigned char *index_data, const unsigned char *index_data,
D3DFORMAT index_type, D3DFORMAT index_type,
const unsigned char *buffer, size_t stride) { const unsigned char *buffer, size_t stride) {
// As above, we'll hack the case of the buffer crossing the 0x10000 // As above, we'll hack the case of the buffer crossing the 0x10000
// boundary. // boundary.
const unsigned char *buffer_start = buffer + stride * min_index; const unsigned char *buffer_start = buffer + stride * min_index;
const unsigned char *buffer_end = buffer + stride * (max_index + 1); const unsigned char *buffer_end = buffer + stride * (max_index + 1);
bool is_mickey = (_vertex_data->get_name() == "mickey");
is_mickey = false;
if (buffer_end - buffer > 0x10000) { if (buffer_end - buffer > 0x10000) {
// Actually, the buffer doesn't fit within the required limit // Actually, the buffer doesn't fit within the required limit
// anyway. Go ahead and draw it and hope for the best. // anyway. Go ahead and draw it and hope for the best.