Загрузка из IMediaSample типа AM_MEDIA_TYPE в IDirect3DSurface9

Как загрузить изображение из IMediaSample типа AM_MEDIA_TYPE в IDirect3DSurface9 наиболее быстро (использую минимум процессорного времени)?(AM_MEDIA_TYPE::pbFormat == VIDEOINFOHEADER *)Я использую загрузку через HBITMAP.Но работает медленно на моём процессоре: на фильме 1440 на 480 загружает на 60 процентов два процессора.Я использовал профайлер и выяснил, что всё процессорное время выполняется инструкция записи в промежуточный буфер значения цвета точки для HBITMAP в цикле по точкам:

строка local_bit_map_buffer[local_bit_map_counter] = RGB_BYTE_ORDER(prgb[local_counter].rgbtRed,prgb[local_counter].rgbtGreen,prgb[local_counter].rgbtBlue);

DWORD *local_bit_map_buffer = NULL;

local_bit_map_buffer = new DWORD[cxImage*cyImage];

for(int local_counter_width=0;local_counter_width<cxImage;local_counter_width++) { for(int local_counter_height=0;local_counter_height<cyImage;local_counter_height++) { int local_counter = local_counter_width+local_counter_height*cxImage; int local_bit_map_counter = local_counter_width+(cyImage-(local_counter_height+1))*cxImage; local_bit_map_buffer[local_bit_map_counter] = RGB_BYTE_ORDER(prgb[local_counter].rgbtRed,prgb[local_counter].rgbtGreen,prgb[local_counter].rgbtBlue); }

}

HBITMAP handle_bit_map = NULL; handle_bit_map = CreateBitmap( cxImage, cyImage, 1, 32, local_bit_map_buffer); delete []local_bit_map_buffer;

Мой процессор может получить приемлемый результат (24 кадра в секунду) (отображаются все кадры фильма (кадры не пропускаются)) при разрешении фильма 900 на 300(при загрузке процессора 45 процентов).При размере видео 1440 на 480 больше половины кадров пропускается (10 кадров в секунду).В аналогичной австрийской программе загрузка процесора 20 - 30 процентов на тестовом видео 1440 на 480.Как можно оптимизировать загрузку в IDirect3DSurface9 (нужен новый алгоритм загрузки?)?

Как улучшить быстродействие инструкции "запись в память"?

Последняя правка: пн, 29/08/2011 - 22:06
Submitted by Kozlov_Sergey on

Комментарии

Задача - стандартная. Для её решения используется набор SIMD инструкций SSE и многопоточная обработка. Для вашего случая рекомендую использовать компилятор от компании Intel. Он сделает за Вас сложную работу по оптимизации кода и "перепишет" его. Вы можите воспользоваться триальной версией компилятора на сайте компании.

Submitted by Necro on
Использовал компилятор Intel.

Профайлер показывает, что мой модуль выполняется приемлемое процессорное время. Но сам драйвер процессора Intel выполняется слишком большое время и ядро Windows (модули intelppm.sys и ntkrnlpa.exe ) во время просмотра фильма. Всё равно вместо 24 имеем 10 кадров в секунду. Компилятор Intel дал улучшение быстродействия на 0.08 кадра в секунду, что может быть отнесено на счёт случайной загрузки процессора во время тестирования.

По компилятору интел. Его надо настраивать. Я не имею права давать тут скриншот настройки компилятора, но скажу где копать. Смотрите закладки Optimization. Следующее для компилятора Intel написало библиотеку IPP - примитивов ускоряющих выполнение ряда работ на процессорах и написанную очень профессионально. Если у вас профессиональная версия компилятора то она должна быть в комплекте. Я вам рекомендую внимательно изучить примеры которые там есть касательно работы с видео.

Все оптимизации которые компилятор проведет с вашим кодом - он прологирует (это как минимум использование SSE инструкций). Компилятор от Microsoft не имеет возможности работать с SIMD инструкциями выше SSE 2 (нету h файлов соответствующих). Дальше и структуры данных для операций SIMD отличаются. Поэтому тут смотрите внимательно.

Submitted by Necro on
Вот часть функции после моей оптимизации: Address Line Source Code Bytes Timer samples 0xd1d7f3b 664 DWORD *local_bit_map_buffer = NULL; 0 0xd1d7f42 665 local_bit_map_buffer = new DWORD[cxImage*cyImage]; 0 666 0 0xd1d7f64 667 DWORD local_calculated_value = 0; 0.11 668 int local_counter = 0; 0 0xd1d7f82 669 int local_bit_map_counter = cyImage*cxImage - cxImage; 3.77 670 int local_counter_width=0; 0 0xd1d7f9c 671 int local_counter_height=0; 3.06 0xd1d7fab 672 4.53 0xd1d7fc2 673 for(;local_counter_width<cxImage;local_counter_width++,local_counter++,local_bit_map_counter++) 75.92 0xd1d8001 674 { 12.48 0xd1d8003 675 local_counter_height=0; 0 676 for(;local_counter_height<cyImage;local_counter_height++) 0 0xd1d8008 677 { 0 678 local_calculated_value = RGB_BYTE_ORDER(prgb[local_counter].rgbtRed,prgb[local_counter].rgbtGreen,prgb[local_counter].rgbtBlue); 0 679 local_bit_map_buffer[local_bit_map_counter] = local_calculated_value; 0 680 local_counter += cxImage; 0 681 local_bit_map_counter -= cxImage; 0 682 } 0 683 } 0 0xd1d800f 684 0 685 HBITMAP handle_bit_map = NULL; 0 0xd1d8028 686 0 687 handle_bit_map = CreateBitmap( 0 0xd1d8040 688 cxImage, 0 689 cyImage, 0 0xd1d8046 690 1, 0 691 32, 0 692 local_bit_map_buffer); 0 693 0

694 delete []local_bit_map_buffer; 0

1 file, 1 function, 31 lines, 0 instructions, Summary: 3658 samples, 100.00% of shown samples, 9.16% of total samples

75.92 процентов в заголовке цикла, потому что переменные цикла используются далее в коде. При паралельном выполнении ожидается вычисление значений этих переменных.

И количество процессорного времени по функциям программы с использованием инструкций SSE4, оптимизации под процессор Intel (последний доступный компилятору Intel)Process Name 64-bit Timer samples ntkrnlpa.exe 35.9 StereoRendererLR.ax 19.83 MP4SDECD.DLL 9.51 MainFilter.ax 9.17 win32k.sys 6.49 nvlddmkm.sys 3.59 halmacpi.dll 3.09 ntdll.dll 1.79 dsound.dll 1.58 msvcrt.dll 1.4

В программе вся нагрузка на ядро Windows.Мой модуль показывает сравнимое с австрийской программой время загрузки процессора: StereoRendererLR.ax 19.83.

Как уменьшить показатель в строке "ntkrnlpa.exe 35.9" (загрузка ядра Windows)?

Во всей системеModule Name 64-bit Timer samples intelppm.sys 32.09 ntkrnlpa.exe 24.86 StereoRendererLR.ax 11.05 MP4SDECD.DLL 7.3 MainFilter.ax 5.25 win32k.sys 3.91 nvlddmkm.sys 3.25

halmacpi.dll 2.37

8 modules, Total: 90233 samples, 90.08% of shown samples

Как уменьшить показатель в строке "intelppm.sys 32.09" (загрузка драйвера Intel процессора)?

А разве нельзя работать с IDirect3DSurface9 без HBITMAP? Напрямую писать в память текстуры на видео-карточке.

Кстати, посмотри как эта задача реализована в опенсорсных плеерах, я думаю ее уже решали и не раз - может вообще окажется что вместо IDirect3DSurface9 лучше использовать что-то другое.

Submitted by Victor on
А разве нельзя работать с IDirect3DSurface9 без HBITMAP? Напрямую писать в память текстуры на видео-карточке.

