Seite 2 von 2

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 17:35
von ut53xuco
Hast du mal ein paar andere Pixel verglichen?
Ich glaube dass der erste Filter nicht so viel verändert.

Sonst schreib dir doch mal selber ein paar Werte und schau dir an ob dein Programm da das macht was es soll.

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 19:12
von jokke
Kurze frage: Ist es möglich einen einzelnen float wert aus einem xmm register in ein "normales" register (z.B. eax) zu befördern, und wenn ja, wie?

Oder einen einzelnen float wert direkt an eine speicheraddresse befördern.

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 19:26
von mw1039
ut53xuco hat geschrieben:Ich glaube dass der erste Filter nicht so viel verändert.
Genau. Der eine Filter leitet das Bild in die eine Richtung ab und der andere Filter glaettet das Bild senkrecht zur Ableitungsrichtung. Wenn du nur den Glaettungsfilter \((0.25, 0.5, 0.25)\) anwendest, veraendert das die Pixelwerte nicht sehr. Der Ableitungsfilter ist der wesentlich wichtigere.

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 20:22
von jokke
jokke hat geschrieben:Kurze frage: Ist es möglich einen einzelnen float wert aus einem xmm register in ein "normales" register (z.B. eax) zu befördern, und wenn ja, wie?

Oder einen einzelnen float wert direkt an eine speicheraddresse befördern.
bump

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 21:39
von jokke
Oh mann, ich werds bestimmt nicht mehr schaffen.. Jetzt bekomme ich einen segfault beim zweiten durchlauf einer schleife in der der horizontalen filter angewandt wird.

die der segfault kommt in dieser Zeile:
"movaps (%%esi), %%xmm0\n"

in esi steht der Pointer von einem float array, indem ein "zwischenergebnissbild" gespeichert wird.
Vor dem Ende der Schleife wird esi um 4 (für float) erhöht. Sonst wird esi nicht angerührt..

Ausserdem brauch ich unbedingt eine möglichkeit um einen der 4 floats eines xmm registers in ein normales register oder eine speicheradresse zu schreiben..

EDIT: Aus Fehlern sollte man lernen.. Es lag wieder an movaps. Mit movups gings. Trotzdem komisch, weil das array mit float* fx_data_1 = (float*)malloc_aligned(...); ja eigentlich aligned sein sollte..

Jetzt fehlt mir nur noch das "extrahieren" eines einzelnen floats aus einem xmm register, dann sollte es klappen.. theoretisch..

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 21:52
von simon.r
movaps erwartet, dass die Adresse auf 16 aligned ist. Da du aber beim horizontalen Filter jeweils nur 4 und keine 16 aufaddierst, ist deine Adresse in esi nach dem ersten Durchlauf nicht mehr aligned. Dieses Problem kannst du lösen, indem du für diese Schleife movups benutzt.
Den ersten Float kann man mittels movss in den Speicher schreiben bzw. vom Speicher laden.

Re: Schwarzes Bild

Verfasst: 30. Nov 2011 22:16
von jokke
Wow cool.. Mein asm sobel läuft! Bekomme ich punktabzug, wenn ich einen rand habe, also nicht extra auf 0 setze.. Ich hab nämlich keinen register frei um die bildbreite zu speichern und dann mit divisionsrest zu prüfen, ob ich am anfang, oder ende einer Zeile bin.

EDIT: Oh mann.. Zu früh gefreut. Beim hauptgebäude bekomm ich einen segfault. Er zeigt aber trotzdem die ticks an..? Bild lässt sich nicht mit einem bildbetrachter öffnen..
Hachiko geht aber auch. Nur eben mit (nicht schwarzem) rand links und rechts..