Кстати, посмотри как эта задача реализована в опенсорсных плеерах, я думаю ее уже решали и не раз - может вообще окажется что вместо IDirect3DSurface9 лучше использовать что-то другое.
Напрямую писать в память текстуры на ПЦ не получится. Lock/unlock будет копировать с/на GPU, но всё равно быстрее будет чем через HBITMAP попиксельно копировать. Плеер обычно получает от декодера YUV массив байтиков, пишет его в текстуру и там уже на GPU пиксел-шейдером конвертит в RGB и всякие другие манипуляции делает.
Submitted by BLK Dragon on
Приведите пожалуйста лог оптимизаций компилятора Intel для Вашего метода.
А особенно для Вашего цикла - который и надо сооптимизировать.
А вы пробывали оптимизацию с помощью макросов OpenMP для циклов?
Смотрели ли Вы примеры IPP?Приведите финальный код метода (уберите там постоянное создание локальных переменных в цикле.)
  1. define RGB_BYTE_ORDER(r, g ,b) ((DWORD) (((BYTE) (b) | ((WORD) (g) << 8)) | (((DWORD) (BYTE) (r)) << 16)))
Подставьте напрямую в код.
  1. define может мешать оптимизации (в данном случае макрофункция)
Submitted by Necro on
Где находится журнал оптимизации компилятора Intel?Я вынес объявления всех переменных из цикла и ещё кое-что оптимизировал. Но, как видно из моего предыдущего сообщения, цикл намного лучше не стал: все задержки из-за вычисления переменной перед использованием (и это не зависит от алгоритма). Я пробовал разные варианты. Во всех на одной из строчек цикла (в каждом варианте разной) 75 процентов времени. Паралельные вычисления возможны (цикл распараллеливается на любое число потоков). Но что это даст (у меня всё равно 2 ядра процессора, и я думаю что он итак выполняется параллельно)? Быстродействие от способа (HBITMAP или что-то ещё), думаю не зависит: всё равно будут ожидания во время вычисления переменных в цикле по исходному буферу IMeadiaSample.Думаю, что в моей функции уже ничего не улучшить.Самая большая нагрузка на ядро Windows и драйвер Intel процессора.Можно ли настроить компилятор Intel для улучшения быстродействия драйвера Intel процессора для моей программы?Можно ли настроить компилятор Intel для улучшения быстродействия ядра Windows для моей программы?Что делает драйвера Intel процессора? Почему он так загружен?

Что делает ядро Windows? Почему оно так загружено?

Я запустил тестовый фильм в своей программе и в плеере NVidia (сделан австрийской фирмой). Посмотрел график в диспетчере задач. У меня красная линия графика где-то на половину ниже зелёной, а в том плеере почти ноль.

На счет улучшений Вашей функции (метода) Вы не правы. Я говорил, что это не просто. По Вашей функции улучшение может быть около 1.5 - 3 раза * на количество ядер. привыровненных данных и правильной оптимизации.
Плеер от Nvidia может использовать CUDA (вычеления с помощью GPU) и от того не загружать процессор.Лог оптимизации должен быть - смотрите Info панель (вообще это зависит от версии компилятора).

И запостите новый метод.

Submitted by Necro on
Module Name 64-bit Timer samples intelppm.sys 30.64 ntkrnlpa.exe 24.52 StereoRendererLR.ax 9.96 MP4SDECD.DLL 7.39 MainFilter.ax 5.33 win32k.sys 3.98 nvlddmkm.sys 3.03 halmacpi.dll 2.38 unknown module pid (1816) 1.29

msvcr90d.dll 1.11

10 modules, Total: 88657 samples, 89.64% of shown samples

StereoRendererLR.ax 9.96 - приемлемый показатель.intelppm.sys 30.64 ntkrnlpa.exe 24.52 - с этими модулями по прежнему ничего не понятноStereoRendererLR.axCS:EIP Symbol + Offset 64-bit Timer samples CS:EIP Symbol + Offset 64-bit Timer samples 0xcf7949c CTransform::Transform 99.84 0xcf7c2b0 CAutoLock::CAutoLock 0.02 0xcf922a0 CBaseRenderer::Receive 0.02 0xcf93350 CRendererInputPin::Receive 0.02 0xcf93ff0 CBaseVideoRenderer::ShouldDrawSampleNow 0.02 0xcf71248 CD3DApplication::Render3DEnvironment 0.01 0xcf88820 CBasePin::ConnectionMediaType 0.01 0xcf90cf0 CBaseRenderer::WaitForRenderTime 0.01 0xcf91c00 CBaseRenderer::SignalTimerFired 0.01 0xcf91e20 CBaseRenderer::Render 0.01 0xcf93da0 CBaseVideoRenderer::SendQuality 0.01 0xcfa66f0 CBaseList::CNode::CNode 0.01

0xcfa6a10 _alldiv 0.01

13 functions, 59 instructions, Total: 9883 samples, 100.00% of shown samples, 9.92% of total session samples

Process Name 64-bit Timer samples AV VMMorpher.exe 48.84 AV VMMorpher.exe 48.84 - моя программа использует только одно ядро процессораHRESULT CTransform::Transform( IMediaSample *pMediaSample, AM_MEDIA_TYPE* media_type, LPDIRECT3DDEVICE9 direct_3D_device, CVideoText *parameter_VideoText, CMyD3DApplication *parameter_MyD3DApplication){ int i = 0; if ( pMediaSample==NULL || media_type==NULL || direct_3D_device == NULL || parameter_VideoText == NULL ) { return E_POINTER;

}

AM_MEDIA_TYPE* pType = media_type;

VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;

BYTE *pData; // Pointer to the actual image buffer long lDataLen; // Holds length of any given sample

RGBTRIPLE *prgb; // Holds a pointer to the current pixel

if(pMediaSample->GetPointer(&pData)!=S_OK) { return E_FAIL; }

lDataLen = pMediaSample->GetSize();

// Get the image properties from the BITMAPINFOHEADER int iPixelSize = pvi->bmiHeader.biBitCount / 8; int cxImage = pvi->bmiHeader.biWidth; int cyImage = pvi->bmiHeader.biHeight; int cbImage = cyImage * cxImage * iPixelSize;

int numPixels = cxImage * cyImage;

iPixelSize = pvi->bmiHeader.biBitCount / 8; cxImage = pvi->bmiHeader.biWidth; cyImage = pvi->bmiHeader.biHeight; cbImage = cyImage * cxImage * iPixelSize; numPixels = cxImage * cyImage;

prgb = (RGBTRIPLE*) pData;

int pixels_shift = 2*cxImage/100;

REFERENCE_TIME rtStart, rtEnd;

pMediaSample->GetTime(&rtStart, &rtEnd);

  1. define RGB_BYTE_ORDER(r, g ,b) ((DWORD) (((BYTE) (b) | ((WORD) (g) << 8)) | (((DWORD) (BYTE) (r)) << 16)))
HRESULT local_handle_result = S_OK; { CComPtr gImageSrc; { local_handle_result = direct_3D_device->CreateRenderTarget( cxImage, cyImage, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, // Surface is in video memory// D3DFMT_A8B8G8R8, D3DMULTISAMPLE_NONE, // Surface is in video memory 0, TRUE,

&gImageSrc, NULL);

if(local_handle_result!=D3D_OK) { return local_handle_result; } if(gImageSrc==NULL) { return local_handle_result;

}

{ DWORD *local_bit_map_buffer = NULL;

local_bit_map_buffer = new DWORD[cxImage*cyImage];

for(int local_counter_width=0;local_counter_width<cxImage;local_counter_width++) { for(int local_counter_height=0;local_counter_height<cyImage;local_counter_height++) { int local_counter = local_counter_width+local_counter_height*cxImage; int local_bit_map_counter = local_counter_width+(cyImage-(local_counter_height+1))*cxImage; local_bit_map_buffer[local_bit_map_counter] = RGB_BYTE_ORDER(prgb[local_counter].rgbtRed,prgb[local_counter].rgbtGreen,prgb[local_counter].rgbtBlue); }

}

HBITMAP handle_bit_map = NULL; handle_bit_map = CreateBitmap( cxImage, cyImage, 1, 32, local_bit_map_buffer);

delete []local_bit_map_buffer;

if (handle_bit_map==NULL) { return E_FAIL; } HDC hdc;

local_handle_result = gImageSrc->GetDC(&hdc);

if (local_handle_result!=D3D_OK) { return E_FAIL; } HDC hdc_compatible = CreateCompatibleDC(hdc); if (hdc_compatible==NULL) { return E_FAIL; } if(SelectObject(hdc_compatible,handle_bit_map)==NULL) { return E_FAIL;

}

if(!BitBlt(hdc, 0 ,0 ,cxImage , cyImage , hdc_compatible, 0, 0, SRCCOPY)) { return E_FAIL; } if(gImageSrc->ReleaseDC(hdc)!=D3D_OK) { return E_FAIL; } if(!DeleteDC(hdc_compatible)) { return E_FAIL; } BOOL local_result = DeleteObject(handle_bit_map); if(!local_result) { return E_FAIL;

}

}

if(parameter_MyD3DApplication->get_FullScreenMode()==true) {/*//*/

CComPtr local_source_image_temp;

int gImageWidth= cxImage; // Source image width int gImageHeight= cyImage;// Source image height

RECT dstRect= { 0, 0, gImageWidth, gImageHeight};

RECT srcRect_stretch= { 0, 0, cxImage, cyImage}; D3DVIEWPORT9 local_view_port; direct_3D_device->GetViewport(&local_view_port); RECT local_view_port_rect = {local_view_port.X,local_view_port.Y,local_view_port.Width,local_view_port.Height}; SIZE local_view_port_size = {local_view_port.Width,local_view_port.Height}; RECT local_target_rect; local_target_rect.left = 0; local_target_rect.right = cxImage; local_target_rect.top = 0; local_target_rect.bottom = cyImage; RECT local_target_rect_final_window; RECT local_target_rect_final_bufer; RECT local_window_rect; SIZE local_window_size; HWND local_owner_window = parameter_VideoText->GetOwnerWindow(); if(local_owner_window==0) { local_owner_window = parameter_VideoText->m_D3DApp.GetWindow(); }

GetClientRect(local_owner_window,&local_window_rect);

local_window_size.cx = local_window_rect.right - local_window_rect.left; local_window_size.cy = local_window_rect.bottom - local_window_rect.top; double local_multiplication_target = 1.0*local_view_port_size.cx/local_view_port_size.cy; double local_multiplication_video = 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top);

double local_multiplication_window = 1.0*local_window_size.cx/local_window_size.cy;

double ratio_x = 1.0; double ratio_y = 1.0; if (local_multiplication_window<local_multiplication_video) { local_target_rect_final_window.left = 0; local_target_rect_final_window.right = local_window_size.cx; local_target_rect_final_window.top = local_window_size.cy/2 - 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2; local_target_rect_final_window.bottom = local_window_size.cy/2 + 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2; } else { local_target_rect_final_window.left = local_window_size.cx/2 - 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2; local_target_rect_final_window.right = local_window_size.cx/2 + 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2; local_target_rect_final_window.top = 0; local_target_rect_final_window.bottom = local_window_size.cy;

}

if(1.0*(cxImage/2)/cyImage*3/4 < 1.0)// if(1.0*(cxImage/2)/cyImage < 1.0) { ratio_x = 1.0*(cxImage/2)/cyImage*3/4; // Ширина 2 кадров приводится к ширине одного кадра (разрешение экрана 800 на 600 (4 к 3))// ratio_x = 1.0*(cxImage/2)/cyImage; // Ширина 2 кадров приводится к ширине одного кадра ratio_y = 1.0; } else { ratio_x = 1.0; ratio_y = 1.0/(cxImage/2)*cyImage/3*4; // Ширина 2 кадров приводится к ширине одного кадра (разрешение экрана 800 на 600 (4 к 3))// ratio_y = 1.0/(cxImage/2)*cyImage; // Ширина 2 кадров приводится к ширине одного кадра } local_target_rect_final_bufer.left = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.left; local_target_rect_final_bufer.right = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.right; local_target_rect_final_bufer.top = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.top; local_target_rect_final_bufer.bottom = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.bottom; CComPtr local_source_image_final; RECT local_source_rectangle_final; local_source_rectangle_final.left = 0; local_source_rectangle_final.right = local_view_port_size.cx*2*ratio_x; local_source_rectangle_final.top = 0; local_source_rectangle_final.bottom = local_view_port_size.cy*ratio_y; local_handle_result = direct_3D_device->CreateRenderTarget( local_view_port_size.cx*2*ratio_x, local_view_port_size.cy*ratio_y, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, // Surface is in video memory// D3DFMT_A8B8G8R8, D3DMULTISAMPLE_NONE, // Surface is in video memory 0, TRUE, &local_source_image_final, NULL); if(local_handle_result!=D3D_OK) { return local_handle_result; } if(local_source_image_final==NULL) { return local_handle_result; } RECT local_source_rectangle_stretch; local_source_rectangle_stretch.left = local_source_rectangle_final.left; local_source_rectangle_stretch.right = local_source_rectangle_final.right; local_source_rectangle_stretch.top = local_source_rectangle_final.top; local_source_rectangle_stretch.bottom = local_source_rectangle_final.bottom - 1; if((local_handle_result=direct_3D_device->StretchRect(gImageSrc, &srcRect_stretch, local_source_image_final, &local_source_rectangle_stretch, D3DTEXF_LINEAR))!=D3D_OK) { return local_handle_result; } // Stereo Blitdefines
  1. define NVSTEREO_IMAGE_SIGNATURE 0x4433564e //NV3D
typedef struct _Nv_Stereo_Image_Header { unsigned int dwSignature; unsigned int dwWidth; unsigned int dwHeight; unsigned int dwBPP; unsigned int dwFlags; } NVSTEREOIMAGEHEADER, *LPNVSTEREOIMAGEHEADER; // ORedflags in the dwFlagsfielsof the _Nv_Stereo_Image_Headerstructure above
  1. define SIH_SWAP_EYES 0x00000001
  2. define SIH_SCALE_TO_FIT 0x00000002
// Lock the stereo image D3DLOCKED_RECT lr; local_source_image_final->LockRect(&lr,NULL,0); // write stereo signature in the last raw of the stereo image LPNVSTEREOIMAGEHEADER pSIH= (LPNVSTEREOIMAGEHEADER)(((unsigned char *) lr.pBits) + (lr.Pitch* (local_source_rectangle_stretch.bottom - local_source_rectangle_stretch.top))); // Update the signature header values pSIH->dwSignature= NVSTEREO_IMAGE_SIGNATURE; pSIH->dwBPP= 32; pSIH->dwFlags= SIH_SWAP_EYES; // Src image has left on left and right on right pSIH->dwWidth= (local_source_rectangle_stretch.right - local_source_rectangle_stretch.left); pSIH->dwHeight= (local_source_rectangle_stretch.bottom - local_source_rectangle_stretch.top); // Unlock surface

local_source_image_final->UnlockRect();

{ if((local_handle_result=direct_3D_device->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0.0f, 0))!=D3D_OK) { return local_handle_result; } if((local_handle_result=direct_3D_device->BeginScene ())!=D3D_OK) { return local_handle_result; } CComPtr pDestSurface; if((local_handle_result=direct_3D_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pDestSurface))!=D3D_OK) { return local_handle_result; } if(pDestSurface) { if((local_handle_result=direct_3D_device->StretchRect(local_source_image_final, &local_source_rectangle_final, pDestSurface, &local_target_rect_final_bufer, D3DTEXF_LINEAR))!=D3D_OK) { return local_handle_result; } } if((local_handle_result=direct_3D_device->EndScene ())!=D3D_OK) { return local_handle_result; } if((local_handle_result=direct_3D_device->Present (NULL, NULL, NULL, NULL))!=D3D_OK) { return local_handle_result; }

}

return S_OK;/*//*/ } else

{

int gImageWidth= cxImage; // Source image width int gImageHeight= cyImage;// Source image height

RECT dstRect= { 0, 0, gImageWidth, gImageHeight};

RECT srcRect_stretch= { 0, 0, gImageWidth, gImageHeight};

D3DVIEWPORT9 local_view_port; direct_3D_device->GetViewport(&local_view_port); RECT local_view_port_rect = {local_view_port.X,local_view_port.Y,local_view_port.Width,local_view_port.Height};

SIZE local_view_port_size = {local_view_port.Width,local_view_port.Height};

RECT local_target_rect; local_target_rect.left = 0; local_target_rect.right = cxImage; local_target_rect.top = 0; local_target_rect.bottom = cyImage; RECT local_target_rect_final_window;

RECT local_target_rect_final_bufer;

RECT local_window_rect; SIZE local_window_size; HWND local_owner_window = parameter_VideoText->GetOwnerWindow(); if(local_owner_window==0) { local_owner_window = parameter_VideoText->m_D3DApp.GetWindow(); } GetClientRect(local_owner_window,&local_window_rect); local_window_size.cx = local_window_rect.right - local_window_rect.left;

local_window_size.cy = local_window_rect.bottom - local_window_rect.top;

double local_multiplication_target = 1.0*local_view_port_size.cx/local_view_port_size.cy; double local_multiplication_video = 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top); double local_multiplication_window = 1.0*local_window_size.cx/local_window_size.cy; if (local_multiplication_window<local_multiplication_video) { local_target_rect_final_window.left = 0; local_target_rect_final_window.right = local_window_size.cx; local_target_rect_final_window.top = local_window_size.cy/2 - 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2; local_target_rect_final_window.bottom = local_window_size.cy/2 + 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2; } else { local_target_rect_final_window.left = local_window_size.cx/2 - 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2; local_target_rect_final_window.right = local_window_size.cx/2 + 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2; local_target_rect_final_window.top = 0; local_target_rect_final_window.bottom = local_window_size.cy;

}

local_target_rect_final_bufer.left = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.left; local_target_rect_final_bufer.right = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.right; local_target_rect_final_bufer.top = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.top;

local_target_rect_final_bufer.bottom = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.bottom;

CComPtr local_source_image_final;

RECT local_source_rectangle_final; local_source_rectangle_final.left = 0; local_source_rectangle_final.right = local_view_port_size.cx; local_source_rectangle_final.top = 0; local_source_rectangle_final.bottom = local_view_port_size.cy; local_handle_result = direct_3D_device->CreateRenderTarget( local_view_port_size.cx, local_view_port_size.cy, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, // Surface is in video memory// D3DFMT_A8B8G8R8, D3DMULTISAMPLE_NONE, // Surface is in video memory 0, TRUE,

&local_source_image_final, NULL);

if(local_handle_result!=D3D_OK) { return local_handle_result; } if(local_source_image_final==NULL) { return local_handle_result;

}

RECT local_source_rectangle_stretch; local_source_rectangle_stretch.left = local_source_rectangle_final.left; local_source_rectangle_stretch.right = local_source_rectangle_final.right; local_source_rectangle_stretch.top = local_source_rectangle_final.top;

local_source_rectangle_stretch.bottom = local_source_rectangle_final.bottom - 1;

if((local_handle_result=direct_3D_device->StretchRect(gImageSrc, &srcRect_stretch, local_source_image_final, &local_source_rectangle_stretch, D3DTEXF_LINEAR))!=D3D_OK) { return local_handle_result;

}

// Stereo Blitdefines
  1. define NVSTEREO_IMAGE_SIGNATURE 0x4433564e //NV3D
typedef struct _Nv_Stereo_Image_Header { unsigned int dwSignature; unsigned int dwWidth; unsigned int dwHeight; unsigned int dwBPP; unsigned int dwFlags; } NVSTEREOIMAGEHEADER, *LPNVSTEREOIMAGEHEADER; // ORedflags in the dwFlagsfielsof the _Nv_Stereo_Image_Headerstructure above
  1. define SIH_SWAP_EYES 0x00000001
  2. define SIH_SCALE_TO_FIT 0x00000002
// Lock the stereo image D3DLOCKED_RECT lr; local_source_image_final->LockRect(&lr,NULL,0); // write stereo signature in the last raw of the stereo image LPNVSTEREOIMAGEHEADER pSIH= (LPNVSTEREOIMAGEHEADER)(((unsigned char *) lr.pBits) + (lr.Pitch* (local_source_rectangle_stretch.bottom - local_source_rectangle_stretch.top))); // Update the signature header values pSIH->dwSignature= NVSTEREO_IMAGE_SIGNATURE; pSIH->dwBPP= 32; pSIH->dwFlags= SIH_SWAP_EYES; // Src image has left on left and right on right pSIH->dwWidth= local_source_rectangle_stretch.right - local_source_rectangle_stretch.left; pSIH->dwHeight= local_source_rectangle_stretch.bottom - local_source_rectangle_stretch.top; // Unlock surface

local_source_image_final->UnlockRect();

{ if((local_handle_result=direct_3D_device->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0.0f, 0))!=D3D_OK) { return local_handle_result;

}

if((local_handle_result=direct_3D_device->BeginScene ())!=D3D_OK) { return local_handle_result; } CComPtr pDestSurface; if((local_handle_result=direct_3D_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pDestSurface))!=D3D_OK) { return local_handle_result; } if(pDestSurface) { if((local_handle_result=direct_3D_device->StretchRect(local_source_image_final, &local_source_rectangle_final, pDestSurface, &local_target_rect_final_bufer, D3DTEXF_LINEAR))!=D3D_OK) { return local_handle_result; }

}

if((local_handle_result=direct_3D_device->EndScene ())!=D3D_OK) { return local_handle_result; } if((local_handle_result=direct_3D_device->Present (NULL, NULL, NULL, NULL))!=D3D_OK) { return local_handle_result; }

}

} }

}

return S_OK;}

Функция осталась без изменений (в предудыщей версии оптимизации обнаружилась ошибка).

Какое расширение имеет файл журнала?

У меня "Intel Parallel Studio XE 2011".

По коду метода - судя по тому, что я вижу это продакшен левел код - поэтому старайтесь сразу писать проверяя все. Под этим я имею ввиду значения возвращаемые функциями WinAPI. Например функция CreateBitmap возвращает 3 значения: ERROR_INVALID_BITMAP, NULL и собственно указатель на созданную картинку. У Вас обработан только два случая.
Есть еще ляпы по коду, но суть сейчас для вас получить соптимизированный вариант Вашего цикла.Еще раз говорю, что нужна профессиональная версия компилятора (Intel® C++ Compiler Professional Edition).

Для того чтобы увидеть сообщения компилятора Вам надо указать уровень Warning 5.[img_assist|nid=844|title=Опция компилятора Intel для показывания внутренних сообщений по коду.|desc=|link=popup|align=left|width=100|height=10]

Submitted by Necro on
Я эту опцию поставил.

Это то, что выводится в окно Output?

Это:1>------ Rebuild All started: Project: StereoRenderer, Configuration: Intel release Win32 ------1>Deleting intermediate files and output files for project 'StereoRenderer', configuration 'Intel release|Win32'.1>Compiling resources... (Microsoft VC++ Environment)1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.01>1>Copyright (C) Microsoft Corporation. All rights reserved.1>1>1>Compiling with Intel(R) C++ Compiler XE 12.0.0.104 [IA-32]... (Intel C++ Environment)1>warning : could not open message catalog file: diagscUI.dll1>icl: command line remark : option '/Og' is deprecated and will be removed in a future release. See '/help deprecated'1>warning : could not open message catalog file: diagscUI.dll1>vidprop.cpp1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(92): remark : destructor for base class "CD3DApplication" (declared at line 117 of "Common\include\D3DApp.h") is not virtual1> class CMyD3DApplication : public CD3DApplication1> ^1>1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(116): warning : function "CD3DApplication::Create(HINSTANCE)" is hidden by "CMyD3DApplication::Create" -- virtual function override intended?1> HRESULT Create(HWND hWnd);1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy assignment operator for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy constructor for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy assignment operator for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy constructor for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(203): remark : destructor for base class "ISpecifyPropertyPages" (declared at line 2201 of "C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\ocidl.h") is not virtual1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy assignment operator for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy constructor for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\vidprop.h(15): remark : the declaration of the copy assignment operator for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>.\vidprop.h(15): remark : the declaration of the copy constructor for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>d3dapp.cpp1>.\Common\src\..\..\main.h(92): remark : destructor for base class "CD3DApplication" (declared at line 117 of "Common\include\D3DApp.h") is not virtual1> class CMyD3DApplication : public CD3DApplication1> ^1>1>.\Common\src\..\..\main.h(116): warning : function "CD3DApplication::Create(HINSTANCE)" is hidden by "CMyD3DApplication::Create" -- virtual function override intended?1> HRESULT Create(HWND hWnd);1> ^1>1>.\Common\src\d3dapp.cpp(885): remark : nested comment is not allowed1> }//*/1> ^1>1>.\Common\src\d3dapp.cpp(1627): remark : argument is incompatible with corresponding format string conversion1> _stprintf( strMode, _T("%ld x %ld x %ld"), pDevice->modes[m].Width,1> ^1>1>.\Common\src\d3dapp.cpp(1628): remark : argument is incompatible with corresponding format string conversion1> pDevice->modes[m].Height,1> ^1>1>.\Common\src\d3dapp.cpp(1629): remark : argument is incompatible with corresponding format string conversion1> BitDepth );1> ^1>1>.\Common\src\d3dapp.cpp(1627): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf( strMode, _T("%ld x %ld x %ld"), pDevice->modes[m].Width,1> ^1>1>.\Common\src\d3dapp.cpp(1804): remark : floating-point equality and inequality comparisons are unreliable1> if( ( 0.0f == fElapsedAppTime ) && m_bFrameMoving )1> ^1>1>.\Common\src\d3dapp.cpp(1845): remark : argument is incompatible with corresponding format string conversion1> m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height,1> ^1>1>.\Common\src\d3dapp.cpp(1845): remark : argument is incompatible with corresponding format string conversion1> m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height,1> ^1>1>.\Common\src\d3dapp.cpp(1844): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf( m_strFrameStats, _T("%.02f fps (%dx%dx%d)"), m_fFPS,1> ^1>1>.\Common\src\d3dapp.cpp(2009): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Could not initialize Direct3D. You may\n")1> ^1>1>.\Common\src\d3dapp.cpp(2018): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Could not find any compatible Direct3D\n")1> ^1>1>.\Common\src\d3dapp.cpp(2023): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("This sample cannot run in a desktop\n")1> ^1>1>.\Common\src\d3dapp.cpp(2031): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("No hardware-accelerated Direct3D devices\n")1> ^1>1>.\Common\src\d3dapp.cpp(2036): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("This sample requires functionality that is\n")1> ^1>1>.\Common\src\d3dapp.cpp(2042): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Your Direct3D hardware accelerator cannot\n")1> ^1>1>.\Common\src\d3dapp.cpp(2049): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Your Direct3D hardware accelerator cannot\n")1> ^1>1>.\Common\src\d3dapp.cpp(2057): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("This sample requires functionality that is\n")1> ^1>1>.\Common\src\d3dapp.cpp(2066): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Could not load required media." ) );1> ^1>1>.\Common\src\d3dapp.cpp(2070): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Could not reset the Direct3D device." ) );1> ^1>1>.\Common\src\d3dapp.cpp(2074): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("A D3D object has a non-zero reference\n")1> ^1>1>.\Common\src\d3dapp.cpp(2080): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Warning: Nothing will be rendered.\n")1> ^1>1>.\Common\src\d3dapp.cpp(2088): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Not enough memory.") );1> ^1>1>.\Common\src\d3dapp.cpp(2092): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Not enough video memory.") );1> ^1>1>.\Common\src\d3dapp.cpp(2096): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strMsg, _T("Generic application error. Enable\n")1> ^1>1>.\Common\src\d3dapp.cpp(2102): remark : function "strcat" (declared at line 79 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscat( strMsg, _T("\n\nThis sample will now exit.") );1> ^1>1>.\Common\src\d3dapp.cpp(2112): remark : function "strcat" (declared at line 79 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscat( strMsg, _T("\n\nSwitching to the reference rasterizer,\n")1> ^1>1>.\Common\src\d3dapp.cpp(27): remark : variable "g_pD3DApp" was set but never used1> static CD3DApplication* g_pD3DApp = NULL;1> ^1>1>d3dfile.cpp1>.\Common\src\d3dfile.cpp(28): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( m_strName, strName );1> ^1>1>.\Common\src\d3dfile.cpp(329): remark : floating-point equality and inequality comparisons are unreliable1> if( m_pMaterials[i].Diffuse.a == 1.0f )1> ^1>1>.\Common\src\d3dfile.cpp(351): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( m_strName, strName );1> ^1>1>d3dutil.cpp1>.\Common\src\d3dutil.cpp(50): warning : taking the address of a temporary1> D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &D3DXVECTOR3(x, y, z) );1> ^1>1>.\Common\src\d3dutil.cpp(140): remark : parameter "pd3dDevice" was never referenced1> HRESULT D3DUtil_CreateVertexShader( LPDIRECT3DDEVICE9 pd3dDevice, 1> ^1>1>.\Common\src\d3dutil.cpp(141): remark : parameter "pdwVertexDecl" was never referenced1> TCHAR* strFilename, DWORD* pdwVertexDecl,1> ^1>1>.\Common\src\d3dutil.cpp(142): remark : parameter "pdwVertexShader" was never referenced1> DWORD* pdwVertexShader )1> ^1>1>.\Common\src\d3dutil.cpp(230): remark : floating-point equality and inequality comparisons are unreliable1> if( sx == 0.0f && sy == 0.0f )1> ^1>1>.\Common\src\d3dutil.cpp(230): remark : floating-point equality and inequality comparisons are unreliable1> if( sx == 0.0f && sy == 0.0f )1> ^1>1>.\Common\src\d3dutil.cpp(250): warning : taking the address of a temporary1> FLOAT t = D3DXVec3Length( &(p2-p1) ) / ( 2.0f*fTrackBallRadius );1> ^1>1>.\Common\src\d3dutil.cpp(558): remark : parameter "hWnd" was never referenced1> LRESULT CD3DArcBall::HandleMouseMessages( HWND hWnd, UINT uMsg, WPARAM wParam,1> ^1>1>.\Common\src\d3dutil.cpp(646): remark : operands are evaluated in unspecified order1> SetViewParams( D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,0.0f,1.0f),1> ^1>1>.\Common\src\d3dutil.cpp(646): warning : initial value of reference to non-const must be an lvalue1> SetViewParams( D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,0.0f,1.0f),1> ^1>1>.\Common\src\d3dutil.cpp(646): warning : initial value of reference to non-const must be an lvalue1> SetViewParams( D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,0.0f,1.0f),1> ^1>1>.\Common\src\d3dutil.cpp(647): warning : initial value of reference to non-const must be an lvalue1> D3DXVECTOR3(0.0f,1.0f,0.0f) );1> ^1>1>.\Common\src\d3dutil.cpp(646): remark : operands are evaluated in unspecified order1> SetViewParams( D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,0.0f,1.0f),1> ^1>1>.\Common\src\d3dutil.cpp(667): warning : taking the address of a temporary1> D3DXVec3Normalize( &m_vView, &(m_vLookatPt - m_vEyePt) );1> ^1>1>dxutil.cpp1>.\Common\src\dxutil.cpp(46): remark : function "strcat" (declared at line 79 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscat( strPath, _T("\\Media\\") );1> ^1>1>.\Common\src\dxutil.cpp(78): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strPath, strFullPath );1> ^1>1>.\Common\src\dxutil.cpp(88): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strPath, strShortName );1> ^1>1>.\Common\src\dxutil.cpp(94): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf( strPath, _T("%s%s"), DXUtil_GetDXSDKMediaPath(), strShortName );1> ^1>1>.\Common\src\dxutil.cpp(105): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strPath, strFilename );1> ^1>

1>.\Common\src\dxutil.cpp(124): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _tcscpy( strValue, strDefault );1> ^1>1>.\Common\src\dxutil.cpp(384): remark : floating-point equality and inequality comparisons are unreliable1> if( m_fStopTime != 0.0 && command != TIMER_START && command != TIMER_GETABSOLUTETIME)1> ^1>1>.\Common\src\dxutil.cpp(517): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> strcpy( strDestination, tstrSource );1> ^1>1>.\Common\src\dxutil.cpp(521): remark : function "strncpy" (declared at line 157 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> strncpy( strDestination, tstrSource, cchDestChar );1> ^1>1>.\Common\src\dxutil.cpp(577): remark : function "strcpy" (declared at line 74 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> strcpy( tstrDestination, strSource );1> ^1>1>.\Common\src\dxutil.cpp(581): remark : function "strncpy" (declared at line 157 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h") was declared "deprecated ("This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> strncpy( tstrDestination, strSource, cchDestChar );1> ^1>1>.\Common\src\dxutil.cpp(657): remark : function "_vsnprintf" (declared at line 358 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _vsntprintf( strBuffer, 512, strMsg, args );1> ^1>1>.\Common\src\dxutil.cpp(678): remark : argument is incompatible with corresponding format string conversion1> &pGuidOut->Data1, 1> ^1>1>.\Common\src\dxutil.cpp(677): remark : function "sscanf" (declared at line 324 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> if( _stscanf( strIn, TEXT("{%8X-%4X-%4X-%2X%2X-%2X%2X%2X%2X%2X%2X}"),1> ^1>1>.\Common\src\dxutil.cpp(714): remark : argument is incompatible with corresponding format string conversion1> pGuidIn->Data1, pGuidIn->Data2, pGuidIn->Data3,1> ^1>1>.\Common\src\dxutil.cpp(713): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf( strOut, TEXT("{%0.8X-%0.4X-%0.4X-%0.2X%0.2X-%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X}"),1> ^1>1>main.cpp1>.\main.h(92): remark : destructor for base class "CD3DApplication" (declared at line 117 of "Common\include\D3DApp.h") is not virtual1> class CMyD3DApplication : public CD3DApplication1> ^1>1>.\main.h(116): warning : function "CD3DApplication::Create(HINSTANCE)" is hidden by "CMyD3DApplication::Create" -- virtual function override intended?1> HRESULT Create(HWND hWnd);1> ^1>1>.\main.cpp(16): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf(szBuffer, TEXT("File: %s, Line: %d\n"), filename, line);1> ^1>1>.\main.cpp(19): remark : function "vsprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using vsprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _vstprintf(szBuffer + lstrlen(szBuffer), szFormat, pArgs);1> ^1>1>.\main.cpp(30): remark : operands are evaluated in unspecified order1> _stprintf(szBuffer, TEXT("File: %s, Line: %d\nHRESULT: %s (%08X)\nDescription: %s"), filename, line, DXGetErrorString9(hr), hr, DXGetErrorDescription9(hr));1> ^1>1>.\main.cpp(30): remark : argument is incompatible with corresponding format string conversion1> _stprintf(szBuffer, TEXT("File: %s, Line: %d\nHRESULT: %s (%08X)\nDescription: %s"), filename, line, DXGetErrorString9(hr), hr, DXGetErrorDescription9(hr));1> ^1>1>.\main.cpp(30): remark : operands are evaluated in unspecified order1> _stprintf(szBuffer, TEXT("File: %s, Line: %d\nHRESULT: %s (%08X)\nDescription: %s"), filename, line, DXGetErrorString9(hr), hr, DXGetErrorDescription9(hr));1> ^1>1>.\main.cpp(30): remark : function "sprintf" (declared at line 366 of "c:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h") was declared "deprecated ("This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.") "1> _stprintf(szBuffer, TEXT("File: %s, Line: %d\nHRESULT: %s (%08X)\nDescription: %s"), filename, line, DXGetErrorString9(hr), hr, DXGetErrorDescription9(hr));1> ^1>1>.\main.cpp(181): remark : nested comment is not allowed1> /*/1> ^1>1>StereoRenderer.cpp1>.\vidprop.h(15): remark : the declaration of the copy assignment operator for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>.\vidprop.h(15): remark : the declaration of the copy constructor for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(92): remark : destructor for base class "CD3DApplication" (declared at line 117 of "Common\include\D3DApp.h") is not virtual1> class CMyD3DApplication : public CD3DApplication1> ^1>1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(116): warning : function "CD3DApplication::Create(HINSTANCE)" is hidden by "CMyD3DApplication::Create" -- virtual function override intended?1> HRESULT Create(HWND hWnd);1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy assignment operator for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy constructor for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy assignment operator for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy constructor for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(203): remark : destructor for base class "ISpecifyPropertyPages" (declared at line 2201 of "C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\ocidl.h") is not virtual1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy assignment operator for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy constructor for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.cpp(737): remark : nested comment is not allowed1> /*//*/1> ^1>1>.\StereoRenderer.cpp(783): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.top = local_window_size.cy/2 - 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;1> ^1>1>.\StereoRenderer.cpp(784): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.bottom = local_window_size.cy/2 + 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;1> ^1>1>.\StereoRenderer.cpp(788): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.left = local_window_size.cx/2 - 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;1> ^1>1>.\StereoRenderer.cpp(789): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.right = local_window_size.cx/2 + 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;1> ^1>1>.\StereoRenderer.cpp(808): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.left = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.left;1> ^1>1>.\StereoRenderer.cpp(809): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.right = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.right;1> ^1>1>.\StereoRenderer.cpp(810): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.top = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.top;1> ^1>1>.\StereoRenderer.cpp(811): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.bottom = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.bottom;1> ^1>1>.\StereoRenderer.cpp(818): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_source_rectangle_final.right = local_view_port_size.cx*2*ratio_x;1> ^1>1>.\StereoRenderer.cpp(820): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_source_rectangle_final.bottom = local_view_port_size.cy*ratio_y;1> ^1>1>.\StereoRenderer.cpp(823): remark : non-pointer conversion from "double" to "UINT={unsigned int}" may lose significant bits1> local_view_port_size.cx*2*ratio_x,1> ^1>1>.\StereoRenderer.cpp(824): remark : non-pointer conversion from "double" to "UINT={unsigned int}" may lose significant bits1> local_view_port_size.cy*ratio_y,1> ^1>1>.\StereoRenderer.cpp(846): remark : operands are evaluated in unspecified order1> if((local_handle_result=direct_3D_device->StretchRect(gImageSrc, &srcRect_stretch, local_source_image_final, &local_source_rectangle_stretch, D3DTEXF_LINEAR))!=D3D_OK)1> ^1>1>.\StereoRenderer.cpp(899): remark : operands are evaluated in unspecified order1> if((local_handle_result=direct_3D_device->StretchRect(local_source_image_final, &local_source_rectangle_final, pDestSurface, &local_target_rect_final_bufer, D3DTEXF_LINEAR))!=D3D_OK)1> ^1>1>.\StereoRenderer.cpp(916): remark : nested comment is not allowed1> /*//*/1> ^1>1>.\StereoRenderer.cpp(961): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.top = local_window_size.cy/2 - 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;1> ^1>1>.\StereoRenderer.cpp(962): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.bottom = local_window_size.cy/2 + 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;1> ^1>1>.\StereoRenderer.cpp(966): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.left = local_window_size.cx/2 - 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;1> ^1>1>.\StereoRenderer.cpp(967): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_window.right = local_window_size.cx/2 + 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;1> ^1>1>.\StereoRenderer.cpp(972): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.left = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.left;1> ^1>1>.\StereoRenderer.cpp(973): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.right = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.right;1> ^1>1>.\StereoRenderer.cpp(974): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.top = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.top;1> ^1>1>.\StereoRenderer.cpp(975): remark : non-pointer conversion from "double" to "LONG={long}" may lose significant bits1> local_target_rect_final_bufer.bottom = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.bottom;1> ^1>1>.\StereoRenderer.cpp(1010): remark : operands are evaluated in unspecified order1> if((local_handle_result=direct_3D_device->StretchRect(gImageSrc, &srcRect_stretch, local_source_image_final, &local_source_rectangle_stretch, D3DTEXF_LINEAR))!=D3D_OK)1> ^1>1>.\StereoRenderer.cpp(1063): remark : operands are evaluated in unspecified order1> if((local_handle_result=direct_3D_device->StretchRect(local_source_image_final, &local_source_rectangle_final, pDestSurface, &local_target_rect_final_bufer, D3DTEXF_LINEAR))!=D3D_OK)1> ^1>1>.\StereoRenderer.cpp(608): remark : variable "lDataLen" was set but never used1> long lDataLen; // Holds length of any given sample1> ^1>1>.\StereoRenderer.cpp(622): remark : variable "cbImage" was set but never used1> int cbImage = cyImage * cxImage * iPixelSize;1> ^1>1>.\StereoRenderer.cpp(623): remark : variable "numPixels" was set but never used1> int numPixels = cxImage * cyImage;1> ^1>1>videotxt.cpp1>.\vidprop.h(15): remark : the declaration of the copy assignment operator for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>.\vidprop.h(15): remark : the declaration of the copy constructor for "CQualityProperties" has been suppressed because that of "CBasePropertyPage" was suppressed1> class CQualityProperties : public CBasePropertyPage1> ^1>1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(92): remark : destructor for base class "CD3DApplication" (declared at line 117 of "Common\include\D3DApp.h") is not virtual1> class CMyD3DApplication : public CD3DApplication1> ^1>1>C:\Depot\3D Stereo\Stereo Renderer LR\main.h(116): warning : function "CD3DApplication::Create(HINSTANCE)" is hidden by "CMyD3DApplication::Create" -- virtual function override intended?1> HRESULT Create(HWND hWnd);1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy assignment operator for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(41): remark : the declaration of the copy constructor for "CVideoText" has been suppressed because that of "CBaseControlWindow" was suppressed1> class CVideoText : public CBaseControlWindow, public CBaseControlVideo1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy assignment operator for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(110): remark : the declaration of the copy constructor for "CVideoInputPin" has been suppressed because that of "CRendererInputPin" was suppressed1> class CVideoInputPin : public CRendererInputPin, public IPinConnection1> ^1>1>.\StereoRenderer.h(203): remark : destructor for base class "ISpecifyPropertyPages" (declared at line 2201 of "C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\ocidl.h") is not virtual1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy assignment operator for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\StereoRenderer.h(203): remark : the declaration of the copy constructor for "CVideoRenderer" has been suppressed because that of "CVideoInputPin" was suppressed1> class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer1> ^1>1>.\videotxt.cpp(39): remark : the initialization of class "CBaseControlWindow" will be done before that of class "CBaseControlVideo"1> CBaseControlWindow(pRenderer,pInterfaceLock,pName,pUnk,phr),1> ^1>1>.\videotxt.cpp(173): remark : nested comment is not allowed1> /*ExtTextOut((HDC) hdc, // Target device context1> ^1>1>Linking... (Intel C++ Environment)1>xilink: executing 'link'1> Creating library .\Intel Release/StereoRendererLR.lib and object .\Intel Release/StereoRendererLR.exp1>d3dapp.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>main.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>StereoRenderer.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>videotxt.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>vidprop.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>msvcrtd.lib(cpu_disp.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators1>Embedding manifest... (Microsoft VC++ Environment)1>Build log was saved at "file://C:\Depot\3D Stereo\Stereo Renderer LR\Intel release\BuildLog.htm"1>StereoRenderer - 0 error(s), 17 warning(s), 127 remark(s)
==== Rebuild All: 1 succeeded, 0 failed, 0 skipped ====

Что значит "Production level cod"?

Вот результат оптимизации:Module Name 64-bit Timer samples intelppm.sys 31.6 ntkrnlpa.exe 19.47 msyuv.dll 8.44 MP4SDECD.DLL 7.42 msvcr90d.dll 7.07 StereoRendererLR.ax 4.23 win32k.sys 3.27 nvlddmkm.sys 2.46 halmacpi.dll 1.93

unknown module pid (3524) 1.29

10 modules, Total: 86908 samples, 87.19% of shown samples

Скорость выполнения цикла увеличена в 2.5 раза :DWORD *local_bit_map_buffer = NULL;

local_bit_map_buffer = new DWORD[cxImage*cyImage];

DWORD *local_result_color = 0;

int local_counter = 0;

int local_bit_map_counter = 0;

for(int local_counter_width=0;local_counter_width<cxImage;local_counter_width++) { for(int local_counter_height=0;local_counter_height<cyImage;local_counter_height++) { local_counter = local_counter_width+local_counter_height*cxImage; local_bit_map_counter = local_counter_width+(cyImage-(local_counter_height+1))*cxImage;

local_result_color = &local_bit_map_buffer[local_bit_map_counter];

*local_result_color = 0; memcpy(local_result_color,&prgb[local_counter],3); }

}

HBITMAP handle_bit_map = NULL; handle_bit_map = CreateBitmap( cxImage, cyImage, 1, 32, local_bit_map_buffer); delete []local_bit_map_buffer;

Почему такая большая загрузка ядра Windows и драйвера Intel процессора?1.Module Name 64-bit Timer samples 2.intelppm.sys 31.6 3.ntkrnlpa.exe 19.47

Переделал свой directshow фильтр для работы с 32 битными изображениями (а не 24 битными):const AMOVIESETUP_MEDIATYPE sudPinTypes[] ={ // ***// { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 }, { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 }, //{ &MEDIATYPE_Video, &MEDIASUBTYPE_ARGB32 },};

Получил выигрыш в скорости за счёт того, что данные выровнены по границе двойного слова в памяти (4 байта):Module Name 64-bit Timer samples intelppm.sys 32.47 ntkrnlpa.exe 20.65 msyuv.dll 8.51 msvcr90d.dll 8.28 MP4SDECD.DLL 7.4 win32k.sys 3.47 nvlddmkm.sys 2.63 StereoRendererLR.ax 2.62 halmacpi.dll 2.1 unknown module pid (3524) 1.24 msvcr90.dll 1.01

dsound.dll 0.82

12 modules, Total: 91239 samples, 91.19% of shown samples

Я рад что у Вас получилось и теперь Вы наверное согласитесь со мной что реальный потенциал процессоров от интел очень высокий.
Дальше - больше вы можете использовать примитивы IPP для своих операций. У вас она должна быть в папке установки компилятора.Эти примитивы (методы) позволяют с феноменальной скоростью проводить операции над изображениями и другие операции.
Т. е. используя их вместо стандартных функций Вы сможите перейти на новый уровень производительности.По некоторым операциям удается получить ускорение на порядок относительно стандартных методов.

Ну и самый главный минус тут - это процессороориентированная оптимиация (грубо товарищи у кого AMD просто не смогут запустить Ваше приложение).

Submitted by Necro on
Из того, что я вижу необходимым для оптимизации, это функция BitBlt (слишком много параметров (нужно скопировать 1 в 1, а нужно указывать область)).Пока от процессора ничего не зависит. Увеличение быстродействия цикла - моя заслуга.Окончательный вариант цикла: DWORD *local_bit_map_buffer = NULL;

local_bit_map_buffer = new DWORD[cxImage*cyImage];

DWORD *local_result_color = 0;

int local_counter = 0;

int local_bit_map_counter = 0;

for(int local_counter_width=0;local_counter_width<cxImage;local_counter_width++) { for(int local_counter_height=0;local_counter_height<cyImage;local_counter_height++) { local_counter = local_counter_width+local_counter_height*cxImage; local_bit_map_counter = local_counter_width+(cyImage-(local_counter_height+1))*cxImage;

local_result_color = &local_bit_map_buffer[local_bit_map_counter];

memcpy(local_result_color,&prgb[local_counter],4); }

}

HBITMAP handle_bit_map = NULL;

handle_bit_map = CreateBitmap( cxImage, cyImage, 1, 32, local_bit_map_buffer); delete []local_bit_map_buffer;

Чем можно заменить BitBlt?

Одоно из функций копирования IPP. Смотрите в мануале по библиотеке. (http://software.intel.com/sites/products/documentation/hpc/ipp/pdf/ippmman.pdf начиная с 63 страницы). Там есть и примеры. Данные придется привести к типам IPP.

Submitted by Necro on
Quote:
Kozlov_Sergey писал(а):
Увеличение быстродействия цикла - моя заслуга.
в чём? где?
Submitted by MaxImuS on

Я при тестировании убрал цикл и загрузку в поверхность - получилось 23 кадра в секунду. Если убрать цикл, то получается 13 кадров в секунду. Если убрать загрузку в поверхность, то получается 12 кадров в секунду. Цикл нужен для переворачивания изображения перед загрузкой в HBITMAP для загрузки в поверхность. Должно быть 24 кадра в секунду. Получается, что нужен быстрый способ загрузки в поверхность (без BitBlt и предварительной обработки изображения). Как мне может помоч IPP, пока не знаю, потому что там нужны массивы данных, а HDC и HBITMAP к ним доступ напрямую не предоставляют (с HBITMAP можно получить данные: они могут быть скопированы). Значит всё время тратится на работу с памятью, а профилировщик показывает, что это загрузка ядра Windows. То есть нужно исходные данные с помощью IPP записавать напрямую в поверхность без преобразований (если данные имеют нужную структуру и это возможно). Правильно?

Твой "цикл", вроде, переворачивает по-пиксельно изображение?! Тебе что-то мешает это делать построчно? Not i ведь твое изоброжение всеголишь содержит строки изображения в обратном порядке и для этого достаточно инверсить строки целиком. Ты уже на данной операции выйграешь кучу тактов. А в остальное вникать лень, потомучто пишешь муторно, слитно, куча лишнего кода в примерах (учись выбирать сам нужные участки - смотришь, сам дойдешь до решения).

Submitted by MaxImuS on
Переворачивание изображения (последний вариант): for(int local_counter_height=0;local_counter_height<cyImage;local_counter_height++) { memcpy(&local_bit_map_buffer[(cyImage-1-local_counter_height)*cxImage],&prgb[local_counter_height*cxImage],sizeof(RGBQUAD)*cxImage); }

13 кадров в секунду (раньше было 9-10). Выигрыш в среднем 3-4 кадра в секунду на весь ролик.

Тебе что, "религия" не позволяет вместо твоего local_counter_height написать dy??? так же понятнее и чатать удобнее
С пробелами ты тоже не дружишь я смотрю.
Совет - инкремент используй левосторонний!!! для увеличения индекса.
const int real_height = cyImage - 1;const int size_width = sizeof(RGBQUAD) * cxImage;for(int dy = 0; dy < cyImage; ++dy){ memcpy(&local_bit_map_buffer[(real_height - dy) * cxImage], &prgb[dy * cxImage], size_width);}

Submitted by MaxImuS on
BitBlt выкидавыешь нах - подгатавливаешь в озу массив данных картинки и за один lock/unlock копишь его поверхность - как упоминалось выше, это не оптимальный вариант, но всеже будет быстрее чем каждый раз создавать контекст.

Плюс для уж полной оптимизации - если разиеры изображения кратный степени двойки, то операцию умножения можно заменить битовым сдвигом.

Submitted by MaxImuS on

Осталось ещё в 2.5 раза увеличить быстродействие.

Я так и сделал (сам вспомнил).Вот загрузка данных с буфера медиа сампла в буфер поверхности.{ D3DLOCKED_RECT local_locked_rectangle; local_handle_result = gImageSrc->LockRect(&local_locked_rectangle,NULL,0); if (local_handle_result!=D3D_OK) { return E_FAIL;

}

DWORD* local_image_data = (DWORD*)local_locked_rectangle.pBits;

for(int local_counter_height_surface = 0;local_counter_height_surface < cyImage; local_counter_height_surface++) { memcpy(&local_image_data[local_counter_height_surface*local_locked_rectangle.Pitch / 4], &prgb[(cyImage-1-local_counter_height_surface)*cxImage], cxImage*sizeof(DWORD));

}

local_handle_result = gImageSrc->UnlockRect(); if (local_handle_result!=D3D_OK) { return E_FAIL; } }Итог: 23.76 кадра в секунду (должно быть 24).

Загрузка процессора всё равно в 2.5 раза больше чем при использовании австрийской программы.

Длинные имена переменных с принятыми префиксами - это очень удобно.Если 3000 файлов (cpp,h,idl), то гораздо быстрее разобраться, как работает программа просто следя за осмыслеными названиями переменных и классов.

Такая религия.

Ты вобще внимательно смотрел тот кусочек кода который я тебе привел?

Ты паришься с оптимизацией о нагрузке на проц, а сам пишешь такую бурду и думаешь, что чудо-компилятор какой-нибудь тебя спасет.

Бонально, нах тебе расчитывать на каждой итерации цикла cxImage*sizeof(DWORD)??? вот объясни. Не проще ли все это высчитать один раз перед циклом и засунуть в константу?! или ты думаешь, что пока ты копишь эти данные изменятся? (cyImage-1 в туже копилку)

[local_counter_height_surface*local_locked_rectangle.Pitch / 4] - и ты говоришь об оптимизации? => [(dy * pitch) >> 2]
Ещё как вариант можешь попробовать заменить [&local_image_data[local_counter_height_surface*local_locked_rectangle.Pitch / 4] на такую форму записи local_image_data + (dy*pitch) >> 2

и еще раз повторю: вместо local_counter_height_surface++ пишешь ++local_counter_height_surface

Submitted by MaxImuS on
То, что ты предложил, называется низкоуровневой оптимизацией и делается когда всё возможное уже сделано (алгоритм, используемые функции).

Я сделал то, что ты предложил. Это дало 0.05 кадра в секунду увеличения быстродействия.

В то время как использование блочной обработки информации (использование функции memcpy) даёт больший выигрый в быстродействии.

Поэтому мне сейчас важнее более высокоуровневые вещи.

Я так понимаю, что StretchRect не заменить.Я выяснил, что теперь большую чать времени выполняется работа с поверхностями.

Что ещё можно сделать?

GameDev.by